De iterators van SPIP - de lus (DATA)

In SPIP 3.0 wordt een veralgemening van de lus (DATA) doorgevoerd.

  • Apparu en : SPIP 3.0

De lussen (DATA) kunnen vanaf SPIP 3.0 niet uitsluitend op SQL queries worden toegepast, maar op alles gegevenslijsten, zoals:
— een tabel van gegevens die door een functie werd opgebouwd (waaronder de iterators van PHP);
— de inhoud van een bestand in het formaat XML, CSV, JSON, YAML, enz.
— een lijst bestanden in een map op de server;
— een query op een webservice;
— een SQL query (waaronder door SPIP berekende);
— enz. (LDAP...).

Syntax en formaten van de lus (DATA)

Deze lus kan iedere tabel met data itereren. Zijn basissyntax is als volgt:

<BOUCLE(DATA) {source ...}> #BALISES </BOUCLE>

De voorwaarde {source formaat, gegevens} bepaalt op welke data de lus gaat itereren.

De definitie van de gegevensbron vereist twee elementen:

— het element gegevens: dit element kan van verschillende types zijn:
-  een gegevenstabel, bijvoorbeeld #ENV*;
-  het adres van een bestand op een harde schijf, bijvoorbeeld sources/definitions.csv;
-  de URL van een bestand of een webservice, zoals: http://per.sonn.es/bases/phobia.fr.yaml;
-  ofwel een string waarvan het formaat kan worden omgezet in een gegevenstabel, zoals: "select * from flickr.photos.search where text='spip'"

— het element formaat is één van de volgende:
-  table (alias array of tableau) voor een eerder gemaakte tabel;
-  csv, json, yaml voor een bestand in één van deze formaten;
-  file voor de regels in een bestand;
-  glob of pregfiles voor een lus op de bestanden van een map (en meer...)
-  rss (alias atom) voor een nieuwsfeed;
-  plugins voor de lijst van op de site actieve plugins;
-  yql om een query naar de webservice van Yahoo Query Language te sturen;
-  sql voor het sturen van een query naar de SQL server (gebruik: {source sql, connecteur:query} voor een externe database);
-  ics voor een lus op een kalender (de plugin icalendar is vereist: lees Plugin iCalendar)
-  enz.

Al deze formaten zijn standaard beschikbaar en je kunt er eenvoudig een nieuwe aan toevoegen door middel van een eenvoudige functie inc_FORMAT_to_array($u). Als voorbeeld hier een functie die een JSON bestand omzet in een gegevenstabel:

function inc_json_to_array_dist($u) {
  if (is_array($json = json_decode($u))
  OR is_object($json))
    return (array) $json;
}

Filteren, sorteren, pagina’s, fusie

Filters. Net als SQL lussen, kan een lus (DATA) gefilterd worden met voorwaarden van het type {waarde=x}; de beschikbare bewerkingen zijn =, >, <, >=, <=, == (regexp) en LIKE.

Deze filtering gebeurt niet tijdens de query, maar erna, op de tabel van geselecteerde gegevens.

Sorteren. Sorteren {par xx} is eveneens beschikbaar, inclusief de variant {!par xx} voor een omgekeerde volgorde.

Meerdere pagina’s. De functie pagination om het resultaat over meerder pagina’s te verdelen werkt normaal, net als de offset/limiet {a,b}.

Fusie. De voorwaarde {fusion /x/y} werkt ook. Wanneer bijvoorbeeld een adresbestand in CSV-formaat het emailadres als veld nr 3 heeft, dan kunnen daaruit dubbel emailadressen worden verwijderd:

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

De fusie gebeurt na sortering en behoudt het eerst tegengekomen element. Is op deze manier een tabel gesorteerd {!par date} en vervolgens ontdubbeld op emailadres, dan wordt de meest recente informatie behorend bij dat emailadres aangehouden.

Beveiliging van de door de iterators bewerkte gegevens

De lus (DATA) beschermt automatisch alle ingesloten bakens, omdat de verwerkte gegevens in het algemeen van onbekende oorsprong en potentieel gevaarlijk zijn. Dit heeft ook invloed op formulierbakens (#FORMULAIRE_xx) die dus moeten worden gebruikt met een * zoals uitgelegd in het artikel over bakens met sterren.

<BOUCLE_foreach_protege(DATA){liste a,b,c,d,e}>
    #FORMULAIRE_XXX*{#VALEUR}
</BOUCLE_foreach_protege>

Opgelet: gebruik je de plugin "Bonux", dan kun je gebruik maken van lus (POUR), die zich niet zo gedraagt.

<BOUCLE_Foreach_non_protege(POUR){liste a,b,c,d,e}>
    #FORMULAIRE_XXX{#VALEUR}
</BOUCLE_Foreach_protege>

 

Lees meer in voorbeelden van de lus (DATA)!

Je kunt ook kijken op de mini-site gewijd aan SPIP en het gebruik van de lus DATA
http://spip-loves-opendata.spip.net...

Auteur Hanjo Gepubliceerd op:

Vertalingen: عربي, English, français, Nederlands