Attention, ceci est l'archivage statique d'un ancien site qui a maintenant disparu. En savoir plus.

Bienvenue sur , le recueil de réflexions et créations en tous genres de Nicolas Hoizey, passionné de Web depuis 1996, co-créateur et Directeur de l’Innovation de Clever Age, photographe amateur, créateur du jeu HTML5 / SVG « esviji », etc.

Amusons nous avec des boucles SPIP et les petits nouveaux #GET, #SET et #ARRAY

Publié le

par Nicolas Hoizey,

tagué astuce et SPIP

et commenté 13 fois

Je suis tombé il y a quelque temps sur une problématique que je n’avais jamais rencontrée au cours de mes nombreuses expériences avec SPIP, et il s’avère qu’une solution très élégante est possible en n’utilisant que la syntaxe de SPIP, là où il aurait fallu, il n’y a pas si longtemps que cela, utiliser du code PHP dans le squelette. Suivez le guide...

Imaginez que vous ayez dans votre site de nombreux sites référencés, avec la syndication activée, et des mots clefs thématiques associés à ces sites. Cela peut vous rappeler Sedna, sauf que les mots clefs peuvent être multiples pour un site alors que Sedna utilise des rubriques, forcément uniques pour chaque site.

Imaginez maintenant que vous souhaitiez afficher dans une page les dernières nouveautés de tous les sites ayant un mot clef donné.

La solution simple — qui fonctionne depuis longtemps avec SPIP — est de lister les sites qui ont le mot clef, et de lister pour chacun les derniers articles syndiqués. Le problème de cette solution, c’est que vous devez vérifier chaque site pour savoir s’il y a du nouveau. Le problème est encore plus grave si vous souhaitez utiliser une pagination, puisqu’elle sera nécessairement sur les sites plutôt que sur les articles syndiqués.

