Voorbeelden met BOUCLE(DATA)

Enkele voorbeelden van (DATA) Lussen die mogelijk worden gemaakt dankzij de iterators vanSPIP.

Voor meer uitgebreide voorbeelden kun je kijken op de site SPIP Loves OpenData

  • Apparu en : SPIP 3.0

Lussen op een tabel

Je kunt een DATA lus maken op een tabel die door de volgende bakens wordt geretourneerd: #ARRAY, #GET, #SESSION, enz.

Lus:

<BOUCLE_sessie(DATA){source tableau,#SESSION}>
#CLE: #VALEUR <br />
</BOUCLE_sessie> 

of bijvoorbeeld op een tabel met trefwoorden:

<BOUCLE_tref(DATA){source tableau,#GET{trefwoorden}}>
#VALEUR 
</BOUCLE_tref> 

Een lijst van actieve plugins

Bij het formaat plugins hoef je verder niets aan te geven.

Lus:

<BOUCLE_pl(DATA){source plugins}>
#VALEUR
</BOUCLE_pl>

Resultaat (bijvoorbeeld):

crayons memoization icalendar

De «versies» van de configuratie weergeven: voorwaarde {cle==...}

Deze lus itereert op het baken #CONFIG dat alle elementen van de configuratie van de site bevat (zoals deze staan opgeslagen in de tabel spip_meta).

Omdat het baken #CONFIG een gegevenstabel vertegenwoordigt, gebruiken we het formaat table. Een voorwaarde {cle==version} filtert de tabel en selecteert alleen de configuratie-elementen waarvan de sleutelwaarde het woord « version » bevatten.

Lus:

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

Resultaat:

version_installee
16428
revisions_base_version
1.1
Indexation_base_version
0.4
...

De voorwaarde {liste ...}

Is onze tabel van gegevens een eenvoudige lijst van waardes die we handmatig willen aangeven, dan kan aan de lus (DATA) de voorwaarde {liste ...} worden meegegeven. De voorwaarde wordt gevolgd door een lijst van elementen die ondeling door een komma worden gescheiden.

Lus:

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

Resultaat:

18 21 24
24 28 32
30 35 40

Opmerking: Er werd gebruik gemaakt van #_i:VALEUR om in de lus j te verwijzen naar de waarde in lus i.

Een CSV-bestand

We gaan nu een bestand in CSV-formaat gebruiken dat op de harde schijf staat. Het bestand adressen.csv bevat een adreslijst:

Fil,Philippe,fil@rezo.net,http://rezo.net/
Marcimat,Matthieu,marcimat@rezo.net,http://marcimat.magraine.net/

Lus:

<BOUCLE_csv(DATA){source csv, adressen.csv}
{par /3}
{"<br />"}>
#VALEUR{0}: #VALEUR{3}
</BOUCLE_csv>

Resultaat:

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

Opmerking: de voorwaarde {par /3} geeft aan dat op de derde kolom moet worden gesorteerd, het webadres. De voorafgaande / is verplicht wanneer op een numerieke sleutelwaarde of een waarde beginnend met een cijfer moet worden gesorteerd.

De inhoud van een map weergeven

De PHP functie glob() maakt de selectie van bestanden mogelijk aan de hand van een masker. Ze kan worden gebruikt voor de lus (DATA).

Lus (de bestanden in map /IMG/jpg/ met extensie jpg):

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

Resultaat:

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

De plugin.xml van de site weergeven

De functiepreg_files van SPIP maakt het opsommen van bestanden mogelijk volgens een regexp en in boomvormige weergave. Ze is veelzijdiger, maar trager dan glob.

Lus:

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

Resultaat:

../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

Een webservice in YAML-formaat

De site http://per.sonn.es/ biedt een API waarmee ieder profiel in YAML-formaat te lezen is. We gaan dus deze site als webservice gebruiken om een lijst van vrienden van de betreffende persoon (Ikke) weer te geven.

We beginnen met de analyse van het profiel (op het adres http://per.sonn.es/Ikke.yaml) :

name: Ikke
sex: F
birthday: '1966-08-17'
job: Schrijver
friends:
  - 'Maude Guérin'
  - 'Zohra Robin'
  - 'Pierre-Yves Philippe'
  - 'Lauriane Bertin'
  - 'Jeannine Pichon'
  - 'Vanessa Michel'
  - 'Wendy Allard'
...
city: 'Moulins (Allier)'

Verander je dit adres met het formaat yaml, dan krijg je een redelijk complexe tabel van gegevens. Sommige gegevens bestaan uit één of meer tekens, andere (zoals de namen van de vrienden) zijn tekenreeksen.

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

We gaan de gegevens doorlopen met lus:

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

Resultaat:

name
Ikke
sex
F
birthday
1966-08-17
job
Schrijver
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
...

Nu willen we lussen op de vrienden van Ikke. Daarvoor bestaan twee mogelijkheden. De eerste is de gegevens ophalen met onze lus (DATA) in het formaat yaml, en vervolgens de tabel van vrienden in een variabele opslaan die we vervolgens met een volgende lus (DATA) uitlezen, in dat geval in het formaat table:

Lus:

<BOUCLE_yaml2(DATA){source yaml, http://per.sonn.es/Ikke.yaml}{cle=friends}>
  <BOUCLE_friends(DATA){source table, #VALEUR}{" - "}>
    #VALEUR
  </BOUCLE_friends>
</BOUCLE_yaml2>

Resultaat:

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

De voorwaarde {datapath ...}

Je ziet hierboven goed dat hoe ingewikkelder de tabel is, hoe moeilijker het wordt ermee te werken. Daar komt de voorwaarde {datapath ...} dan ook goed van pas. Ze geeft aan de lus (DATA) het pad (in de betekenis van Xpath) naar de gegevenstabel die we willen gebruiken [1].

Met dit baken wordt onze lijst van vrienden weergegeven als een enkele lus (en kun je gemakkelijk een pagination invoegen):

Lus:

<BOUCLE_yaml3(DATA)
  {source yaml, http://per.sonn.es/Ikke.yaml}
  {datapath friends}
  {" - "}{pagination 10}
>
  #VALEUR
</BOUCLE_yaml3>
#PAGINATION
</B_yaml3>

Resultaat:

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 | ...

Een XML-bestand

De plugin «citations aléatoires» op SPIP-Zone bevat een bestand met citaten in XML-formaat (http://zone.spip.org/trac/spip-zone/browser/_plugins_/citation_aleatoire/trunk/citations/citations_fr.xml). De lus (DATA) kan deze direct benaderen:

Lus:

[(#REM) Haal het bestand als tekstbestand op - het kan beter op de lokale server staan ]
[(#SET{c,http://zone.spip.org/trac/spip-zone/browser/_plugins_/citation_aleatoire/trunk/citations/citations_fr.xml?format=txt})]

<dl>
<BOUCLE_cite(DATA)
{source xml, #GET{c}}
{par hasard}{0,1}
>
[<dt>(#VALEUR{0/auteur/0})</dt>]
[<dd>(#VALEUR{0/texte/0})</dd>]
</BOUCLE_cite>
</dl>

Resultaat (dus willekeurig):

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

Een webservice gebruiken als YQL — Yahoo Query Language)

YQL is een webservice waarmee op eenvoudige wijze allerlei sites kunnen worden opgevraagd, zoals google, twitter, flickr, enz. Met de lus (DATA) maakt SPIP de integratie als een lus mogelijk: vgl. http://zzz.rezo.net/Exemples-de-bou....

De PHP iterators

SPIP kan standaard PHP iterators gebruiken. Het volstaat om hun documentatie te lezen en te verifiëren of deze iterators op jouw systeem beschikbaar zijn.

Kijk bijvoorbeeld naar DirectoryIterator, waarmee de bestanden in een map kunnen worden weergegeven:

Lus:

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

Resultaat:

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

Het volstaat om aan SPIP aan te geven dat het om een PHP iterator gaat met de indicatie (php:...) vóór de naam van de iterator.

De voorwaarde {args xx,yy} definieert de argumenten die aan de iterator moeten worden doorgegeven. Voor DirectoryIterator is dat het pad naar de weer te geven map.

De methodes van deze iterator (vgl. http://php.net/manual/en/class.directoryiterator.php) zijn als bakens beschikbaar (in ons voorbeeld #GETMTIME).

Opmerking: Om de inhoud van de map weer te geven is het formaat glob van de lus (DATA) ongetwijfeld gemakkelijker te gebruiken dan deze PHP iterator.

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

Een kalender in formaat iCalendar/ics

Voor deze functie moet de plugin iCalendar geactiveerd zijn. Vervolgens kun je itereren op evenmenten in een kalender die in het formaat iCalendar/ics is gepubliceerd. Een volledig voorbeeld vind je in een artikel op SPIP-Contrib over plugin icalendar.

Een Google document (spreadsheet)

In Google Documents kun je een document «delen». Vervolgens kun je het ophalen in CSV-formaat en als HTML-tabel weergeven.

Lus:

#SET{key,0AolUP3c6K9JodGwxRjJzb2hyTGZLU29qRVItRXk1VXc}
<B_csv>
<table border="1">
<BOUCLE_csv(DATA){source csv, https://spreadsheets.google.com/pub?key=#GET{key}&hl=en&dsds&output=csv}
>
<tr>
<td>#VALEUR{0}</td>
<td>#VALEUR{1}</td>
<td>#VALEUR{2}</td>
</tr>
</BOUCLE_csv>
</table>
</B_csv>

Resultaat:

Land BNP Inwoners
Remitanië 12 1
Baldoghistan 23 2
Verenigde Republieken 43 3
Diloduristan 12 4
Zarlatië 9 5

Je kunt de opgehaalde gegevens natuurlijk ook anders weergeven, zals in een lijst of als cellen:

Lijst:

Remitanië  BNP: 12, inwoners: 1
Baldoghistan  BNP: 23, inwoners: 2
...

Cellen:

A2: Remitanië
B2: 12
C2: 1
A3: Baldoghistan
B3: 23
C3: 2
...

 

Voetnoot

[1Om dit datapad te bepalen, kun je de tabel met resultaten weergeven door de code [<pre>(#VALEUR|print_r{1})</pre>] in te voegen in de lus (DATA).

Auteur Hanjo Gepubliceerd op: Aangepast: 21/03/23

Vertalingen: English, français, Nederlands