Plus smart que Smarty …

Pourquoi ne peut-on pas insérer du code Smarty dans la bannière des pages de Piwigo ?

Hors-sujet : Indiquer l’url de la galerie est un peu étrange, devoir coder soi-même des balises en réutilisant en général ces mêmes informations relève d’une logique perturbante.

Revenons à la question initiale : vos indications sont d’abord enregistrées dans la base de données, puis lors de la publication d’une page publique ces données seront placées dans une variable Smarty : $PAGE_BANNER et c’est cette variable qui se retrouve dans le header.tpl utilisé par le thème de votre site.

Comment pourrions-nous simplifier ceci ?
Nous avons déjà évoqué la solution, mais elle est passée inaperçue, je ne cherchais pas à la mettre en évidence.
Dans « Concevoir des templates évolutifs » c’est presque la même solution.
Voyons cela avec un cas précis.
Imaginons que nous voulions coder:

<h1><a href="{$TITLE}" alt="{$GALLERY_TITLE}" title="{$GALLERY_TITLE}">{$GALLERY_TITLE}</a></h1>

En utilisant des templates-extensions.
Dans ./template-extension/ nous allons créer un page_banner.tpl avec :

<h1><a href="{$TITLE}" alt="{$GALLERY_TITLE}" title="{$GALLERY_TITLE}">{$GALLERY_TITLE}</a></h1>

Et toujours dans ./template-extension/ nous allons créer un header.tpl avec :

  {include file='../../../template-extension/page_banner.tpl' assign=BANNER}
  {assign var=TEXT_BANNER value=$PAGE_BANNER}
  {include file="../../default/template/header.tpl" PAGE_BANNER=$BANNER}
  {* quel que soit le template, le path doit être relatif depuis themes/xxxx/template/ *}

Bien entendu on activera le template-extension/header.tpl

Comment ça fonctionne ?
Quand la page sera demandée, l’header.tpl sera sollicité. Celui-ci étant substitué par celui du répertoire template-extension, la première chose réalisée sera l’include de page_banner.tpl. Cependant au lieu de présenter immédiatement le résultat sera affecté à la variable BANNER (assign=BANNER).
Ensuite nous avons un assign var= (facultatif) qui n’est là que pour le cas où nous voudrions utiliser le texte initial de la « Bannière des pages » ultérieurement dans un autre template.
Enfin on sollicite le header par défaut (pour rester évolutif) mais cette fois nous indiquons PAGE_BANNER=$BANNER, c’est à dire que nous changeons le contenu de $PAGE_BANNER par ce que nous avions obtenu de l’include de page_banner.tpl.

Ce n’est que du Smarty tout à fait standard. C’est simple et sympa, bref c’est Smarty.

9 thoughts on “Plus smart que Smarty …

  1. Je vérifie que j’ai bien tout compris : 😉
    – on commence par mettre le contenu souhaité dans une variable BANNER,
    – on sauvegarde le contenu de la variable standard PAGE_BANNER dans une variable TEXT_BANNER (dont on ne fait rien, mais qui pourrait être utilisée pour autre chose)
    – et on remplace le contenu de PAGE_BANNER par le nôtre, c’est-à-dire BANNER.

    Mais je ne vois pas trop l’intérêt du page_banner.tpl : pourquoi ne pas assigner à BANNER son contenu directement dans header.tpl ?

    1. Tu as bon pour la compréhension.
      Pour la question finale par contre, c’est moins évident, mais c’est selon l’avis de chacun.
      Je rappelle que l’intérêt est de profiter du header.tpl standard sans le dupliquer, afin de profiter de ses évolutions.
      😉

      Essayons pour voir (théorie pure, non testé), soit :

      {capture name="BANNER"}<h1><a href="{$TITLE}" alt="{$GALLERY_TITLE}" title="{$GALLERY_TITLE}">{$GALLERY_TITLE}</a></h1> {/capture}
      {assign var=TEXT_BANNER value=$PAGE_BANNER}
      {include file="../../default/template/header.tpl" PAGE_BANNER=$smarty.capture.BANNER}

      Cette solution évite le passage par un page_banner.tpl.

      Qui a dit que Smarty n’était pas très smart ?
      Pas sûr que cela soit plus lisible/compréhensible pour tout le monde.

      Et si tu cherches à éviter {capture …
      Essaie donc de le faire, tu découvriras vite que cela s’avère beaucoup plus compliqué et moins lisible.
      😉

      1. Décidément, je ne vois tes commentaires qu’à retardement … j’ai ajusté mon propre développement avoir d’avoir lu tes réponse :/

        Mais tu verras que je n’ai pas touché au header.tpl standard, et ne l’ai pas dupliqué non plus ; je ne fais que l’inclure, comme tu le proposais.

  2. Voici mon template-extension header.tpl

    {* sauvegarde de PAGE_BANNER standard *}
      {assign var=TEXT_BANNER value=$PAGE_BANNER}
    {* affectation du nouveau contenu de la bannière *}
      {capture assign=PAGE_BANNER}{$TITLE}{/capture}
    {* exécution du template standard *}
      {include file="../../default/template/header.tpl"}

    Ca fonctionne (Cf. http://marie-noelle-augendre.com/photos )

    Remarques :
    – je ne sais pas bien pourquoi j’avais voulu un attribut alt, qui n’a rien à faire dans un lien
    – j’ai du virer le title lorsque je me suis aperçue que la variable standard $TITLE contenait déjà le lien complet … mais sans l’attribut title, malheureusement.

    Merci de m’avoir donné la piste de départ, et de m’avoir donné l’occasion de fouiller un peu sur le net à la recherche d’infos : le fonction Smarty capture me paraît digne d’intérêt pour ce genre de cas de figure.

    😉

  3. Je reviens dessus, car je n’obtiens tout de même pas le résultat escompté, la faute à la variable {$TITLE} qui comprend trop de choses (le lien complet), mais pas celles que je souhaite :/

    J’obtiens ceci :

    <a href="http://mon-site/photos/" rel="nofollow">Accueil</a>

    alors que je voudrais ça :

    <a href="http://mon-site/photos/" title="La galerie de moi" rel="nofollow">La galerie de moi</a>

    Il me faudrait donc trouver le moyen de récupérer l’URL seule, pour que je puisse personnaliser l’ensemble du lien à ma sauce.
    {$GALLERY_TITLE} me donnera ce que je veux mettre comme texte du lien, et dans l’attribut title, mais j’aimerais autant avoir à éviter de « parser » $TITLE pour y récupérer ce qui me manque.

    😉
    (je ne sais pas si le code HTML va passer correctement …)

  4. PS : c’est quand même bien le BBcode ou équivalent pour pouvoir passer des lignes de code sans qu’elles soient interprétées 😉

  5. Finalement, ça ne marchait pas si bien que ça … sur les autres pages que la page d’accueil !

    Apparemment, la variable ramenait le breadcrumb complet, et pas seulement le lien vers la page d’accueil, ce qui donnait des résultats de plus en plus bizarres au fur et à mesure qu’on descendait dans l’arborescence des catégories.

    Après tests, j’ai donc modifié le {capure assign …} ainsi :
    {capture assign=PAGE_BANNER}{$PAGE_BANNER}{/capture}
    et cette fois, je récupère bien le lien vers l’accueil, ainsi que le texte du lien et l’attribut title comme je le souhaitais.

    Il suffisait juste de prendre la bonne variable 😉

    [HS]
    Si Piwigo disposait d’un minimum de documentation technique (la liste des variables ! …), ce genre de méprise n’arriverait pas :/
    [/HS]

Comments are closed.