Contactez-nous

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.

  • Sylvain
    Octobre 2008

    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+

  • karim belkacem
    Octobre 2008

    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 :)

  • ARNO*
    Octobre 2008

    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.

  • Loiseau2nuit
    Janvier 2009

    Hello :)

    J’ai beau fouillé et refouiller le dernier bloc de code, je ne comprends pas la présence du <?php  ?> ?

    Peux tu éclairer ma lanterne s’il te plait ?

    Merci Etienne.

  • François Daniel Giezendanner
    Mars 2011

    Bonjour,

    Sauriez-vous comment adapter la boucle :

    <BOUCLE_groupes(GROUPES_MOTS){par titre}>
           <h1>#TITRE</H1>
           <B_mots>
           <BOUCLE_mots(MOTS){id_groupe}{par titre}{" - "}>
                   #TITRE
           </BOUCLE_mots>
           </B_mots>
           <//B_mots>
    </BOUCLE_groupes>

    qui liste les groupes de mots-clés et leurs mots-clés

    ...afin qu’elle teste l’existence d’un mot-clé ou son absence :

    <BOUCLE_groupes(GROUPES_MOTS)>
           <B_mots>
           <BOUCLE_mots(MOTS){id_groupe}{???}{???}>
                   le mot clé existe
           </BOUCLE_mots>
           </B_mots>
                   le mot clé n'existe pas
           <//B_mots>
    </BOUCLE_groupes>

    par exemple déterminer si le mot-clé « constructivisme » dans le groupe « pédagogie » existe ou n’existe pas, pour ensuite enclencher de manière conditionnelle une action ou une autre.

    La syntaxe ci-dessous est fausse, mais c’est l’idée :

    <BOUCLE_groupes(GROUPES_MOTS)>
           <B_mots>
           <BOUCLE_mots(MOTS){id_groupe}{type_mot=pédagogie}{titre_mot=constructivisme}>
                   le mot clé existe
           </BOUCLE_mots>
           </B_mots>
                   le mot clé n'existe pas
           <//B_mots>
    </BOUCLE_groupes>

    Sauriez-vous comment l’adapter pour que cela fonctionne ?

    Avez-vous une solution a proposer ?

    Cordialement

    FDG

  • François Daniel Giezendanner
    Mars 2011

    Bonjour,

    Je me répond à moi-même, la solution est :

    <BOUCLE_groupes(GROUPES_MOTS){titre=pedagogie}>
           <B_mots>
           <BOUCLE_mots(MOTS){id_groupe}{titre=constructivisme}>
                   le mot clé existe
           </BOUCLE_mots>
           </B_mots>
                   le mot clé n'existe pas
           <//B_mots>
    </BOUCLE_groupes>
    </B_groupes>
            le groupe de mot clé n'existe pas
    <//B_groupes>
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.