29-11-2011 : Remettre dans le débat politique les principes du Conseil National de la Résistance
17-02-2012 : Pétition pour une protection de l’apiculture et des consommateurs face au lobby des OGM
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
zero papier grâce aux catalogues et promos en ligne de bonial

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