Concours de référencement en cours : Trikapalanet.

Accueil du site > Le Geek Lab > Design sous Spip

Design sous Spip | Booster ses CSS avec les mots clés

samedi 14 février 2009, par Loiseau2nuit
Mis jour le 15 février 2009

Ce que je vous propose aujourd’hui ne révolutionne en rien l’eau chaude, qu’on se le dise. Ceci est juste une des X millions d’applications possibles du système de mots-clés de Spip.

Dans les exemples qui vont suivre, l’on va se servir d’un groupe de mot-clés (techniques si vous avez le plugin qui va bien… ou pas !) pour agrémenter significativement vos possibilités de design CSS sur vos pages, vos menus, and so on

Et le plus fort dans tout ce cirque, c’est que ca fonctionne pour toutes les versions de spip ayant introduit le système de mot-clés. Elle est pas belle la vie ??? :-P

Prérequis :

Le concept

L’idée de base est inspirée d’un article publié par ARNO* sur son site Paris-Beyrouth, dans lequel il explique que le système de plugins, introduit par Spip 1.9, c’est bien, mais que trop de plugins, tue le plugin. Si vous voulez éviter de transformer votre site en grosse usine à gaz, parfois mieux vaut reconsidérer ses besoins en fonctionnalités additionnelles, et réfléchir pour chacune d’entre elles, si une solution alternative au plugin n’est pas envisageable (Enfin ca c’est ce qu’il dit, ENTRE AUTRE !)

Pour ma part, il s’agissait de pouvoir gérer plusieurs thèmes graphiques pour ce site, en fonction du secteur où l’on se trouvait. La question s’est bien évidement posée d’installer un des nombreux plugins de gestion de thèmes disponibles sur Spip-contrib afin de créer ces univers graphiques, MAIS l’expérience précédente de telles solutions m’a déjà montré les écueils d’instabilité que cela pouvait engendrer, à plus forte raison sur un site dont la vocation première est de tester toutes les bidouilles du moment parmi celles qui pourraient me servir un jour.

De plus, l’intérêt de Spip étant justement cette séparation qu’il offre nativement, du core et de l’esprit et des templates, je trouvais dommage d’enquiquiner le core avec moultes surcharges et dérivations, pour lui faire faire un job qui finalement ne prendrait qu’une ligne de boucle ou deux bien placées dans un squelette natif.

J’ai donc réfléchis un peu et j’ai finis par trouver un moyen d’adjoindre en 2 clics à un objet Spip (Article, rurbique, sites …) un à plusieurs nouveaux sélecteurs CSS !

Le principe

"Mais Jean Pierre, quelle est donc cette merveilleuse fonctionnalité que vous nous proposez aujourd’hui ?"

Et bien Maryse, sachez que le principe de base est déjà disponible par défaut dans les squelettes de la dist fournie en standard avec SPIP. Je l’ai juste un peu étendu sur la base d’une option découverte dans un autre CMS [1].

Si vous décortiquez un peu vos templates (ou squelettes) html, vous pouvez déjà constater que ceux-ci prévoient une class CSS pour le body de chaque objet : page_sommaire, page_rubrique, page_article, .... Ceci vous permet déjà, dans une certaine mesure de styler selon vos gouts ces pages là et de conditionner l’affichage de certains de leurs éléments à l’écran.

Là, il est question d’aller ENCORE plus loin et de donner aux designers la possibilité de créer jusqu’à autant de class CSS pour leur body, qu’il y a d’articles ou de rubriques publiées dans un site ! Et oui !

Mais Pourquoi Jean-Pierre ?

Mais Maryse, pour pouvoir styler chacun d’entre eux à convenance et conditionner des éléments un peu moins généralistes que ceux présent par défaut dans les squelettes de Spip bien-sûr ! Il se peut que votre site publie à l’occasion des articles qui sortent un peu du cadre, ou bien que vous désiriez étendre un poil les affichages graphiques de vos rubriques. Par exemple, ajouter un bandeau graphique EN PLUS du traditionnel #LOGO_RUBRIQUE de Spip ? Possible ?

Et bien oui ! Alors étudions ensemble…

…La méthode !!!

Le body, l’incontournable grâce à qui tout devient possible !

Lorsqu’il s’agit de façonner une page dans ses grandes lignes, il convient en général de s’attaquer directement à la source de celle-ci. Pour un document XHTML, c’est donc le body, point de départ du document, qui sera l’objet de notre choix.

Le but de cet exercice (si j’ose m’exprimer ainsi) sera d’y ajouter des class CSS persos de manière totalement dynamique en utilisant des mot-clés SPIP à vocation techniques.

Créer les mot-clés

Nous allons commencer par créer un groupe de mot-clés, appelons le "_css_class" [2]

