Les Itérateurs pour SPIP 2.1

Les itérateurs sont une fonctionnalité de la branche SPIP 3.*. Ils permettent de faire des boucles non plus seulement sur des articles et autres objets de la base de données SQL de SPIP, mais sur n’importe quoi : fichiers, tableaux de données, web services, etc. En savoir +

Ce plugin met cette fonctionnalité à disposition dans SPIP 2.1. Prenez le temps de lire la documentation et de regarder les nombreuses démos disponibles dans le plugin « Démos des itérateurs ».

Voici quelques exemples des boucles que permettent les itérateurs de SPIP :

  • lire un tableau de données produit par une fonction quelconque
  • afficher le contenu d’un fichier local au format XML, CSV, JSON, YAML, iCalendar, etc.
  • boucler sur la liste des fichiers présents dans un répertoire du serveur
  • faire une requête sur un webservice et afficher les résultats.

Concrètement, on peut sans grand effort faire des boucles « Web 1.0 » sur toutes sortes de fichiers déposés sur le serveur. On peut aussi boucler en « Web 2.0 » sur des vidéos YouTube, sur des photos Flickr, des livres (par titre ou par numéro ISBN), sur des requêtes de traduction sur google.translate, sur un tableur édité sur Google Documents, etc.

Pour ne prendre qu’un seul exemple, voici une boucle qui permet d’afficher le contenu d’un tableur Google Documents :

Boucle :

