GÉRER PLUSIEURS SQUELETTES SELON N
GÉRER PLUSIEURS SQUELETTES SELON N'IMPORTE QUEL CRITÈRE
Techniques SPIP

Vous trouverez ici des trucs et astuces destinés aux développeurs de sites sous SPIP.

La majorité de ces trucs est consacrée aux filtres graphiques introduits dans SPIP 1.9. Il y a là en effet un vaste champ d’expérimentation pour les webmestres et les graphistes.

Chaque truc est suivi d’un forum auquel nous vous invitons à participer.

N.B. La présence de ces trucs et astuces sur notre site professionnel est destinée à faire connaître notre activité de création de sites sous SPIP. Vous pouvez librement utiliser les morceaux de code fournis ici dans vos propres squelettes. Vous pouvez reprendre ces exemples sur votre site ou dans les forums d’un autre site ; dans ce cas, nous vous demandons simplement d’avoir la courtoisie de référencer la page d’où est tiré le code repris.

XML

Il est (très) souvent nécessaire, dans un même site Web, de pouvoir utiliser des squelettes différents pour, disons, les rubriques : certaines rubriques ont telle présentation, d’autres telle autre maquette.

La méthode la plus simple consiste à utiliser le système de nommage des squelettes en fonction de la structure du site :
— rubrique.html par défaut,
— rubrique-6.html pour la rubrique 6 et ses sous-rubriques,
— rubrique=12.html pour la rubrique 12 uniquement.

Mais on peut avoir des besoins très différentes. Par exemple, je veux avoir un squelette pour les rubriques situés à la racine du site (« secteurs », dans le jargon de SPIP) et un autre squelette pour leurs sous-rubriques.

La méthode proposée ici consiste à créer des squelettes différents pour ces deux situations ; par exemple :
— rubrique-secteur.html
— rubrique-normale.html

Ensuite, utiliser le squelette rubrique.html avec simplement une « boucle de contrôle » qui teste dans quelle situation on se trouve, et demande l’inclusion de tel ou tel squelette.

  1. <BOUCLE_principale(RUBRIQUES){id_rubrique}>
  2.         <BOUCLE_sommaire(RUBRIQUES){id_rubrique}{id_parent=0}>
  3.                                 <INCLURE{fond=rubrique-sommaire}{env}{id_rubrique}>
  4.         </BOUCLE_sommaire>
  5.                                 <INCLURE{fond=rubrique-normale}{env}{id_rubrique}>
  6.         <//B_sommaire>
  7. </BOUCLE_principale>

La BOUCLE_sommaire est ce que j’appelle une « boucle de contrôle » : le principe de base est de réaliser une boucle qui appelle l’élément déjà actif (la rubrique tirée de BOUCLE_principale ; ici, le résultat ne peut être que la rubrique principale) en ajoutant un ou plusieurs critères supplémentaires (ici : est-ce que l’id_parent de cette rubrique est zéro ?).

On a donc très simplement un test sur la position de la rubrique dans la structure du site, et l’appel de l’un ou l’autre des squelettes de rubriques. Le critère {env} permet de passer d’éventuelles informations supplémentaires (indispensable notamment si on a des listes paginées dans ces squelettes).

Il serait évidemment possible de réaliser cette boucle de contrôle uniquement pour une partie des squelettes. Mais personnellement je préfère réaliser le test en amont, et ainsi gérer plusieurs squelettes complets (qui contiennent chacun l’intégralité de l’information HTML). Je trouve cela plus facile à maintenir.

Plus de boucles de contrôle

On peut multiplier les boucles de contrôle pour réaliser de très nombreuses sélections de squelettes. Il faut alors bien construire l’imbrication des boucles de contrôle pour obtenir une logique propre.

Par ailleurs, il est intéressant d’avoir des critères très divers. On peut se baser, par exemple, sur le nombre d’articles présents dans la rubrique, le titre de la rubrique, la présence d’un mot-clé, le choix d’un champ #EXTRA...

