SPIP-Contrib

SPIP-Contrib

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

288 Plugins, 197 contribs On SPIP-Zone, 125 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) Acces Restreint 3.0

    11 décembre 2008 – 813 commentaires

    Le plugin accès restreint permet de définir et de gérer des zones de l’espace public en accès restreint. Cette version du plugin a été redévelopée et optimisée tout spécialement pour SPIP 2.0. Il en découle une amélioration des performances sur les gros (...)

  • (fr) SpipClear 2.1

    18 avril 2009 – 138 commentaires

    Un squelette de blog parmi les autres, entièrement pompé (avec la permission du concepteur) sur le thème par défaut de DotClear.

  • (fr) Mailsubscribers

    16 janvier 2013 – 328 commentaires

    Ce plugin permet de gérer les inscriptions (ou abonnements) à la diffusion de contenu par email. Mailsubscribers permet de gérer les inscriptions par Opt-in simple ou double et la désinscription par URL. Ce plugin gère également plusieurs listes de (...)

  • (fr) Minidoc : différentes vues pour les documents attachés

    3 février – commentaires

    Minidoc est un plugin pour SPIP 3.1 qui ajoute aux listes de documents attachés à des objets éditoriaux (tel que les articles), des boutons permettant de changer le type d’affichage de ces listes. Il a été intégré dans le plugin Médias inclu avec SPIP (...)

  • (fr) Agenda 2.0

    3 novembre 2008 – 1095 commentaires

    Voici la version pour SPIP 2.0 du Plugin Agenda pour SPIP 1.9.2, avec une interface remaniée pour encore plus de plaisir. Pour une documentation concernant l’utilisation d’Agenda 3 pour SPIP 3, veuillez pour l’instant vous référer à SPIP 3, Agenda (...)