Les différents modes d’inclusion de SPIP

jeudi 26 janvier 2012, mise à jour jeudi 4 juillet 2013, par Maïeul
Suivre la vie du site RSS 2.0 Forum

Suite à une remarque de Tetue après mon article sur les pratiques de développements avec SPIP et à une question d’un théologien sur twitter, je fais ici un point sur les deux modes d’inclusion de squelettes dans SPIP.

Rappel : principe de l’inclusion

Inclure un squelette A dans un squelette B, c’est dire à B de reprendre le contenu du squelette A à l’endroit de l’inclusion.

L’interêt d’une telle pratique est de mettre en commun des morceaux de codes utilisés par plusieurs squelettes. Le cas le plus classique étant l’affichage du menu, mais plus le temps passe, plus le devellopeur SPIP aguerri aura tendance à multiplier les inclusions, voyant qu’il utilise beaucoup de code en commun.

Le principe des squelettes Z pousse à l’extrême cette idée d’inclusion / mutualisation du code.

Mais attention : il ne faut pas croire qu’on imite ainsi un « copier-coller » de B dans A.

Ainsi si je met dans le squelette A :

XXX<INCLURE{fond=B}>XXX

et dans le squelette B

YYY

Cela ne revient pas au même que mettre dans A :

XXXYYYXXX

Pourquoi ? Parce qu’il faut considérer que le contexte de chaque squelette est indépendant. Par contexte, j’entend l’ensemble des paramètres techniques qui lui sont passés, par exemple un numéro d’article. Ce contexte est récupérable via la balise #ENV et sert à l’interprétation des critères de boucles de premier niveaux. J’explique plus en détails cette notion de contexte dans un article sur contrib.

<INCLURE> ou #INCLURE ?

Il existe deux modes principaux d’inclusion :

  1. <INCLURE{fond=B}>
  2. #INCLURE{fond=B}

Historiquement, le premier modèle est apparu d’abord. Quelle est la différence technique entre les deux ? Soit un squelette A appelant un squelette B.

  1. Dans le cas d’une inclusion avec INCLURE le squelette B possède son propre cache. Lorsque le squelette A est appelé, il produit son cache à lui. Le résultat du cache de A est retourné au navigateur, et c’est à ce moment là que le cache du squelette B est inséré.
  2. Dans le cas d’une inclusion avec #INCLURE, il n’existe pas de cache du squelette B. Le morceau de PHP / HTML lié à l’interprétation par SPIP du squelette B est mis directement dans le cache du squelette A.

Puisqu’il paraît qu’il faut mettre des schémas, voici un schéma qui tente d’expliquer cette différence [1].

<INCLURE> ou #INCLURE ?
Inclusion statique ou inclusion dynamique ?

Conséquences techniques

  1. Du point de vue de la taille des caches :
    1. <INCLURE> produit plus de fichiers de cache, mais moins gros.
    2. #INCLURE produit des fichiers de cache plus gros, mais en moindre quantité.
  2. Du point de vue de la durée des caches :
    1. <INCLURE> permet d’avoir un squelette fils n’ayant pas la même durée de cache que le squelette père.
    2. #INCLURE ne permet pas cela, puisque le squelette fils n’a pas vraiment de cache propre.
  3. Du point de vue des techniques SPIP applicables :
    1. On peut pas filtrer le résultat d’une inclusion par <INCLURE> [2].
    2. Par contre avec #INCLURE on peut appliquer un filtre [(#INCLURE{fond=B}|filtre)].
    3. Dans tout les cas on peut utiliser AJAX.
  4. Du point de vue de la performance j’avoue ne pas trop savoir. Avoir un cache propre (<INCLURE>) permet d’avoir une vrai mutualisation des caches, dont un gain en terme de requête SQL, en revanche on a une perte de temps au moment où le cache de B est « reinjecté » dans le fichier A renvoyé à l’internaute. C’est donc au développeur de juger au cas par cas, mais il me semble que dans 90 % des cas, il vaut mieux utiliser <INCLURE>.

Et #MODELE

On peut aussi utiliser #MODELE. Pour ce faire, il faut que le fichier inclu se situe dans le dossier modeles.

Techniquement, faire

#MODELE{B}

revient, à peu de chose près, à la même chose que faire #INCLURE{fond=modeles/B}. Une différence toutefois : dans le cas de #MODELE l’identifiant de l’objet courant est automatiquement passé en paramètre.

Exemple, j’ai un squelette modeles/B.html :

<BOUCLE_article(ARTICLES){id_article}>
#ID_ARTICLE #TITRE
</BOUCLE_article>

Dans mon squelette A, je cherche à appeler ce squelette pour tout les articles d’une rubrique.

Je peux faire soit :

<BOUCLE_articles(ARTICLES){id_rubrique}>
#MODELE{B}
</BOUCLE_articles>

soit :

<BOUCLE_articles(ARTICLES){id_rubrique}>
#INCLURE{fond=modeles/B,id_article}
</BOUCLE_articles>

Personnellement je n’aime pas trop #MODELE, je trouve qu’il induit une confusion. Le seul cas où l’emploi de modèle est justifiable, c’est lorsque l’on souhaite permettre à un auteur d’inclure un tel morceau dans son article, en utilisant :

<B|id_article=xxx>

Par exemple le plugin Gravatar propose un modèle gravatar, que l’on peut appeler :

  1. soit dans un squelette #MODELE{gravatar}{id_auteur}.
  2. soit dans un article <gravatar|id_auteur=42>.

On consultera la documentation sur les modèles pour plus de détails.

P.-S.

