eZ Publish : Two Step View avec la persistent_variable
La persistent variable permet de contourner pas mal de faiblesse d'eZ Publish. Elle permet de simuler entre autres les placeholder que l'on trouve classiquement avec un vrai moteur de template.
Exemple pour la gestion de la colonne de droite
Dans notre exemple, le contenu de la colonne de droite est en fonction du contenu de la zone centrale, sans pour autant que ce soit des attributs de la colonne de droite. L'idée est simple, c'est simplement de construire le template de la colonne de droite au moment du rendu de la vue full. Attention en raison du moteur de template d'eZ Publish il n'est pas possible de passer directement des objets dans la persistent_variable sous peine d'avoir des parse error dans les templates générés, en tous cas dans les versions 4.0 et 4.1 d'eZ Publish. Il faut obligatoirement avoir du contenu textuelle.
Fichier override/template/mon_extension/full/page.tpl
{* Template normal de la vue full *}
...
{* Template de la colonne de droite *}
{set-block variable=colonne_droite}
...
{/set-block}
{* Passage des paramètres au page_layout *}
{set persistent_variable = array(
'colonne_droite', $colonne_droite
)}
Le pagelayout étant exécuté en dernier, on peut récupérer l'information et la placer dans le layout à l'endroit où l'on veut.
Le pagelayout
{def $pvar = $module_result.content_info.persistent_variable}
...
{$module_result.content}
...
L'avantage de cette technique est qu'il s'inscrit dans le CDD (Cache Driven Development) si chère à eZ Publish.
En effet, le contenu stocké dans la persistent_variable est stocké dans le cache en même temps que le cache de la view full du nœud considéré. Leurs durées de vie sont intrinsèquement liés.
Il peut arriver que l'on ne désire pas avoir un tel couplage entre le contenu centrale et la colonne de droite. Dans ce cas, il faut non plus passer le rendu HTML de la colonne de droite, mais passer les paramètres nécessaire à sa construction.
Par exemple, le rendu de la colonne de droite peut dépendre de mots clés placés dans un attribut Keyword
{set $colonne_droite = array(
'keywords', $node.data_map.keywords.content
)}
De nouvelles opportunités
Two Step View
On a vu qu'il était possible de mettre en place une colonne de droite avec un couplage lâche avec la zone centrale. On peut aller plus loin en déplaçant la logique d'affichage de la zone centrale vers le pagelayout. La vue full s'occupe de construire les différents blocs qui vont constituer la page finale. C'est ce résultat qui va etre mis en cache de vue (viewcache). Le pagelayout s'occupera de positionner chaque blocs à sa place. Finalement, il se trouve en présence du design pattern Two Step View qui permet d'encapsuler le contenu d'une vue dans une autre.
Intégrer du javascript et le css, seulement quand il est utile
Avec la variable persistante, il est tout a fait envisageable de définir une clé qui sera réservé aux javascript incorporé en fin de page, ou à l'intégration de certain scripts externes uniquement pour les pages qui le nécessitent vraiment. On faire de meme pour des styles bien spécifiques. L'avantage de cette méthode c'est qu'on inclut pas à chaque page tous les scripts qui sont utilisées à un moment où un autre sur le site. Beacoup d'utilisateur ne verrons jamais les pages où sont présent certains widget, pourtant tous le code à été télécharger, analyser et les initialisations ont été effectués. Voila, un moyen simple et efficace de faire baisser le nombre de requête serveur, la taille des pages, le temps d'exécution des scripts. Pour un gros site, cette petite astuce peut améliorer considérablement les performances de votre site.
Meta données
C'est aussi un moyen simple de contextualiser les métas-donnés tel que le title, la description, les keywords en fonction de paramètres spécifiques à la vue d'un noeud.
Commentaires
Documentation e...
truffo
haltabush
OJIOJI
Sylvain_G
Intéressant, mais je pense que le mécanisme que tu décrit n'est pas le Two Step View, je suis passer réviser mes classiques et le motif Two Step View aka Layout est natif dans eZPublish, puisqu'il s'agit intégrer une vue dans une autre, donc node/view/full.tpl dans pagelayout.tpl
Mais ca n'enleve rien à la technique ^^
Huge
L'exemple cité par Sylvain est un projet sur lequel nous avons travaillé ensemble, je confirme donc, avec quelques précisions :
L'objet en question était le node courant, on a pas essayé avec autre chose Le problème se produit uniquement lorsque que tous les caches sont activés. Le problème se produit de façon aléatoire (comprennez : je n'ai pas saisi l'origine exact du problème)
Il semble en tous cas qu'a certains moment l'objet n'ai pas été disponible au moment de la compilation du template, on se retrouvait donc avec un code en début de template compilé du genre :
$variable_1 = array( 'toto'=> 'toto', 'node'=> , 'tata'=>'tata');
Quoi qu'il en soit : Passer le node_id à la persistent variable et refaire un petit fetch dans le pagelayout à l'intérieur d'un cache-block règle le problème.
Sylvain FIX
Sur un projet en eZ 4.1, lorsqu'on passer des objets des objets directement dans le pagelayout, on avait des parse error dans le code généré à la
compilationgénération du template. On obtenais un code du genrearray(,,). C'était peut être propre au projet.Par contre, merci pour la remarque concernant les opérateurs ezpagedata_*, ça améliorera certainement la lisibilité du code.
Damien
Quelques précisions :
[1] http://ez.no/doc/ez_publish/technical_manual/4_x/templates/the_pagelayou...
[2] http://issues.ez.no/14295
Ajouter un commentaire