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














