SPIP

[ar] [ast] [bg] [br] [ca] [co] [cpf] [cs] [da] [de] [en] [eo] [es] [eu] [fa] [fon] [fr] [gl] [id] [it] [ja] [lb] [nl] [oc] [pl] [pt] [ro] [ru] [sk] [sv] [tr] [uk] [vi] [zh] Espace de traduction

Télécharger

Exemples de BOUCLE(DATA)

Mai 2012 — mis à jour le : 5 juin

Toutes les versions de cet article :

Quelques exemples de boucles (DATA) permises par les itérateurs de SPIP.

Pour avoir des exemples plus complets, consulter le site SPIP Love OpenData


Boucler arbitrairement sur un tableau

On peut boucler arbitrairement sur un tableau tel que ceux renvoyés par les balises suivantes : #ARRAY, #GET, #SESSION, etc.

Boucle :

  1. <BOUCLE_session(DATA){source tableau,#SESSION}>
  2. #CLE: #VALEUR <br />
  3. </BOUCLE_session>

ou par exemple sur un tableau contenant des mots

  1. <BOUCLE_mot(DATA){source tableau,#GET{mots}}>
  2. #VALEUR
  3. </BOUCLE_mot>

Lister les plugins actifs

Le format plugins ne nécessite pas de préciser les données.

Boucle :

  1. <BOUCLE_pl(DATA){source plugins}>
  2. #VALEUR
  3. </BOUCLE_pl>

Résultat :

crayons memoization icalendar

Afficher les « versions » de la configuration : critère {cle==...}

Cette boucle itère sur la balise #CONFIG, comportant tous les éléments de configuration d’un site (tels qu’ils sont enregistrés dans la table spip_meta).

Comme la balise #CONFIG est un tableau de données, on va employer le format table. Un critère {cle==version} filtre le tableau en ne retenant que les configurations dont la clé contient le mot « version ».

Boucle :

  1. <BOUCLE_cfg(DATA){source table, #CONFIG*}{cle==version}>
  2.   <dt>#CLE</dt>
  3.   <dd>#VALEUR</dd>
  4. </BOUCLE_cfg>

Résultat :

version_installee
16428
revisions_base_version
1.1
Indexation_base_version
0.4
...

Le critère {liste ...}

Pour simplifier l’écriture de tableaux de données, lorsqu’il s’agit d’une simple liste d’éléments qu’on veut indiquer manuellement, la boucle (DATA) accepte le critère {liste ...}, qui permet de constituer un tableau de données en séparant celles-ci par des virgules.

Boucle :

  1. <BOUCLE_i(DATA){liste 3,4,5}{"<br />"}>
  2. <BOUCLE_j(DATA){liste 6,7,8}{" "}>
  3. [(#VALEUR|mult{#_i:VALEUR})]
  4. </BOUCLE_j>
  5. </BOUCLE_i>

Résultat :

18 21 24
24 28 32
30 35 40

A noter : on a utilisé #_i:VALEUR pour référencer dans la boucle j la valeur calculée par la boucle i.

Voir aussi Deux itérateurs simples : les listes et les énumérations

Le critère {enum ...}

  1. <BOUCLE_enumere(DATA){enum 2, 10, 2}>
  2.       #VALEUR
  3. </BOUCLE_enumere>

Résultat :

2 4 6 8 10

  1. <BOUCLE_enum(DATA){enum g,m}{", "}>#VALEUR</BOUCLE_enum>

Résultat :

g, h, i, j, k, l, m

val1 et val2 sont 2 valeurs numériques, ou bien 2 caractères. SPIP déterminant laquelle des 2 valeurs est la plus petite, cette boucle va énumérer les valeurs entre val1 et val2. Dans la première forme, le pas n’est pas précisé : il vaut 1 par défaut.

Voir aussi Deux itérateurs simples : les listes et les énumérations

Un fichier CSV

Nous allons cette fois lire un fichier au format CSV se trouvant sur notre disque dur. Le fichier adresses.csv contient un carnet d’adresses :

Boucle :

  1. <BOUCLE_csv(DATA){source csv, adresses.csv}
  2. {par /3}
  3. {"<br />"}>
  4. #VALEUR{0} : #VALEUR{3}
  5. </BOUCLE_csv>

Résultat :

Marcimat: http://marcimat.magraine.net/
Fil: http://rezo.net/

À noter : le critère de tri {par /3} permet de trier sur la colonne n° 3, contenant les adresses web. Le / initial est obligatoire dans le cas d’un tri sur une clé numérique ou commençant par un chiffre.

Dans la démo de CSV livrée avec le plugin itérateurs, on trouvera un exemple beaucoup plus complet permettant de gérer proprement les clés du fichier CSV, et même de trier ou de fusionner sur ces clés.

Lister le contenu d’un répertoire

La fonction glob() de PHP permet de lister les fichiers correspondant à un masque ; elle a été transposée pour la boucle (DATA).

Boucle :

  1. <BOUCLE_ls2(DATA){source glob, IMG/jpg/*.jpg}>
  2. [(#VAL{Y-m-d H:i:s}|date{#VALEUR|filemtime})] / #VALEUR
  3. </BOUCLE_ls2>

Résultat :

2008-02-01 23:27:23 / IMG/jpg/arton2135.jpg
2008-08-21 11:12:58 / IMG/jpg/DSC03420.jpg
2008-08-21 11:13:11 / IMG/jpg/DSC03421.jpg
2009-08-27 11:20:11 / IMG/jpg/hash-1.jpg
2009-08-27 11:20:04 / IMG/jpg/hash.jpg

Lister les plugin.xml du site

La fonction preg_files de SPIP permet de lister des fichiers selon une expression régulière et de manière arborescente. Plus versatile, mais plus lente que glob.

Boucle :

  1. <BOUCLE_xml(DATA){source pregfiles, #EVAL{_DIR_RACINE}, plugin.xml$, 5}>
  2. #VALEUR[ - (#VAL{Y-m-d H:i:s}|date{#VALEUR|filemtime})]
  3. </BOUCLE_xml>

Résultat :

../plugins/a2a/plugin.xml - 2011-04-16 20:47:02
../extensions/simplog/plugin.xml - 2010-09-05 16:08:39
../extensions/vertebres/plugin.xml - 2011-03-19 16:49:51
../extensions/z-core/plugin.xml - 2010-09-05 16:08:47

Un webservice au format YAML

Le site http://per.sonn.es/ propose une API permettant de lire chaque profil au format YAML. On va donc interroger le site sur l’un de ces profils, et parcourir le résultat pour afficher la liste des amis de la personne concernée.

Commençons par analyser mon profil (à l’adresse http://per.sonn.es/Fil.yaml) :

Si l’on charge cette adresse avec le format yaml, on obtient un tableau de données un peu plus complexe que dans l’exemple précédent. En effet, certains items sont des chaînes de caractères, d’autres, comme la liste d’amis, des listes de chaînes.

(name => Fil, sex => F, friends => ( Maude Guérin, Zohra Robin, ...), ... ).

Parcourons ces données :

Boucle :

  1. <BOUCLE_yaml(DATA){source yaml, http://per.sonn.es/Fil.yaml}>
  2. <dt>#CLE</dt>
  3. <dd>[(#VALEUR|print)]</dd>
  4. </BOUCLE_yaml>

Résultat :

name
Fil
sex
F
birthday
1966-08-17
job
Calorifugeur
friends
Maude Guérin, Zohra Robin, Pierre-Yves Philippe, Lauriane Bertin, Jeannine Pichon, Vanessa Michel, Wendy Allard, Sylvie Michaud, Gwenaël Voisin, Paule Mary, Maia Ribeiro, Josianne François, Lucas Fernandes
...

Maintenant, nous voulons boucler sur les amis de Fil. Pour cela il y a deux possibilités. La première consiste à récupérer les données avec notre boucle (DATA) au format yaml, puis à stocker le tableau d’amis dans une variable que nous allons parcourir avec une autre boucle (DATA), cette fois au format table :

Boucle :

  1. <BOUCLE_yaml2(DATA){source yaml, http://per.sonn.es/Fil.yaml}{cle=friends}>
  2.   <BOUCLE_friends(DATA){source table, #VALEUR}{" - "}>
  3.     #VALEUR
  4.   </BOUCLE_friends>
  5. </BOUCLE_yaml2>

Résultat :

Maude Guérin - Zohra Robin - Pierre-Yves Philippe - Lauriane Bertin - Jeannine Pichon - Vanessa Michel - Wendy Allard - Sylvie Michaud - Gwenaël Voisin - Paule Mary - Maia Ribeiro

Le critère {datapath ...}

On voit bien dans l’exemple ci-dessus que, plus le tableau de données est complexe, plus les boucles qu’il va falloir imbriquer seront pénibles à coder. C’est là qu’intervient le critère {datapath ...}, qui permet d’indiquer à la boucle (DATA) le chemin (au sens de Xpath) vers le tableau de données qui nous intéresse [1].

Avec cette balise notre liste d’amis s’écrit en une seule boucle (et on en profite pour ajouter une pagination) :

Boucle :

  1. <BOUCLE_yaml3(DATA)
  2.  {source yaml, http://per.sonn.es/Fil.yaml}
  3.  {datapath friends}
  4.  {" - "}{pagination 10}
  5. >
  6.   #VALEUR
  7. </BOUCLE_yaml3>
  8. #PAGINATION
  9. </B_yaml3>

Résultat :

Maude Guérin - Zohra Robin - Pierre-Yves Philippe - Lauriane Bertin - Jeannine Pichon - Vanessa Michel - Wendy Allard - Sylvie Michaud - Gwenaël Voisin - Paule Mary
0 | 10 | 20 | 30 | 40 | ...

Un fichier XML

Le plugin « citations aléatoires » sur SPIP-Zone contient un fichier de citations, au format XML (http://zone.spip.org/trac/spip-zone/browser/_plugins_/citation_aleatoire/trunk/citations/citations_fr.xml). La boucle (DATA) permet de l’exploiter directement :

Boucle :

  1. [(#REM) Récupérer le fichier au format txt de la zone - mieux vaut l'enregistrer localement sur le serveur]
  2. [(#SET{c,http://zone.spip.org/trac/spip-zone/browser/_plugins_/citation_aleatoire/trunk/citations/citations_fr.xml?format=txt})]
  3.  
  4. <dl>
  5. <BOUCLE_cite(DATA)
  6. {source xml, #GET{c}}
  7. {par hasard}{0,1}
  8. >
  9. [<dt>(#VALEUR{0/auteur/0})</dt>]
  10. [<dd>(#VALEUR{0/texte/0})</dd>]
  11. </BOUCLE_cite>
  12. </dl>

Résultat (au hasard donc) :

L'idéal quand on veut être admiré, c'est d'être mort.
(Michel Audiard)

Utiliser un webservice comme YQL — Yahoo Query Language)

YQL est un webservice permettant d’interroger de façon simple de nombreux sites comme google, twitter, flickr, etc. Avec la boucle (DATA), SPIP facilite grandement son intégration sous forme de boucles : Cf. http://zzz.rezo.net/Exemples-de-bou....

Les Itérateurs PHP

SPIP est capable d’utiliser les itérateurs PHP standards. Il convient de se reporter à leur documentation, qui est souvent très succincte, et de vérifier que les itérateurs en questions sont disponibles sur votre système.

Notons, par exemple, DirectoryIterator, qui permet de lister les fichiers d’un répertoire :

Boucle :

  1. <pre>
  2. <BOUCLE_ls(php:DirectoryIterator){args IMG/jpg/}
  3.  {pagination 10}
  4.  {valeur!==^\.}{valeur==\.jpg$}
  5. >[(#VAL{Y-m-d H:i:s}|date{#GETMTIME})] / #VALEUR
  6. </BOUCLE_ls>
  7. </pre>
  8. #PAGINATION
  9. </B_ls>

Résultat :

2008-02-01 23:27:23 / arton2135.jpg
2008-08-21 11:12:58 / DSC03420.jpg
2008-08-21 11:13:11 / DSC03421.jpg
2009-08-27 11:20:11 / hash-1.jpg
2009-08-27 11:20:04 / hash.jpg

Il convient d’indiquer à SPIP qu’il s’agit d’un itérateur PHP, en indiquant (php:...) avant le nom de l’itérateur.

Le critère {args xx,yy} définit les arguments que l’on va passer à l’itérateur lors de son initialisation. Pour DirectoryIterator, il s’agit du chemin du répertoire à lister.

Les méthodes de cet itérateur (cf. http://php.net/manual/fr/class.directoryiterator.php) sont disponibles sous forme de balises (ici, #GETMTIME).

Remarque : pour lister le contenu d’un répertoire, le format glob de la boucle (DATA) est sans doute plus facile à utiliser que cet itérateur PHP.

<BOUCLE_ls(DATA){source ls, IMG/jpg/*.jpg}
{!par mtime}> ...

Un calendrier au format iCalendar/ics

Cette fonctionnalité nécessite l’activation du plugin iCalendar. Il est alors possible d’itérer sur les événements d’un calendrier publié au format iCalendar/ics. L’article consacré sur SPIP-Contrib au plugin icalendar donne un exemple complet.

Un document Google (spreadsheet)

Dans Google Documents il est possible de « Partager > Publier un document ». Une fois cela fait, on peut récupérer l’adresse du document au format CSV, et l’afficher sous forme de table HTML.

Boucle :

  1. #SET{key,0AolUP3c6K9JodGwxRjJzb2hyTGZLU29qRVItRXk1VXc}
  2. <B_csv>
  3. <table border="1">
  4. <BOUCLE_csv(DATA){source csv, https://spreadsheets.google.com/pub?key=#GET{key}&hl=en&dsds&output=csv}
  5. >
  6. <tr>
  7. <td>#VALEUR{0}</td>
  8. <td>#VALEUR{1}</td>
  9. <td>#VALEUR{2}</td>
  10. </tr>
  11. </BOUCLE_csv>
  12. </table>
  13. </B_csv>

Résultat :

Pays PIB Population
Rémitanie 12 1
Baldoghistan 23 2
Républiques Unies 43 3
Diloduristan 12 4
Zarlatie 9 5

D’autres modes d’extraction sont possibles, notamment sous forme de liste, ou de cellules :

Liste :

Rémitanie  pib: 12, population: 1
Baldoghistan  pib: 23, population: 2
...

Cellules :

A2: Rémitanie
B2: 12
C2: 1
A3: Baldoghistan
B3: 23
C3: 2
...

 

Notes

[1Pour vous aider à déterminer le datapath, vous pouvez visualiser le tableau des résultats en insérant le code [<pre>(#VALEUR|print_r{1})</pre>] dans votre boucle data/


Voir le squelette de cette page Site réalisé avec SPIP | Espace de traduction | Espace privé