SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano | Nederlands

289 Plugins, 197 contribs On SPIP-Zone, 106 visitors now

Home > Templates > Tutoriels pour squelettes > how to extend the capabilities of your loops

how to extend the capabilities of your loops

24 August 2009 – by Thierry Kauffmann

All the versions of this article: [English] [Español] [français]

1 vote

Here are given several techniques to extend the possibilities offered by SPIP standard loops :

First a technique to test the IN criterium of a loop with SPIP 1.9.2 or 2.0.x and also offering the possibility to write loops that seemed impossible to do.

Then a second technique available for SPIP 2.0.x, to make new loops with “automatic” or “forced” joins.

Ask for the moon to your loops :)!

The idea

Let’s say you often use the same list of values in the IN criterium of a loop.

example in the following loop:

  1. <BOUCLE_art(ARTICLES){id_article IN 12,13,14,25}>
  2.         <h1>#TITRE</h1>
  3. </BOUCLE_art>

Download

The preceding loop lists items IDs 12, 13, 14 or 25.

A solution for sharing your list in a single skeleton

One option for sharing this list is to load it into a static array (see #ARRAYS on the use of arrays). We can then use it several times in the same skeleton (which makes it easier to maintain), for example:

  1. [(#SET{myarray,#ARRAY{0,12,1,13,2,14,3,25}})]
  2.  
  3. <BOUCLE_art1(ARTICLES){id_article IN #GET{myarray}|sinon{0}}{par hasard}>
  4.         <h1>#TITRE</h1>
  5. </BOUCLE_art1>
  6.  
  7. <BOUCLE_art2(ARTICLES){id_article IN #GET{myarray}|sinon{0}}{par titre}>
  8.         <h1>#TITRE</h1>
  9. </BOUCLE_art2>

Download

A solution for all the skeletons

Let’s imagine you use that list in several skeletons.

Here’s one way to share the list :

You create a simple skeleton which only contains a string formed from the list of values separated by a rarely-used character (eg the pipe ’|’):

For example I create the file mylist.html:

  1. 12 | 13 | 14 | 25

And the skeleton mytest.html:

  1. #CACHE{0}
  2. <BOUCLE_art(ARTICLES){id_article IN #INCLURE{fond=mylist}|explode{'|'}}>
  3.         <h1>#TITRE</h1>
  4. </BOUCLE_art>

Download

The filter "explode is a php function that separates the string passed as a parameter and fills an array with values. The function takes as first parameter the character used for the separation ... and voila! It is as if the included skeleton would pass an array parameter.

Application to the achievement of “impossible” loops

Here is an example to make a loop normally impossible with SPIP 1.9.2 : you want to list the articles in the sections marked with the keyword identifier 15.

One possibility offered by dynamic arrays would be to make the following skeleton (see also tools plugin SPIP Bounce to build dynamic arrays):

  1. #CACHE{0}
  2.  
  3. #SET{myarray, #ARRAY{}}
  4. <BOUCLE_rub(RUBRIQUES){id_mot=15}>
  5.  [(#SET{myarray,
  6.   #GET{myarray}|push{#ID_RUBRIQUE}
  7. })]
  8. </BOUCLE_rub>
  9.  
  10. <BOUCLE_art(ARTICLES){id_rubrique IN #GET{myarray}|sinon{0}}{par titre}>
  11. <h1>#TITRE</h1>
  12. </BOUCLE_art>

Download

This solution works perfectly, but it requires rewriting part of the code in each template where it is used.

Here is a solution where we share the first part:
We create a file list-rubriques.html which creates a list of identifiers separated by pipes.

  1. <BOUCLE_rub(RUBRIQUES){id_mot?}{id_groupe?}{'|'}>#ID_RUBRIQUE</BOUCLE_rub>

You can then use this “sub-loop” in all the other skeletons. For example, it can be used for the following loop in another skeleton:

  1. <BOUCLE_art(ARTICLES){id_rubrique IN #INCLURE{fond=list-rubriques}{id_mot=15}|explode{'|'}|sinon{0}}{par titre}>
  2. <h1>#TITRE</h1>
  3. </BOUCLE_art>

Download

Compatibility :
Tested with SPIP 2.0.9, should also work with SPIP 1.9.2.

A (much) more efficient technique with SPIP 2.0.x

With version 2.0 came “automatic” joins (See Forcing joins on the site programmer.spip.org). We can then use the following loop to get the same result:

  1. <BOUCLE_art(ARTICLES mots_rubriques){id_mot=15}{par titre}>
  2. <h1>#TITRE</h1>
  3. </BOUCLE_art>

Download

The advantage is that:
-  There are no inclusions
-  All the joining work is done by the database, which is much faster.

Here is the request for evidence provided by the debug mode (var_mode=debug):

  1. SELECT articles.titre, articles.lang
  2. FROM `mabase`.spip_articles
  3. AS `articles`
  4. INNER JOIN `mabase`.spip_mots_rubriques
  5. AS L1 ON ( L1.id_rubrique = articles.id_rubrique )
  6. WHERE (articles.statut = 'publie')
  7. AND (articles.date < '9999-12-31')
  8. AND (L1.id_mot = 15)
  9. GROUP BY articles.id_article
  10. ORDER BY articles.titre

Download

P.S.

  1. To use the new possibilities offered by SPIP 2.0.x, do not hesitate to use a tool like PhpMyAdmin, proposed in general by all hosters, to discover the tables and their structure (which is very clear !) to find the tables that will intermediate the new joints.
    Then check what sort of joins SPIP does by testing your desired skeleton with the parameter var_mode=debug and displaying the “calculation” generated by the loop in question. For that, you might want to learn some basics of SQL (Structured_Query_Language).
  2. (updated 2010-02-22). One might also read with interest this article dealing with the anti-duplicates. It is a very effective technique for creating groupings of various origins of the same type of object (the UNION in sql). This will prevent in most cases to resort to arrays.

updated on 21 August 2010

Back to top

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Add a document

Back to top

Here they're talking

  • (fr) ORR v2

    21 mai 2013 – 108 commentaires

    ORR, le plugin d’Organisation des Réservations et des Ressources passe en version 2, avec quelques nouveautés attendues. Je ne reprendrai pas les explications données dans la version 1. Les nouveautés : 1. Gestion des autorisations Le principe (...)

  • (fr) Mailshot

    16 janvier 2013 – 309 commentaires

    Ce plugin prend en charge l’envoi en nombre d’info-lettres par email. Mailshot permet l’envoi en nombre d’emails au moyen d’un SMTP (ou d’un service externe) dédié à cet effet. Il permet de limiter la cadence d’envoi. Enfin, ce plugin implémente la (...)

  • (fr) Visualiser un PDF dans un article

    13 juin – commentaires

    SoyezCréateurs utilise un modèle pour afficher un PDF dans le corps d’un article Un peu d’histoire Avant, les navigateurs n’incluaient pas de lecteur PDF nativement ce qui avait conduit à la création du plugin Lecteur pdf javascript pdf.js. Mais, (...)

  • (fr) ScolaSPIP 4

    19 janvier 2016 – 346 commentaires

    ScolaSPIP est plugin-squelette responsive personnalisable pour sites Web d’établissements scolaires basé sur SPIPr Présentation de ScolaSPIP Ce plugin pour SPIP 3 est développé par la Dane de l’académie de Versailles pour les webmestres de cette (...)

  • (fr) Spipagram : Importer des images Instagram dans SPIP

    29 février 2016 – 10 commentaires

    Ce plugin permet d’importer des images Instagram comme articles SPIP dans la rubrique de votre choix avec le hashtag de votre choix. Installation Si vous n’avez pas déjà le dépôt externals dans votre SPIP, ajoutez le dépôt (...)