Voici un exemple un peu plus complet que précédemment : pour les « sous-rubriques », s’il n’y a qu’un seul article (et pas de sous-rubrique), alors on appelle directement le squelette de cet article (attention, ça n’est pas une structure très pratique à gérer au niveau des squelettes) :

  1. <BOUCLE_principale(RUBRIQUES){id_rubrique}>
  2.  
  3.         <BOUCLE_sommaire(RUBRIQUES){id_rubrique}{id_parent=0}>
  4.                                 <INCLURE{fond=rubrique-sommaire}{env}{id_rubrique=#_principale:ID_RUBRIQUE}>
  5.         </BOUCLE_sommaire>
  6.  
  7.                 <BOUCLE_test_sous_rub(RUBRIQUES){id_parent}{0,1}>
  8.                                         <INCLURE{fond=rubrique-normale}{env}{id_rubrique=#ID_PARENT}>
  9.                 </BOUCLE_test_sous_rub>
  10.                
  11.                         <BOUCLE_test_articles(ARTICLES){id_rubrique}{1,1}>
  12.                                 <INCLURE{fond=rubrique-normale}{env}{id_rubrique}>
  13.                         </BOUCLE_test_articles>
  14.                                 <BOUCLE_article(ARTICLES){id_rubrique}>
  15.                                         <INCLURE{fond=article}{env}{id_article}>
  16.                                 </BOUCLE_article>
  17.                         <//B_test_articles>               
  18.                 <//B_test_sous_rub>
  19.         <//B_sommaire>
  20. </BOUCLE_principale>

En utilisant des variables SPIP

Avec SPIP 2, il est possible de mémoriser des valeurs en créant des variables (grâce à #SET) puis de récupérer ces valeurs plus loin dans le code (#GET).

J’utilise une telle variable lorsque j’ai beaucoup de tests à réaliser, et que l’imbrication des boucles de contrôle deviendrait trop complexe. Je fixe la valeur du fond par défaut, puis je réaliser des tests successifs qui, chacun, sont capables de modifier cette valeur. À la fin de la série de tests, je fais un INCLURE en utilisant la valeur ainsi sauvegardée.

Voici le fichier rubrique.html que j’utilise sur un site ayant une dizaine de squelettes des rubriques appelés dans des situations très diverses.

  1. <BOUCLE_principale(RUBRIQUES){id_rubrique}>
  2. <?php
  3. [(#SET{fond,rubrique-normale})]
  4.  
  5.         <BOUCLE_hier_salle(HIERARCHIE){id_rubrique}>
  6.                 <BOUCLE_test_salle(RUBRIQUES){id_rubrique}{titre==(Collections|Les salles|Zoom sur...|Le parcours)$}>
  7.                 [(#SET{fond,rubrique-salle})]
  8.                 </BOUCLE_test_salle>
  9.                 <BOUCLE_test_edition_hier(RUBRIQUES){id_rubrique}{titre==(ditions)$}>
  10.                         [(#SET{fond,rubrique-edition})] 
  11.                 </BOUCLE_test_edition_hier>
  12.  
  13.         </BOUCLE_hier_salle>
  14.  
  15.  
  16.         <BOUCLE_test_sous_salle(RUBRIQUES){id_parent}{0,1}>
  17.                 [(#GET{fond}|=={rubrique-salle}|?{" ",""} )
  18.                         [(#SET{fond,rubrique-portfolio})]
  19.                 ]
  20.  
  21.         </BOUCLE_test_sous_salle>
  22.  
  23.  
  24.  
  25.         <BOUCLE_test_zoom(RUBRIQUES){id_rubrique=#ID_PARENT}{titre==(Zoom sur...)$}>
  26.                 [(#SET{fond,rubrique-salle})]   
  27.         </BOUCLE_test_zoom>
  28.  
  29.         <BOUCLE_test_programmation(RUBRIQUES){id_rubrique}{titre==(Programmation)$}>
  30.                 [(#SET{fond,rubrique-programmation})]   
  31.         </BOUCLE_test_programmation>
  32.        
  33.         <BOUCLE_test_edition(RUBRIQUES){id_rubrique}{titre==(ditions)$}>
  34.                 [(#SET{fond,rubrique-edition})] 
  35.         </BOUCLE_test_edition>
  36.        
  37.         <BOUCLE_test_accueil(RUBRIQUES){id_parent}{titre==^#Accueil}>
  38.                 [(#SET{fond,rubrique-accueil})] 
  39.         </BOUCLE_test_accueil>
  40.        
  41.         <BOUCLE_test_sommaire(RUBRIQUES){id_rubrique}{id_parent=0}>
  42.                 [(#SET{fond,rubrique-sommaire})]       
  43.         </BOUCLE_test_sommaire>
  44.        
  45.         <BOUCLE_test_sous_rubriques(RUBRIQUES){id_parent}{0,1}>
  46.         // #ID_RUBRIQUE
  47.         </BOUCLE_test_sous_rubriques>
  48.                 <BOUCLE_test_articles(ARTICLES){id_rubrique}{1,1}>
  49.                 // #ID_ARTICLE
  50.                 </BOUCLE_test_articles>
  51.                         <BOUCLE_article_unique(ARTICLES){id_rubrique}{0,1}>
  52.                                 [(#SET{fond,rubrique-article})] 
  53.                         </BOUCLE_article_unique>
  54.                 <//B_test_articles>
  55.         <//B_test_sous_rubriques>
  56.        
  57.        
  58. ?>
  59.  
  60.         <INCLURE{fond=#GET{fond}}{id_rubrique}{env}>
  61.  
  62. </BOUCLE_principale>

Le passage de la longue liste de boucles à l’intérieur d’un appel PHP ne sert à rien : c’est uniquement pour éviter d’afficher une cinquantaine de lignes vides en début de code HTML. On peut très bien s’en passer.

il y a 3 mois
Y a un plugin :
Sylvain (sylvain chez guaph.net)

Salut Arno*

Personnellement, j’utilise pour cela un groupe de mot-clé, où chaque mot-clé peut-être un squelette proposant une mise en page différente.

suffit donc de joindre le mot-clé à la rubrique et/ou l’article ...

a+

il y a 3 mois
Gérer plusieurs squelettes selon n’importe quel critère
karim belkacem (kbelkacem chez gmail.com)

Salut Arno*, Sylvain !

@Sylvain, c’est valable la technique des mots-clés si tu veux laisser "la main" au webmaster du site et si le cahier des charges du site est aléatoire, mais la technique d’Arno* est prévue pour un cahier des charges relativement abouti (conceptuel en sorte), ça permet aussi d’avoir un site uniforme à moyen/long terme. L’expérience montre que si tu laisses la main aux squelettes via l’admin, au bout de quelques temps, ça devient vite n’importe quoi...

Ceci dit en retravaillant les boucles d’Arno* on peut avoir le résultat de la technique des mots-clés sans mots clés, c’est tout de même beaucoup plus naturellement spip dans la technique de développement que le palliatif mots-clés partout, qui est entre nous une bidouille.

@Arno*, BRAVO maestro :)

il y a 3 mois
Gérer plusieurs squelettes selon n’importe quel critère
ARNO* (arno chez rezo.net)

En fait, cette technique permet aussi d’utiliser un choix « manuel » des squelettes depuis l’espace privé.

On peut notamment tester la présence d’un mot-clé associé à un article, ou à une rubrique, ou à une rubrique située dans la hiérarchie...

Mais personnellement, je préfère éviter d’utiliser des mots-clés dans un but technique si je peux faire autrement.

Dun coup, il m’est arrivé d’activer une sélection manuelle, mais plutôt que de me baser sur la présence d’un mot-clé, j’utilise plutôt un champ #EXTRA.

Votre message :
Un message, un commentaire ?

(Pour créer des paragraphes, laissez simplement des lignes vides.)

Qui êtes-vous ? (optionnel)