Pour aider à y voir plus clair dans les différents squelettes inclus, on utilisera la fonction var_mode=inclure.

Notes

[1Toute suggestion d’amélioration est la bienvenue.

[2Une solution pour contourner ce problème est de mettre #FILTRE{nom du filtre} dans le squelette inclus.

Vos commentaires

  • Le 26 janvier 2012 à 11:45, par tetue En réponse à : Les différents modes d’inclusion de SPIP

    Merci pour cet article. Super ! Mais faut plus essayer de me faire avaler que (notamment « Z ») c’est pour les débutants.

  • Le 26 janvier 2012 à 11:52, par RastaPopoulos En réponse à : Les différents modes d’inclusion de SPIP

    Tu mens. :)

    Dans l’article que toi-même tu cites, il est parfaitement indiqué qu’on peut utiliser {ajax} avec les inclusions statiques.

  • Le 26 janvier 2012 à 12:00, par RastaPopoulos En réponse à : Les différents modes d’inclusion de SPIP

    @tetue : tu joues volontairement ou pas sur la multiplicité de sens de « débutant » : à ma connaissance, il n’a jamais été dit que Z était facile pour les débutants en écriture de squelettes.

    Z est en revanche très facile pour les débutants en web tout court : pour ceux qui veulent juste installer un site et changer son thème sans changer le contenu interne des pages.

    Pour moi, ça me parait évident que l’écriture, par contre, demande des apprentissages supplémentaires (apprendre le rangement, apprendre les classes CSS utilisées communes aux thèmes, etc).

  • Le 26 janvier 2012 à 13:05, par Maïeul En réponse à : Les différents modes d’inclusion de SPIP

    a tiens oui, tu a raison Rastapopoulos… je corrige :-)

  • Le 26 janvier 2012 à 13:07, par Maïeul En réponse à : Les différents modes d’inclusion de SPIP

    @Rastapoulos : ceci dit, j’avoue avoir du mal à comprendre comment cela est possible avec les inclusions statiques, sans recalculer l’ensemble du squelette …

  • Le 26 janvier 2012 à 13:31, par Maïeul En réponse à : Les différents modes d’inclusion de SPIP

    @tetue : désolé, je ne suis pas d’accord avec toi.

    Je ne parle pas des histoires de CSS, classe etc. Je dis simplement que si un débutant qui connaît déjà le HTML/CSS) et qui prend un modèle de squelettes standards souhaite modifier le contenu de son menu, il est plus pertinent qu’il n’ait qu’un seul fichier à modifier que 36 fichiers. Or ceci n’est possible que si on mutualise le code.

    Après si tu commence de A à Z ton squelette en tant que débutant (et un certain nombre le font, parceque comme cela ils voient ce qu’ils produisent eux) c’est autre choses.

  • Le 25 juin 2012 à 15:22, par gilles klein En réponse à : Les différents modes d’inclusion de SPIP

    Excellent article, clair, net, précis, intelligible, sur un sujet pas très facile à aborder.

    Il manque peut-être un élément : les noisettes.

    Gilles

  • Le 8 août 2012 à 23:03, par Severo En réponse à : Les différents modes d’inclusion de SPIP

    Super l’article. Si tu veux ajouter une métaphore, cerdic m’avait expliqué une fois que, si on voit le cache du squelette A comme un mur de maison :

    • #INCLURE c’est comme une brique du mur (le cache de B fait partie du cache de A)
    • <INCLURE> c’est comme une fenêtre, qui montre en transparence tout ce qu’il y a derrière (le cache de B est indépendant de A)

    Bon, cerdic l’expliquait mieux, mais avec tes talents de pédagogue, je suis sur que tu peux broder :)

  • Le 6 novembre 2012 à 11:16, par Loiseau2nuit En réponse à : Les différents modes d’inclusion de SPIP

    Je plussoie dans le sens de Gilles, un petit point sur les noisettes ne serait pas du luxe (même si personellement, et à la lecture de ce que tu en dis, j’aurais aujourd’hui tendance à les considérer comme une espèce de mélange des 3, soit noisette = <INCLURE> + #INCLURE + #MODELE. Après je ne sais pas trop comment se traduit mon équation en terme de webperfs.)

  • Le 27 mai 2016 à 09:43, par henri En réponse à : Les différents modes d’inclusion de SPIP

    Merci bcp pour cet article ! J’adore Google.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

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

Acheter XeLaTeX appliqué aux sciences humaines

À propos

Titulaire d’un doctorat en théologie et d’un doctorat en histoire, sous la direction conjointe de Frédéric Amsler et d’Élisabeth_Malamut, je commence à partir du 1er août 2017 un travail d’édition critique des Actes de Barnabé.

Dans le cadre de la rédaction de mon mémoire de master puis de ma thèse de doctorat, j’ai été emmené à utiliser LaTeX, et j’ai donc décider de partager mes techniques. En effet, au cours de mes premiers apprentissages, j’ai découvert que les ressources indiquant les outils pour l’utilisation de LaTeX en sciences humaines étaient rares. Ceci m’a conduit à maintenir ou créer plusieurs packages LaTeX et à donner plusieurs formations.

J’ai reçu en 2018 le prix DANTE e.V pour mon travail autour de LaTeX, en particulier autour de reledmac et reledpar.

Par ailleurs, je suis membre actif de la communauté SPIP, au sein de laquelle j’administre le site Spip-Contrib. Je propose sur ce site quelques notes sur SPIP, en général à destination de webmestre.

Il m’arrive également de faire un petit peu de Python, de temps en temps.

Enfin, je tiens un blog de réflexions politiques et religieuses.

Maïeul