Gastero Prod

  • Aller au menu
  • Aller au contenu
  • Aller au pied de page
  • Accueil
  • Blog
  • Photos
  • Liens
  • Lifestream

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

Date de publication
22/janv.
2008
Tags
astuce, SPIP

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 :

<BOUCLE_mot_courant(MOTS){titre=mot_clef}>
  #SET{sites,#ARRAY}
  <B_sites>
  <BOUCLE_sites(SITES){id_mot}>
    [(#SET{sites,[(#GET{sites}|push{#ID_SYNDIC})]})]
  </BOUCLE_sites>
    <B_derniers_liens>
      #ANCRE_PAGINATION
      <dt><span>Actualité du Web</span></dt>
      <dd id="actu-web">
        [(#PAGINATION{accessible})]
        <dl>
          <BOUCLE_derniers_liens(SYNDIC_ARTICLES){id_syndic IN #GET**{sites}}{pagination 5}{par date}{inverse}>
            <dt>#TITRE</dt>
            <dd class="origine">Sur <a href="#URL_ARTICLE">#NOM_SITE</a></dd>
            <dd class="date">[(#DATE|affdate)]</dd>
            [<dd class="auteur"><cite>(#LESAUTEURS)</cite></dd>]
            [<dd><blockquote><p>(#DESCRIPTIF)</p></blockquote></dd>]
          </BOUCLE_derniers_liens>
        </dl>
        [(#PAGINATION{accessible})]
      </dd>
    </B_derniers_liens>
  </B_sites>
  <//B_sites>
</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

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

function push($array, $val) {
    if($array == '' OR !array_push($array, $val)) return '';
    return $array;
}
Télécharger

[2] Voir le commit SVN 11019.

Commentaires

Commenter ce billet

RSS

Commentaires déjà déposés

  • 28 janvier 2008 à 17h32
    Commentaire de Thomas

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

    Répondre à ce message

    • 30 janvier 2008 à 09h02
      Commentaire de Nicolas Hoizey

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

      Répondre à ce message

      • 12 février 2008 à 13h23
        Commentaire d'un anonyme

        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.

        Répondre à ce message

        • 12 février 2008 à 13h37
          Commentaire de Nicolas Hoizey

          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.

          Répondre à ce message

          • 12 février 2008 à 13h45
            Commentaire d'un anonyme

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

            Répondre à ce message

          • 12 février 2008 à 15h52
            Commentaire d'un anonyme

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

            Répondre à ce message

  • 9 octobre 2008 à 17h20
    Commentaire de Mortimer

    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 :

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

    juste après

    #SET{sites,#ARRAY}

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

    Répondre à ce message

  • 19 janvier 2009 à 23h55
    Commentaire de Jean-no

    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 » ?

    Répondre à ce message

    • 22 décembre 2009 à 09h45
      Commentaire de Nicolas Hoizey

      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 :

      <B_boucle>
          Contenu conditionnel avant
      <BOUCLE_boucle(STRUCTURE){paramètre}>
          Contenu bouclé
      </BOUCLE_boucle>
          Contenu conditionnel après
      </B_boucle>
          Contenu si pas d'éléments
      <//B_boucle>
      Télécharger

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

      Répondre à ce message

  • 5 décembre 2009 à 07h54
    Commentaire de gauste

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

    Répondre à ce message

    • 7 décembre 2009 à 10h47
      Commentaire de Nicolas Hoizey

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

      Répondre à ce message

  • 5 décembre 2009 à 08h00
    Commentaire de Stéphane Santon

    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})]})]
    ...

    Répondre à ce message

Partager

Pour faire un lien vers cet article, vous pouvez utiliser soit son URL canonique soit son URL courte :

http://gasteroprod.com/a628

Billets avec un tag commun

  • Une arborescence dynamique et contextuelle
  • Le même agenda que Gastero Prod avec SPIP
  • Gastero Prod 4, les standards et l’accessibilité
  • La galerie SPIP, pour réutiliser facilement les images et documents
  • Un site valide et accessible avec SPIP, c’est (de plus en plus) possible !

Derniers billets

  • Faut-il continuer à supporter Internet Explorer 6 ?

    Article initialement publié dans le blog de Clever Age.

    On ne va pas ergoter sans fin, tout le monde doit maintenant savoir que Internet Explorer 6 — IE6 pour les intimes — est un navigateur obsolète et dangereux. Et pourtant, certains continuent à l’utiliser. Faut-il les en dissuader, refuser de leur fournir son support, aller même jusqu’à leur empêcher l’accès, ou faut-il continuer à supporter (les faiblesses de) ce navigateur ?

    Date de publication
    22/juillet
    2010
    Tags
    Clever Age, Internet Explorer, standards
  • Les inscriptions à Paris Web 2010 sont ouvertes !

    Paris Web 2010, c’est la cinquième édition de ce rendez-vous français annuel, devenu incontournable, pour se tenir informé des bonnes pratiques de développement Web. Go go go !

    Date de publication
    2/juillet
    2010
    Tags
    Paris Web, qualité, standards
  • Faciliter la reprise de tweets (les retweets) à l’ancienne sur Twitter

    Même si Twitter a mis en place depuis maintenant un certain temps un mécanisme natif de retweets1, je préfère souvent continuer à utiliser les « RT » traditionnels, qui laissent la possibilité de commenter le tweet initial, ce que ne permet pas le retweet officiel. Une règle qui me paraît essentielle pour faciliter le retweet à l’ancienne, c’est de prévoir une taille de tweet suffisamment faible pour que le retweeteur voit son travail facilité, surtout si le tweet initial ne contient que très peu de mots inutiles.

    Date de publication
    14/juin
    2010
    Tags
    Twitter

Derniers commentaires

  • R03ER7 sur Le Jailbreak de l’iPhone ou de l’iPod Touch est-il légal ? : « Jailbreaker ne veut pas dire voler » mais plutôt « Permettre l’installation d’applications quand (...)

  • Sur Citation d’Oscar Wilde : sauf qu’il me semble qu’en vrai c’est une phrase de A de St Exupery !

  • Scandale sur Afficher les favicon dans la barre personnelle de Firefox sous Mac OS : Pour ceux qui, comme moi, manquent de place dans leur barre personnelle, j’ai aussi ajouté le (...)

  • Scandale sur Afficher les favicon dans la barre personnelle de Firefox sous Mac OS : merci pour le tuyau, ça marche. manque juste dans le tutoriel le chemin ou mettre le fichier, (...)

  • Nicolas Steinmetz sur Faut-il continuer à supporter Internet Explorer 6 ? : Parce que certaines entreprises sont encore sous WinNT / Win2000 à cause d’applications métiers ? (...)

  • ThierryD sur Prendre des éclairs (d’orage) en photo : Bonjour, Je me permet d’intervenir dans ce post pour vous faire part de ma technique pour (...)

  • ventrea sur Backup d’un Mac sur un NAS facile et sans bidouille, c’est possible ? : Time machine est pris en chagre par les dernières versions de firmware sur les nas Qnap (...)

  • Sur Une sauvegarde de fichiers en ligne très simple pour pas cher : Oui, j’ai le même genre et c’est vraiment pratique :) : https://www.axalot.fr

  • Sur Google Chrome sur Mac, bilan mitigé : > Pas de barre de titre, donc je ne connais pas le nom de la page dès que j’ai plus de 5 onglets (...)

  • Maurice sur Backup d’un Mac sur un NAS facile et sans bidouille, c’est possible ? : Par contre, je ne pense pas que ça résolve le problème de performance lorsque la taille du backup (...)

Nuage des tags les plus fréquents

  1. 3D
  2. 404
  3. accessibilité
  4. agenda
  5. Ajax
  6. animal
  7. animation
  8. Apple
  9. bande dessinée
  10. blog
  11. Blogmarks
  12. Blu-Ray
  13. bookmarks
  14. Canon
  15. cinéma
  16. citation
  17. Clever Age
  18. client riche
  19. concert
  20. couleur
  21. création
  22. CSS
  23. Daft Punk
  24. développement
  25. design
  26. dessin animé
  27. DotClear
  28. e-commerce
  29. ergonomie
  30. FeedBurner
  31. film
  32. Firefox
  33. Flickr
  34. fun
  35. Gastero Prod
  36. Google
  37. Greasemonkey
  38. hébergement
  39. HD
  40. humour
  41. hype
  42. IBM
  43. image
  44. informatique
  45. Internet
  46. iPhone
  47. JavaScript
  48. jeux
  49. jQuery
  50. Les Nuls
  51. Linux
  52. littérature
  53. livre
  54. logiciel
  55. logiciel libre
  56. loisirs
  57. Mac
  58. macro
  59. Microsoft
  60. moi
  61. Mozilla
  62. musique
  63. NetBook
  64. ordinateur
  65. oups
  66. photo
  67. PHP
  68. phpHeaven
  69. phpMyChat
  70. PicLens
  71. presse
  72. publicité
  73. recherche
  74. RewriteRule
  75. RSS
  76. sémantique
  77. SEO
  78. société
  79. Sony
  80. SPIP
  81. standards
  82. tag
  83. télévision
  84. vidéo
  85. Web 2.0
  86. Windows
  87. Yahoo !

A propos

L'auteur

Dans la vie professionnelle, co fondateur et Directeur Technique du cabinet de conseil nouvelles technos Clever Age, et dans la vie extra-professionnelle, créateur et animateur de Gastero Prod, flickRate et Ergothon, responsable technique de Marketing Planet et d’autres sites web, passionné d’Internet, de cinéma, de littérature, de musique ...

L'outil
Ce site est réalisé avec le logiciel libre de gestion de contenus Web SPIP en version 2.1.2 SVN [16020]

Identité 2.0

Vous pourrez aussi me trouver sur ces différentes communautés en ligne :

Réseaux sociaux
Diigo, Facebook, LinkedIn, Twitter
Photo
deviantART, Flickr, JPG Magazine, RedBubble
Geek stuff
GitHub, Ohloh, Userscripts.org
Autres
La musique sur Last.fm, Les livres sur Goodreads

Blogoliste

Proches
  • Jacqueline Oud
  • Marron show
  • Glagla Dot Org
  • Cédric Hoizey
Relations
  • Chez Xavier - Thoughts
  • La Case de l’Oncle Tom
  • Maître shteshitsu
  • Prendre un Café
  • Un Electron Libre...
Autres
  • Clever Age
  • Marketing Planet
Creative Commons License

Sauf mention explicite, tous les contenus de ce site sont la propriété de Nicolas Hoizey, et sont sous licence Creative Commons « Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique » version 2.0 adaptée à la France.