1

Gérer plusieurs squelettes selon n’importe quel critère

22 octobre 2008
par ARNO*

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>

Télécharger

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>

Télécharger

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>

Télécharger

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.

Qui êtes-vous ?
Votre message

Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.