Ma problématique du jour était donc de lister tous les articles syndiqués dans leur ordre chronologique, donc sans devoir passer par les sites au préalable, et voici la solution :

  1. <BOUCLE_mot_courant(MOTS){titre=mot_clef}>
  2. #SET{sites,#ARRAY}
  3. <B_sites>
  4. <BOUCLE_sites(SITES){id_mot}>
  5. [(#SET{sites,[(#GET{sites}|push{#ID_SYNDIC})]})]
  6. </BOUCLE_sites>
  7. <B_derniers_liens>
  8. #ANCRE_PAGINATION
  9. <dt><span>Actualité du Web</span></dt>
  10. <dd id="actu-web">
  11. [(#PAGINATION{accessible})]
  12. <dl>
  13. <BOUCLE_derniers_liens(SYNDIC_ARTICLES){id_syndic IN #GET**{sites}}{pagination 5}{par date}{inverse}>
  14. <dt>#TITRE</dt>
  15. <dd class="origine">Sur <a href="#URL_ARTICLE">#NOM_SITE</a></dd>
  16. <dd class="date">[(#DATE|affdate)]</dd>
  17. [<dd class="auteur"><cite>(#LESAUTEURS)</cite></dd>]
  18. [<dd><blockquote><p>(#DESCRIPTIF)</p></blockquote></dd>]
  19. </BOUCLE_derniers_liens>
  20. </dl>
  21. [(#PAGINATION{accessible})]
  22. </dd>
  23. </B_derniers_liens>
  24. </B_sites>
  25. <//B_sites>
  26. </BOUCLE_mot_courant>

Télécharger

Ce code fonctionne avec SPIP 1.9.2c1, mais ne devrait plus être nécessaire avec SPIP 1.9.3, la boucle SYNDIC_ARTICLES acceptant maintenant le paramètre {id_mot_syndic}2 !

Notes

1A condition d’ajouter le filtre « push », dont voici le code :

  1. function push($array, $val) {
  2. if($array == '' OR !array_push($array, $val)) return '';
  3. return $array;
  4. }

Télécharger

Vos commentaires

  • Le 28 janvier 2008 à 17:32, par Thomas En réponse à : Amusons nous avec des boucles SPIP et les petits nouveaux #GET, #SET et #ARRAY

    J’ai bien peur que le filtre push ne soit compatible qu’en 1.9.2 SVN car je n’ai pas l’impression que cela fonctionne en 1.9.2c ou 1.9.2d :(
    J’ai même essayé array_push en vain...

  • Le 30 janvier 2008 à 09:02, par Nicolas Hoizey En réponse à : Amusons nous avec des boucles SPIP et les petits nouveaux #GET, #SET et #ARRAY

    Je fais marcher ce code sur une 1.9.2c, je t’assure !

  • Le 12 février 2008 à 13:23, par ? En réponse à : Amusons nous avec des boucles SPIP et les petits nouveaux #GET, #SET et #ARRAY

    J’utilise un tableau pour utiliser le critère "IN" dans une boucle et pour ma part il m’indique :

    Erreur : filtre « push » non défini

     :/
    J’ai l’impression d’avoir le même problème... je sais qu’il n’y a pas d’erreur de saisie et ma version SPIP est la 1.9.2d sur un serveur local MAMP.

  • Le 12 février 2008 à 13:37, par Nicolas Hoizey En réponse à : Amusons nous avec des boucles SPIP et les petits nouveaux #GET, #SET et #ARRAY

    Je viens de comprendre, le filtre « push » que j’utilise est en fait celui présent dans le plugin « nuage » ! ;-)

    J’ajoute son code à l’article.

  • Le 12 février 2008 à 13:45, par ? En réponse à : Amusons nous avec des boucles SPIP et les petits nouveaux #GET, #SET et #ARRAY

    Merci ! Ça va me sauver la vie ! :)

  • Le 12 février 2008 à 15:52, par ? En réponse à : Amusons nous avec des boucles SPIP et les petits nouveaux #GET, #SET et #ARRAY

    Un dernier commentaire pour donc indiquer que cela a déverrouillé mon travail sur 2 sites internet... Sur chacun d’eux, le but pour moi était de lister un certain type de rubriques (avec différents médias "texte", "photo", "vidéo" représentés par des articles) dans un tableau, un tableau de type #ARRAY essentiel pour filtrer ces rubriques avec le critère IN et la fonction #GET dans des zones précises d’affichage du site.

    Cela m’évite de devoir affecter un mot clé par article (que l’utilisateur du site aurait dû systématiquement renseigner)... du coup j’utilise astucieusement le #DESCRIPTIF des rubriques pour créer les listes "texte", "photo", "vidéo" à l’aide de boucles RUBRIQUES en faisant du "push" dans des variables #ARRAY... ensuite je récupère la variable désirée pour créer des boucles qui filtrent le type de média voulu.

    Depuis que la fonction "push" a rejoint mon petit fichier "mes_fonctions.php" dans le dossier squelette... tout roule à merveille !

    Un grand merci encore et encore... :)

    PS : je suis bavard, mais c’est pour en aider d’autres comme moi lorsque Google aura mis les pieds ici... ;)

  • Le 9 octobre 2008 à 17:20, par Mortimer En réponse à : Amusons nous avec des boucles SPIP et les petits nouveaux #GET, #SET et #ARRAY

    Pour éviter que ça plante quand il n’y a pas de résultat dans la boucle de sélection _sites, il vaut mieux ajouter :

    1. [(#SET{sites,[(#GET{sites}|push{0})]})]

    juste après

    1. #SET{sites,#ARRAY}

    sinon spip génère une requête erronée (un bug peut être).

  • Le 19 janvier 2009 à 23:55, par Jean-no En réponse à : Amusons nous avec des boucles SPIP et les petits nouveaux #GET, #SET et #ARRAY

    Un peu hard la lisibilité de la page ! Pensez aux vieux, bande de sales jeunes :-)
    Je cherche à comprendre comment utiliser les données de spip sans passer trop par ces boucles infernales et limitées. Je pressens que #get, #set et #array ont un rapport avec mes problèmes. Mais tout bêtement, existe-t-il un "if" ?

  • Le 5 décembre 2009 à 07:54, par gauste En réponse à : Amusons nous avec des boucles SPIP et les petits nouveaux #GET, #SET et #ARRAY

    5 décembre 2009 :
    Le code noir ou foncé sur fond noir de ce site est illisible !

  • Le 5 décembre 2009 à 08:00, par Stéphane Santon En réponse à : Amusons nous avec des boucles SPIP et les petits nouveaux #GET, #SET et #ARRAY

    Il faudrait préciser que dans le cas où il y a une partie conditionnelle sur la boucle, il ne faut pas mettre l’initialisation du tableau dedans :

    Ne fonctionne pas :

    <B_sites>
            #PAGINATION
            #SET{sites,#ARRAY}
    <BOUCLE_sites(SITES){id_mot}>
            [(#SET{sites,[(#GET{sites}|push{#ID_SYNDIC})]})]
    ...

    Correct :

            #SET{sites,#ARRAY}
    <B_sites>
            #PAGINATION
    <BOUCLE_sites(SITES){id_mot}>
            [(#SET{sites,[(#GET{sites}|push{#ID_SYNDIC})]})]
    ...
  • Le 7 décembre 2009 à 10:47, par Nicolas Hoizey En réponse à : Amusons nous avec des boucles SPIP et les petits nouveaux #GET, #SET et #ARRAY

    Ouh la la, effectivement, les styles de geshi ont dû changer, c’était beaucoup mieux avant !!! Désolé, je vais changer la couleur de fond du code...

  • Le 22 décembre 2009 à 09:45, par Nicolas Hoizey En réponse à : Amusons nous avec des boucles SPIP et les petits nouveaux #GET, #SET et #ARRAY

    Un peu hard la lisibilité de la page ! Pensez aux vieux, bande de sales jeunes :-)

    Voilà qui devrait être bien mieux, si c’est bien des couleurs du code qu’il s’agissait !

    tout bêtement, existe-t-il un "if" ?

    Le "if" est représenté sous différentes formes :
    * Pour afficher du contenu si une balise, éventuellement filtrée, n’est pas vide :
    [Contenu conditionnel avant(#BALISE|filtre)Contenu conditionnel après)]
    * Pour afficher du contenu si une boucle renvoie au moins un élément :

    1. <B_boucle>
    2. Contenu conditionnel avant
    3. <BOUCLE_boucle(STRUCTURE){paramètre}>
    4. Contenu bouclé
    5. </BOUCLE_boucle>
    6. Contenu conditionnel après
    7. </B_boucle>
    8. Contenu si pas d'éléments
    9. <//B_boucle>

    Télécharger

    * Sinon, voir aussi le type de boucle CONDITION du plugin Bonux

  • Le 26 juin 2013 à 15:18, par Max B. En réponse à : Amusons nous avec des boucles SPIP et les petits nouveaux #GET, #SET et #ARRAY

    Super article :)