Ajoutons-y maintenant autant de mot-clés que nous souhaitons créer de class (par exemple, une class par secteur, ou une class spécifique à la rédaction d’un article). Attention tout de même à la syntaxe : pas de majuscule, pas d’accent, pas d’espace, juste du alpha-numérique et éventuellement du underscore [3] :

  • ma_class_css
  • ma_seconde_class_css
  • and so on…

Si vous utilisez la "configuration avancée des groupes de mot-clés", cochez les objets (articles, rubriques, sites, …) auxquels vous souhaitez que s’appliquent vos nouvelles class et, conseil d’ami : restreignez leur usage aux seuls administrateurs, ça évitera les "Kwak" [4].

Cochez le "label technqiue" si le plugin qui va bien est activé et hop, le tour est joué !

Voilà, ça, c’est fait ! Je ne vous fais pas de dessin ;-)

La boucle

Pour associer la nouvelle class CSS au body de votre objet SPIP, il suffira ensuite d’une simple boucle dans vos squelettes, au niveau du tag <body>.

Exemple pour le squelette rubrique.html

par défaut, le tag body se présente comme suit :

<body class="page_rubrique">

Nous ajoutons donc la boucle comme suit :

  1. <body class="page_rubrique
  2.     <BOUCLE_body_class(MOTS) {id_rubrique} {id_groupe=11} {" "}>
  3.         #TITRE
  4.      </BOUCLE_body_class>
  5. ">
  • {id_rubrique}

pour récupérer le contexte

  • {id_groupe = 11}

correspond à l’idée du groupe de mot "_class_css", remplacez 11 par votre propre numéro de groupe

  • {" "}

joue ici le rôle de séparateur entre tous vos mot-clés (oui, cette boucle vous permet si vous le désirez d’ajouter plusieurs class. A vous après de ne pas vous emmêler les pinceaux dans votre feuille de style)

Note pour la suite : Tel quel, si vous recopiez cette boucle dans votre squelette article.html, vous conditionnerez vos article pour répondre aux même class que leur rubrique d’origine. Cela ne vous empèchera pas d’ajouter vos propres class à vos articles par la suite mais il faudra alors créer une nouvelle version de la boucle avec
{id_article}

à la place de

{id_rubrique}
La feuille de style

Bon, je pense que si vous lisez ce topo c’est que vous savez manipuler les feuilles de style mais à tout hasard…

Admettons que vous veniez de créer le mot-clé ma_class_css, et que vous ayez installé la boucle, ensuite il convient naturellement de l’exploiter dans vos feuilles de styles.

  1. body.ma_class_css {
  2.   <vos déclaration ici>
  3. }
  4. .ma_class_css #contenu {
  5.   <vos déclaration ici>
  6. }
  7. etc...

Voila, c’est aussi simple que cela :-)

Woaw ! C’est cool ! Mais est-ce que ça marche aussi pour les menus ?