[(#REM) Identifiant de notre tableur]
#SET{key,0AolUP3c6K9JodGwxRjJzb2hyTGZLU29qRVItRXk1VXc}
<B_csv>
<table>
<BOUCLE_csv(DATA)
{source csv, https://spreadsheets.google.com/pub?key=#GET{key}&hl=en&output=csv}>
<tr>
<td>#VALEUR{0}</td>
<td>#VALEUR{1}</td>
<td>#VALEUR{2}</td>
</tr>
</BOUCLE_csv>
</table>
</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

Ce plugin a été intégré dans SPIP 3 : https://www.spip.net/fr_article5444.html

Les liens de la documentation originale/officieuse (et en version bêta) :

 

Si vous utilisez ce plugin, n’hésitez pas à partager dans le forum ci-dessous vos formats, et toutes vos astuces pour boucler sur différents services et fichiers.

Dernière modification de cette page le 14 décembre 2018

Discussion

24 discussions

  • 2

    Bonjour,
    Je suis intéressé par les boucles des itérateurs pour faire une recherche dans un fichier csv (répertoire d’adresses). Que se passe-til si mon tableau comporte des cellules vides ? Comment les exclure de la liste récupérée ? j’ai essayé de créer une liste déroulante qui récupère les noms de mes contacts, mais si une case est vide, le 1er élément de ma liste est une zone vide.
    Merci.

    • Je rejoins cette question avec une nuance dans la demande : dans la boucle DATA, comment peut-on faire pour exclure la 1re ligne de mon fichier, celle qui contient le nom de mes colonnes ? J’ai besoin de ces éléments pour faire ma recherche, mais pas pour construire le menu déroulant de mon formulaire de recherche.
      Et effectivement, si mon csv contient une cellule vide, elle va apparaître dans mon menu déroulant. Le critère fusion me permet de ne pas avoir x cellules vides dans le menu, mais je ne sais pas comment les ignorer carrément.
      Merci !!

    • peut-être avec le critère {cle>0}

    Répondre à ce message

  • 9
    nathbni

    Ce projet est absolument énorme ! Et il ouvre des perspectives hallucinantes.
    Je m’intéresse aux itérateurs (et je n’ai même pas peur, malgré mes très faibles connaissances en programmation !!) et j’ai un pb à vous soumettre.
    Je dispose d’un fichier de stock de pièces (12000 lignes environ) que mon client souhaite mettre en ligne sur son site. Après avoir écumé les solutions de Catalogue (pas adapté car mon client doit mettre à jour son stock quotidiennement et souhaite limiter au max ses interventions) et Fulltext (qui ne fonctionne que sur PDF et ne permet pas de sortir les infos du document pour les afficher) je soupçonne les itérateurs d’être LA solution.

    Je souhaite proposer un module de recherche sur ce fichier (voui voui). J’ai déjà réussi à extraire du stock.csv les données par Fabricant et par Référence, à mettre tout çà dans un joli tableau et géré la pagination. C’est déjà exceptionnel.
    Maintenant, je me dis que ce serait super si je pouvais mettre en place un menu déroulant qui récupèrerait la liste des fabricants présents dans mon fichier (mais un même fabricant peut apparaître jusqu’à 1000 fois, donc il faut certainement exclure les doublons) et un champ input dans lequel on saisirait directement la réf cherchée. Mon résultat serait alors affiché avec ma fameuse boucle !

    Seulement là, je coince très sérieusement... Est-ce que quelqu’un pourrait m’aider ? Parce qu’il faudrait passer le contenu du champ de recherche dans une moulinette que je suis incapable d’écrire...

    Voici donc ma boucle qui va bien :

    <B_csvref>
    <div class="menu">
    <h4><:reference:> (#GRAND_TOTAL)</h4>
    
    <table border="1" width="630px">
    <tr>
    <td><:reference:></td><td><:descriptif:></td><td><:fabricant:></td><td><:quantite-en-stock:></td>
    </tr>
    
         <BOUCLE_csvref(DATA){source csv, #CHEMIN{IMG/csv/stock.csv}}{par /0}{pagination 50}>                                
         <tr>
         <td>#VALEUR{0}</td><td>#VALEUR{4}</td><td>#VALEUR{1}</td><td>#VALEUR{3}</td>
         </tr>
          </BOUCLE_csvref>
    
    </tr>
     </table>
    #PAGINATION
    </div>
    </B_csvref>
    
    (pas de donn&#233;es)
    
    <//B_csvref>

    Et une idée du tableau

    Part_Number Manufacturer Condition Quantity Description Famille sous Famille
    171385-001 HP REF 59 32MB cache Memory SA53xx MEMOIRES cache

    Donc, pour me résumer :
    1. comment éviter les doublons dans la liste de fabricants qui sera présente dans mon menu déroulant ?
    2. euh... comment écrire ce qui doit se passer entre le submit et la page de résultats ?...
    ... :-)

    • nathbni

      Désolée d’avoir posté un message si long...
      J’ai résolu mon histoire de doublons avec le critère fusion ainsi :

      <form action="???" method="get">
      <div>
      [<input type="hidden" name="lang" value="(#ENV{lang})" />]
      <B_csvrecherche>
              <select name="fabricant">
              <BOUCLE_csvrecherche(DATA){source csv, #CHEMIN{IMG/csv/stock.csv}}{par /1}{fusion /1} >                                
                      <option value="#VALEUR{1}">#VALEUR{1}</option>
              </BOUCLE_csvrecherche>
              </select>
              <input type="submit" class="btnsubmit" value="<:info_rechercher:>" title="<:info_rechercher:>" />
      </B_csvrecherche>
      </div>
      </form>

      Reste que je ne sais pas comment pourrait se coder la suite.

    • nathbni

      J’avance !

      Voici le formulaire qui liste mes fabricants :

      <div class="formulaire_spip formulaire_recherche" id="formulaire_recherche">        
      <form action="[(#ENV{action})]" method="get"><div>
              [(#ENV{action}|form_hidden)]
              [<input type="hidden" name="lang" value="(#ENV{lang})" />]
              <B_csvrecherche>
              <select name="fabricant" class="selectfabricant">
              <BOUCLE_csvrecherche(DATA){source csv, #CHEMIN{IMG/csv/stock.csv}}{par /1}{fusion /1} >                                
                     <option value="#VALEUR{1}">#VALEUR{1}</option>
              </BOUCLE_csvrecherche>
              </select>
              <input type="submit" class="btnsubmit" value="" title="<:info_rechercher:>" />
              </B_csvrecherche>
              </div>
              </form>
      </div>

      Du coup, l’item sélectionné est bien passé dans l’url (/spip.php ?page=recherche&fabricant=ASTEC). Maintenant, je dois afficher le résultat dans la page recherche et ma boucle ne fonctionne pas : la réponse est toujours « Recherche infructueuse » :

      [(#REM) Référence de produits trouvees ]
      <B_csvref> 
      #ANCRE_PAGINATION
              <h4>Produits par fabricant (#GRAND_TOTAL)</h4>
                <table border="1" width="630px">
              <tr>
                      <td>Fabricant</td><td>R&eacute;f&eacute;rence</td><td>Descriptif</td><td>Quantit&eacute; en stock</td>
                      </tr>
              <BOUCLE_csvref(DATA){recherche}{source csv, #CHEMIN{IMG/csv/stock.csv}}{par /0}{pagination 50}>                                
                      <tr>
                      <td>#VALEUR{1}</td><td>#VALEUR{0}</td><td>#VALEUR{4}</td><td>#VALEUR{3}</td>
                      </tr>
              </BOUCLE_csvref>
              </tr>
                  </table>
                  [<p class="pagination">(#PAGINATION)</p>]
                 </B_csvref> 
       (Recherche infructueuse)
      <//B_csvref>

      Comment relier la valeur transmise dans l’url dans cette boucle d’affichage ? Merci d’avance !

    • nathbni

      Et puis, j’ai un autre soucis, de taille celui-là : un csv de 12000 lignes, c’est lourd ! et j’ai des « Fatal error : Maximum execution time of 30 seconds exceeded in /var/www/n/na/nat/nathalie.brunelli.perso.sfr.fr/public_html/plugins/auto/iterateurs/inc/csv.php on line 37 » !
      Bon allez, je vous laisse la main pour la réponse, maintenant !!

    • bien donc… pour le timeout… si tu veux un truc super qui fasse tout sur un hébergement gratuit et en moins de 30 secondes, ça risque d’être coton :-)

      Pour la recherche par fabricant, essaie d’ajouter dans la définition de ta boucle le critère optionnel {fabricant?} ; il se pourrait que ça fonctionne.

    • Bonjour Fil et merci pour ton aide.
      Pour ce qui est du serveur actuel, c’est un hébergement de tests. Au final, mon site sera sur un hébergement pro.
      J’ai donc réduit la taille du csv pour mes tests et je n’ai plus de pb.

      Pour l’essai avec {fabricant?}, çà ne fonctionne pas. Mais je peux récupérer la variable de l’url pour l’affichage du titre de ma page ainsi :

      #SET{fabricant,#ENV{fabricant}} 
                      <h4>Produits par fabricant : #GET{fabricant}</h4>

      Est-ce que cette variable pourrait être utilisée dans ma boucle ? Comment l’écrire dans ce cas ?
      Merci à toi.

    • Oui dans ce cas tu peux tenter {fabricant=#ENV{fabricant}}.

    • çà ne marche pas avec <BOUCLE_csvref(DATA){source csv, #CHEMIN{IMG/csv/stock.csv}} {fabricant=#ENV{fabricant}} {par /0} {pagination 50}> ou <BOUCLE_csvref(DATA){source csv, #CHEMIN{IMG/csv/stock.csv}}  {fabricant=#GET{fabricant}} {par /0}{pagination 50}> (-> recherche infructueuse) mais par contre, le tableau apparait quand je mets ceci :

      <BOUCLE_csvref(DATA){source csv, #CHEMIN{IMG/csv/stock.csv}, #GET{fabricant}} {par /0}{pagination 50}> 
                      <tr>                                
                      <td>#VALEUR{1}</td><td>#VALEUR{0}</td><td>#VALEUR{4}</td><td>#VALEUR{3}</td>
                     </tr>
      </BOUCLE_csvref>

      Mais le contenu du tableau est vide. On avance, non ?

    • Je suis désolée de vous embêter avec mon pb, mais je ne trouve pas comment afficher mon tableau de résultat de recherche. Pour résumer, j’ai bien le nom de mon fabricant dans l’URL, que je stocke dans une variable. Mais je n’arrive pas à afficher un tableau qui ne récupèrerait que les valeurs associées au nom de mon fabricant récupéré.
      La boucle ci-dessus est la dernière étape atteinte.
      J’ai vu qu’il existe des éléments d’appel (datapath ou cle). Est-ce que la même chose existe pour un fichier csv ? ou dois-je convertir mon stock Excel dans un autre format ?
      Mille mercis pour votre aide.

    • Problème résolu gràce à la disponibilité de Fil. Merci encore à lui. Voici la boucle qui permet d’afficher les résultats d’une recherche dans un fichier CSV :

      On récupère ci-dessous la valeur transmise dans l’URL :
      #SET{fabricant,#ENV{fabricant}}

      puis :
      <BOUCLE_csvref(DATA){source csv, #CHEMIN{stock/nomfichier.csv}} {fabricant=#GET{fabricant}} {par /0}{pagination 50}>

      Elle permet de chercher dans
      ?page=recherche&fabricant=nomfabricant

      D’après les précieux conseils de Fil, en utilisant == plutôt que = , au lieu de chercher
      un fabricant par son nom précis, on recherche par une sous-partie du nom (exemple pour le fabricant 3COM , &fabricant=3C donnera 3COM).

      <BOUCLE_csvref(DATA){source csv, #CHEMIN{stock/nomfichier.csv}} {fabricant==#GET{fabricant}} {par /0}{pagination 50}>
      Question résolue !

    Répondre à ce message

  • Bonjour à tous

    je bute sur un problème :

    Quid du critere IN avec la boucle (DATA) concernant un scv ?

    En effet, val IN #ENVval ne fonctionne pas (#ENVval est un tableau
    Par contre bien sur val =#ENVval fonctionne tant que #ENVval ne contient qu’une valeur.

    Pour être plus précis, avec le critère IN, la boucle retour tous les résultats.

    Avez-vous une idée du problème ?

    Merci

    samsam

    Répondre à ce message

  • 2

    Salut !
    J’ai quelques difficultés à utiliser ce plugin sur des tableaux. Par exemple, le code ci-dessous ne donne aucun résultat de boucle :

    [(#SET{categories, #ARRAY{1,categorie 1,
    						2,categorie 2,
    						3,categorie 3,
    						4,categorie 4,
    						5,categorie 5}})]
    						
    <BOUCLE_categories(DATA){source tableau, #GET{categories}>
    	<h2>#VALEUR</h2>
    	[...]
    </BOUCLE_categories>

    Faut-il impérativement déclarer un tableau php global ?

    • Pas de problème ici... (il manque un } fermant...)

      1. <BOUCLE_categories(DATA){source tableau, #GET{categories}}>
    • Seigneur, quelle honte ^^"
      Comme quoi parfois il faut décrocher deux minutes et sortir le nez de son code sinon on ne voit rien...
      En tout cas, voilà un super plugin qui nous rapproche un peu plus d’une syntaxe full SPIP.
      C’est du beau travail !

    Répondre à ce message

  • 2
    Michel Pagès

    Bonjour,

    Je souhaite installer la dernière version de ckeditor sur mes sites spip hébergés chez Free. J’ai bien noté qu’Itérateurs demandait la version 5.1 de PHP. Or le phpinfo de Free indique la version 4.4.3-dev. J’obtiens donc la même erreur que beaucoup « à la ligne 32 ».

    Que faire d’après vous ?
    Merci par avance !!!
    Michel

    • Au hasard, chercher « php5 free.fr » sur un moteur de recherche... Tout est expliqué...

    • Michel Pagès

      Merci beaucoup, ça fonctionne !

    Répondre à ce message

  • 4

    Bonjour à tous,
    Je voulais installer dans mon spip 2.1.8 le plugin ckeditor dans ca version 3.4.2 mais il me demande l’installation du plugin ITERATEURS version 0.2.4 mini.
    J’ai donc installé ce plugin dans sa version 0.2.5. Mais dès que je l’active je perd la mise en plage et en bas de page j’ai le message d’erreur suivant :

    1. Parse error: syntax error, unexpected '&', expecting T_VARIABLE or '$' in /homez.218/XXXXXX/www/test/plugins/auto/iterateurs/iterateurs_fonctions.php on line 32

    J’ai modifier une partie du chemin par des XXX pour plus de confidentialité.
    Avez vous une idée pour résoudre ce problème ?
    Merci d’avance ci vous avez une idée, car les fonctionnalités permise par ce plugin me semble pouvoir faire passer une grande étape à spip dans son développement.
    A+

    Répondre à ce message

  • 12

    Bonjour, et merci pour ce formidable outil !

    Juste une remarque :
    Une fois activé sur une 2.1.0, il semble y avoir un problème sur la gestion des fichiers lang.
    En effet, certains textes sont modifiés, comme par exemple :

    « texte modifier article » au lieu de « Modifier l’article : » dans la page exec=articles_edit
    Ou encore les boutons d’admin en public, comme « admin recalculer » au lieu de « recalculer cette page ».

    Je vais jeter un coup d’oeil, mais si vous avez une piste...

    • Peux-tu confirmer que cette erreur est liée au plugin ? Je n’ai rien de tel chez moi.

    • Oui oui, en le désactivant, tout reviens dans l’ordre.
      C’est peut-être du à une incompatibilité avec un autre plugin ?

    • Par ailleurs cela provoque des pétouilles avec le plugin forms&table(3.0.5), peut-être que l’incompatibilité vient de la...

    • En fait non, désactiver le plugin form & table ne change rien...

    • J’ai fait quelque tests sur plusieurs sites (de version différentes ), et le problème se reproduit à chaque fois, même sans autre plugin...

      Je suis le seul à avoir ce souci ? c’est curieux quand même non ?

      Du coup j’ai du le désactiver...
      C’est pourtant un outil génial, j’aimerais juste savoir par ou commencer à chercher...les surcharge de public/ ?

      Sam

    • Alors pour répondre à ta question : quelqu’un a eu le problème (akilo) mais pas avec les Itérateurs ! Il a eu le problème, comme ça, sans raison apparente, sans plugin, sur quelques chaines de langues de SPIP. De mémoire il a corrigé en réinstallant les fichiers de SPIP.

      Pourrais tu nous dire ta version de PHP ? (exec=info dans le privé)

    • Bonjour Matthieu,
      Ma version est la 5.1.6, j’ai testé et rencontré le même problème avec la 5.2.11...et c’est vraiment vraiment lier au plugin iterateur...

    • C’est toi sur la liste spip-zone ou c’est quelqu’un qui a le même souci ? http://thread.gmane.org/gmane.comp.web.spip.zone/21736

      C’est peut être un problème de mémoire insuffisante ? ou de perte de langue parfois avec itérateurs ?

    • Tu testeras la version 0.2.4, sait-on jamais :)

    • @matthieu : C’est bien quelqu’un d’autre sur spip-zone et j’ai aussi le même souci que Yffic.
      Je vais vite tester la mise à jour

    • Pas mieux pour moi en 0.2.5... :(
      Concernant la mémoire, mon serveur est assez bien pourvu, donc je ne pense pas.

    • Alors résultat des courses :
      Fonctionne à partir de la 2.1.6
      Pour les sites antérieurs, rien à faire...

    Répondre à ce message

  • Que de belles promesses avec ce plugin pour nos sites. Bravo.

    J’ai tout de même d’ors et déjà 2 interrogations :
    -  Tout comme son ancêtre boucle_xml, est-il possible ou pas d’interroger des xml « distants », c’est à dire en mentionnant un lien http plutôt qu’une #CHEMINfichier_local.xml dans la boucle ? Astuces ? Hack ? Parce qu’en l’état, j’ai testé et ça me retourne un String could not be parsed as XML alors que le même fichier en local au moins ne fait pas râler spip.

    -  et deuxièmement, mais je n’ai peut-être pas encore tout assimilé, on peut utiliser un #TOTAL_BOUCLE pour compter le nombre d’occurences dans un fichier xml. Je suis tout sauf fortiche en XML, si vous avez un exemple de boucles qui feraient ça, je suis preneur.

    Répondre à ce message

  • Bonjour,
    j’ai installe le plugins dans spip2.1.8 et j’ai le message suivant
    Parse error : parse error, expecting `T_VARIABLE’ or `’$’’ in j :\serveur_eval\www\spipvttl\plugins\auto\iterateurs\iterateurs_fonctions.php on line 32

    Répondre à ce message

  • 3

    Hello

    J’essaye d’insérer le formulaire issu du plugin Contacts Avancés dans un article en mettant dans la zone texte :

    <formulaire|contact>

    Avec uniquement « Contacts Avances » et Bonux, le formulaire s’affiche. Si j’active Iterateur, ca m’affiche ceci :

    <?php include_once("./" . _DIR_RACINE . "ecrire/balise/formulaire_.php"); if ($lang_select = "fr") $lang_select = lang_select($lang_select); inserer_balise_dynamique(balise_FORMULAIRE__dyn('FORMULAIRE_CONTACT'), array('', '', '', '', 'fr')); if ($lang_select) lang_select(); ?>

    Spip et plugins svn frais d’hier

    Répondre à ce message

Ajouter un commentaire

Qui êtes-vous ?
  • [Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom