29-11-2011 : Remettre dans le débat politique les principes du Conseil National de la Résistance
29-01-2012 : Parce que nous sommes un peuple debout, agissons pour rester dignes et responsables !
Logo de mon site
Logo de mon site
Faire un don

Luxpopuli / eZ Publish / Langage eZ Publish / eZ Publish : récupérer X objects aléatoirement





Right menu

Logo du site ez.no  Logo XHTML 1.O du W3C  Logo XHTML 1.O du W3C  Site francophone officiel de Firefox

eZ Publish : récupérer X objects aléatoirement

Date de publication: le vendredi 19 février 2010 à 16h15
Dernière modification: par Pascal BOYER le samedi 20 février 2010 à 09h02
« Article précédent: Afficher les icônes liés aux mimetypes
» Article suivant: eZ Publish: les liens d'objets

Cet article explique dans le détail comment extraire aléatoirement x objets placés dans un répertoire de l'arborescence.

Soit l'arborescence suivante:

Fig. 1: Arborescence de départ

  • IMAGES DU BANDEAU DU SITE: classe d'objet dossier_images
  • 3, 11, 7,..., 4, 9: images de la classe image_diaporama
1 {def $dossierImages=fetch('content', 'list', hash('parent_node_id', 2,
2                                                   'limit', 1,
3                                                   'class_filter_type',  include,
4                                                   'class_filter_array', array( 'dossier_images' ) ) )
5          $listeDesImages=fetch('content','list', hash('parent_node_id', $dossierImages.0.children.0.node_id,
6                                                   'class_filter_type',  include,
7                                                   'class_filter_array', array( 'image_diaporama' ) ) )
8          $nombreImages=$listeDesImages|count
9          $compteur=0
10        $tableau=array()}
11     {while lt($compteur,5)}
12        {def $i=rand(0,$nombreImages|sub(1))}
13        {set $tableau=$tableau|append($listeDesImages.$i.data_map.image.content.original.url)|unique}
14        {set $compteur=$tableau|count}
15        {undef $i}
16     {/while}
17     <div id="slideshow2" class="pics">
18        {foreach $tableau as $pathImage}
19           <img src="/{$pathImage}" width="940" height="240" alt="" />
20        {/foreach}
21     </div>
  • Lignes 1 à 4 : on commence par récupérer le tableau d'infos sur le dossier IMAGES DU BANDEAU DU SITE.
  • Lignes 5 à 7 : on récupère la liste de toutes les images ( $dossierImages.0.children.0.node_id vaut le id du sous-dossier Images du bandeau du site)
  • Ligne 8 : rien à dire
  • Lignes 9 à 10 : on initialise une variable puis un tableau.
  • Ligne 11 : c'est ici que l'on détermine le nombre d'images que l'on souhaite extraire/afficher. Dans notre exemple on va extraire aléatoirement 5 des 10 images disponibles.
    Le compteur commence à compter à partir de zéro. Donc de 0 à 4 ( lt = less than = plus petit que 5) correspond bien à 5 images.
  • Ligne 12 : on définit une valeur aléatoire de i comprise entre 0 et le nombre total d'image moins 1 (car on commence à 0 et non à 1).
  • Ligne 13 : on ajoute au tableau la valeur de l'URL de la ième images.
    L'opérateur unique s'assure que le tableau ne peut contenir deux fois la même URL (car $i peut prendre aléatoirement plusieurs fois une même valeur au cours de la boucle ) while
  • Ligne 14 : on donne au compteur la valeur du nombre d'items que contient le tableau.
    Lorsque la variable $i prend, par exemple, deux fois une même valeur, alors la boucle while tourne 6 fois.
  • Lignes 18 à 20 : pour chacune des 5 valeurs de $tableau on affiche l'image.

Améliorer le système

Il est possible d'ajouter un champ sélection à la classe d'objet dossier_images afin que le responsable du site puisse sélectionner le nombre d'images à afficher.

Le code devient alors:

{def $dossierImagesBandeau=fetch('content', 'list', hash('parent_node_id', 2,
                                                       'limit', 1,
                                                       'class_filter_type',  include,
                                                       'class_filter_array', array( 'dossier_images_bandeau' ) ) )
              $listeDesImages=fetch('content','list', hash('parent_node_id', $dossierImagesBandeau.0.children.0.node_id,
                                                       'class_filter_type',  include,
                                                       'class_filter_array', array( 'image_diaporama' ) ) )
              $nombreImages=$listeDesImages|count
              $compteur=0
              $tableau=array()
              $nbImageAfficher=$dossierImagesBandeau.0.data_map.nb_images_afficher.data_text|sum(1)}    <=== CETTE LIGNE
      {while lt($compteur,$nbImageAfficher)}  <=== ICI
         {def $i=rand(0,$nombreImages|sub(1))}
         {set $tableau=$tableau|append($listeDesImages.$i.data_map.image.content.original.url)|unique}
         {set $compteur=$tableau|count}
         {undef $i}
      {/while}
      <div id="slideshow2" class="pics">
         {foreach $tableau as $pathImage}
            <img src="/{$pathImage}" width="940" height="240" alt="" />
         {/foreach}
      </div>

Commentaires