Tout à fait Maryse ! Sur le même principe que celui exposé plus haut, vous pouvez tout à fait adapter cette boucle à un tag <li> afin d’obtenir des listes à puce, dont chaque entrée pourra alors avoir un style bien à elle :

  1. <ul>
  2. <li class="accueil"><a href="/" title="<:retour_accueil:>"><span><:retour_accueil:></span></a></li>
  3. <BOUCLE_top_menu(RUBRIQUES) {racine} {par num titre, titre}>
  4. <li class="menu <BOUCLE_li_class(MOTS) {id_rubrique} {id_groupe=11} {" "}>#TITRE</BOUCLE_li_class> [(#EXPOSE)]">
  5. <a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]><span>[(#TITRE|couper{80})]</span></a>
  6. </li>
  7. </BOUCLE_top_menu>
  8. </ul>

Ce code récupère donc pour chaque entrée li le mot-clé _css_class attribué aux rubriques du site, générant ainsi le HTML suivant, côté navigateur, lors du calcul de la page :

  1. <ul>
  2. <li class="accueil"><a href="/" title="Revenir en page d'accueil"><span>Accueil</span></a></li>
  3. <!-- puis les rubriques de premier niveau -->
  4. <li class="menu ma_class_css"><a href="/mon-blog"><span>Mon blog</span></a></li>
  5. <li class="menu ma_seconde_class_css"><a href="/mon-cv"><span>Mon CV</span></a></li>
  6. ... and so on....
  7. </ul>

Génial ! J’en veux encore plus !!! Parce que moi j’suis un ouf !!!

Maryse, vous êtes une petite gourmande, vous alors ! Vous passerez sous mon bureau… me voir en fin d’émission s’il vous plait…

Alors soit ! Admettons que vous ayez créé une class de cette manière, et que vous l’ayez attribué à plusieurs objets de SPIP. Or là, vous vous rendez compte que sur les 5 éléments de class .ma_class_css, il vous faille une personnalisation que ne prévoit pas cette class sur un seul de ces éléments.

Là, 2 possibilités :

  1. Si vous avez paramétré votre groupe de mot-clés pour que l’on puisse en attribuer plusieurs au même élément, vous créez un nouveau mot clé et le tour est joué.
  2. Si à tout hasard, en configurant le groupe de mot-clé, vous avez coché l’option "On ne peut sélectionner qu’un seul mot-clé à la fois dans ce groupe.", alors là ça se complique un peu mais une solution existe. Nous allons créer un id CSS en utilisant le numéro SPIP de l’élément

exemple sur l’article n°500

Prenons le squelette article.html. Afin de fonctionner correctement, le code de chaque squelette Spip est encadré par ce qu’on appelle une boucle principale dont le rôle est de récupérer le contexte environnemental de l’objet (ID de l’article notamment …) :

<BOUCLE_principale(ARTICLES) {id_article}>

afin que les éléments qui vont s’afficher sur la page soient cohérents par rapport à l’article demandé.

Là, nous allons donc simplement recoder légèrement le <body> de ce squelette article.html pour exploiter l’ID de l’article affiché.

Au départ, dans le squelette, il se présente donc comme suit :

  1. <body class="page_rubrique
  2. <BOUCLE_body_class(MOTS) {id_rubrique} {id_groupe=11} {" "}>
  3. #TITRE
  4. </BOUCLE_body_class>
  5. ">

Ajoutons lui donc un nouveau sélecteur plus ponctuel et qui ne servira pas ailleurs, j’ai nommé l’ID :

  1. <body class="page_rubrique
  2. <BOUCLE_body_class(MOTS) {id_rubrique} {id_groupe=11} {" "}>
  3. #TITRE
  4. </BOUCLE_body_class>
  5. " id="mon_id_css_#ID_ARTICLE">

Et bien, vous me croirez ou pas, mais ce n’est pas plus compliqué que cela !

Le html généré côté navigateur au calcul de l’article numéro 500 aura alors cette allure :

  1. <body class="page_rubrique ma_class_css ma_deuxieme_class_css  ..." id="mon_id_css_500">

Et vous voila désormais en medure de créer si vous en avez envie autant de feuille de style que vous avez d’article publié dans Spip !

Conclusion

Vous voila maintenant avec un site stylable au doigt et à l’oeil, et ce, sans avoir installé le moindre plugin !!! Fort, non ?

Bon… bien évidement, plus vous en ajoutez et plus le risque est grand de transformer votre site en usine d’instabilité graphique si vous faites n’importe quoi avec ce que je viens de vous donner. Notament le tuyau sur les ID, c’est bien mais quand vous publiez 10 articles / jour, vous n’allez pas vous amusez à créer systématiquement une feuilles de style pour aller avec, sinon vous allez finir par vous perdre, et abandonnerez votre site avec votre santé mentale.

Mais pour quelques publication de type évènementielle, ça peut toujours servir.

Ensuite, comme je vous le disais, cette contrib ne réinvente pas l’eau chaude. Elle est d’une extrême simplicité et les plus terre-à-terre diront "d’une évidence logique à toute épreuve !!!"
OUI MAIS il fallait y penser !

Et j’ai beau utiliser SPIP depuis plusieurs années, c’est là une affaire de philosophie de son utilisation : issue des petites trouvailles, partagées ça et là par tout un chacun dans la communauté, et qui font que Spip avance depuis tant d’années déjà.

Alors puisse ce morceaux de retour d’expérience vous servir comme il m’a servis et a révolutionné mon utilisation de ce merveilleux outil.

Au revoir Maryse ;-)

PS : bien évidement, je ne prétend pas avoir la science infuse et tout feedback sera le bienvenu !!!

Notes

[1] Autre CMS que je ne citerai pas car c’est une solution propriétaire, utilisée dans le cadre d’un de mes précédents postes en agence

[2] Vous pouvez lui donner un nom un peu moins exotique si vous utilisez le plugin de "mots-clés technqiues", pour ma part, faire précéder mes groupes de mot-clés d’un underscore me permet de les "ranger" en bas de liste sur la page d’édition des mot-clés. Et la syntaxe de nommage sans espace dans le nom du groupe permet de limiter les erreurs à la validation XHTML de vos pages.

[3] à préférer de loin aux tiret standards type "Dash" sinon vous pouvez être sûr que ca va cafouiller avec los opérateurs logiques utilisé dans vos javascripts !!!

[4] Toute ressemblance avec la marque d’une excellente bière Belge est purement fortuite bien sûr, qu’alliez vous croire là !!


poster commentaire

Site web personnel et (plus ou moins) professionnel d’Etienne Brackers aka Loiseau2nuit.

Webdesigner, musique-addict, rôliste, geek (un peu), atypique, … et assimilé !

En savoir plus sur l’auteur