Afficher un objet aléatoirement dans eZ publish

Afficher un objet aléatoirement est une question assez fréquente sur les forums eZ publish. Cette opération comporte en fait deux petites difficultés :

 

  1. La sélection aléatoire à l'aide fetch qui ne propose pas (encore?) de méthode spécifique

  2. La gestion du cache qu'il faut désactiver ou du moins réduire.

 

J'ai d'ailleurs proposé une solution sur le forum Questions Techniques d'eZ publish France dans un sujet de jeudi dernier. Au passage j'ai appris l'existence de l'opérateur rand() qui renvoie un nombre aléatoire compris entre ses deux arguments. Je ne sais pas pourquoi, j'étais persuadé qu'il n'y avait pas d'opérateur de ce type, donc à chaque fois que j'avais un nombre aléatoire à génèrer, j'utilisais le timestamp courant modulo le nombre de maximal d'objets existants. Pourquoi faire simple quand on peut faire compliqué ? :-)

Au final, je me dis que publier un template peut être intéressant pour le débutant et puis ça fait un bon pense bête pour moi :

 

{** désactivation du cache pour avoir  **
 ** un nouvel affichage à chaque appel **}
{set-block scope=root variable=cache_ttl}0{/set-block}
<div class="block">
{** sélection aléatoire **}
  {let c=fetch(content, tree_count,
                hash(parent_node_id, 93,
                     class_filter_type, include,
                     class_filter_array, array('photo')))
       p=fetch(content, tree,
                hash(parent_node_id, 93,
                     class_filter_type, include,
                     class_filter_array, array('photo'),
                     limit, 1,
                     offset, rand(0 $c|sub(1))))
  }
  {** $p[0] contient l'objet choisi **}
    {node_view_gui content_node=$p[0] view=preview}
  {/let}
</div>

 

Le set-block indique à eZ publish de ne pas mettre en cache le résultat du template, ou plus exactement de le mettre en cache avec une durée de vie de zéro seconde. Sur un site à fort traffic, cela est peut être un peu agressif, il est peut être plus raisonnable de fixer le temps d'expiration du cache à une valeur supérieure mais relativement faible. Le premier fetch (tree_count) permet de compter le nombre total d'objets (ici des photos) alors que le second (tree) sélectionne effectivement un objet au "hasard" en fixant le paramètre offset.

Ce bout de code est à mettre dans un template par exemple dans le fichier design/votre_design/templates/rand_photo.tpl est à inclure à l'aide de include avec quelque chose comme :

 

{include uri="design:rand_photo.tpl"}

 

Une solution, peut être plus économe en ressource, pourrait être de compter le nombre d'objets à l'extérieur du template rand_photo.tpl et de passer cette valeur en paramètre du include, de manière à ce que le résultat soit stocké en cache. L'inconvénient est que les deux fetch utilisés pour la même tâche se retrouve à deux endroits distincts ce qui ne facilite pas la maintenance...

Une autre solution, proposée par Xavier Langlois est d'utiliser la contribution Extension shuffle qui propose un opérateur de template permettant de mélanger un tableau quelconque. Cette solution a le désavantage de nécessiter la création d'un tableau contenant tous les objets possibles (à l'aide du fetch tree sans les paramètres limit et offset par exemple) pour ensuite ne prendre que l'un d'entre eux. J'avoue ne pas avoir testé cette solution, mais sur un grand nombre d'objets possibles, c'est une solution probablement gourmande en ressource, d'autant plus si le cache est désactivé.

» Commentaires

- Afficher un objet aléatoirement dans eZ publish (#61553) par Mackoso le 19 Septembre 2006 à 15:41
Bonjour !
Je commence à fréquenter votre site pour esperer y trouver quelques infos sur eZ publish.
Pour le rendre encore très attractifs, je suggère que vous reflechissiez sur une rubrique du genre "Les sujets pertinents" du Forum ez.no comme on en trouve dans la communauté Mambo ou joomla...et votre avis sur les astuces, etc.
Ce début est une bonne chose, voire un bon début
- Intéressant (#61554) par Damien le 19 Septembre 2006 à 21:01
C'est un peu ce qui est fait maintenant dans la section "Forum Watch" dans les "community newsletter" du sur eZ.no. Par exemple : http://ez.no/community/news/community_newsletter_15_09_2006

Je le fais aussi mais pas de manière régulière, plus en fonction du sujet que j'ai envie de traiter.

Par contre, il me semble qu'il pourrait être intéressant d'en avoir une version francophone sur eZ publish France qui pourrait surveiller les forums d'eZ.no et les forums FR.
- en effet, très intéressant (#61555) par rbg le 19 Septembre 2006 à 23:41
En effet, bonnes remarques !
Toute la difficulté d'avoir en parrallèle une communauté francophone et une communauté "globale".

Connaissez vous http://www.planetezpublish.org/ ?
Damien, au rythme ou vont les choses je crois qu'il serait intéressant de penser un jour à avoir votre blog (ou tout du moins la section eZ publish) référencer sur ce site.
- Le planète (#61563) par Damien le 20 Septembre 2006 à 20:15
oui oui je connais (cf. le lien dans la colonne de droite) et j'avais bien envie de proposer mon blog, j'attendais d'avoir un peu de contenu et surtout il faut que je résolve un tout petit problème avec les fils RSS... ça fera certainement l'objet d'un autre billet justement...

» Trackback

Aucun trackback

Les trackacks sont désactivés

Flux RSS des billets

Flux RSS des billets

Rechercher sur pwet.fr

À retenir

Derniers commentaires

Archives

Nuage de tags

Bioutifoul photos

Quelques liens

Licence d'utilisation

Contenu sous Licence Creative Commons By-Sa

Sauf mentions spécifiques, les billets et les photos publiés sur ce site sont placés sous la licence Creative Commons by-sa.

Pour toute utilisation dépassant le cadre de cette licence, merci de me contacter par e-mail.

Login