Carnet Wiki

Astuces #ARRAY, #LISTE et boucles DATA

Les Balises de référence
-  #LISTE
-  #ARRAY
-  #GET
-  #SET

Critère de boucle : tester si un tableau n’est pas vide

Rq : empty est une structure de contrôle PHP et non une fonction, et ne peut donc être utilisée comme filtre.

On peut tester directement avec |oui :
<BOUCLE_pasvide(CONDITION){si #GET{sel_articles}|oui}> ...

ou bien avec une boucle DATA :

<B_A>
    Avant, si contenus
<BOUCLE_A(DATA){source tableau, #GET{sel_articles}}>
    - #CLE :: #VALEUR<br />
</BOUCLE_A>
    Après, si contenus
</B_A>
    Si tableau vide
<//B_A>

Alléger l’écriture en utilisant #LISTE
Utiliser #LISTE{article,rubrique,breve,syndic} (cf. #LISTE)
au lieu de :
#ARRAY{0,'article',1,'rubrique',2,'breve',3,'syndic'}

Remplir un tableau dynamiquement
D’après la page : http://www.spip.net/fr_article4009.html et http://www.spip.net/fr_article4571.html
il y a « remplir un tableau dynamiquement » qui t’aidera particulièrement :

#SET{mon_tableau, #GET{mon_tableau}|push{#COMPTEUR_BOUCLE}}

Ce qui pourrait donner probablement :

#SET{idart, #ARRAY} 
<BOUCLE_art(ARTICLES){id_rubrique=2}>
    #SET{idart, #GET{idart}|push{#ID_ARTICLE}}
</BOUCLE_art> 

Pour vérifier le résultat créé correctement avec |push, on peut obtenir la liste de cette façon :
[(#GET{idart}|implode{','})]

le paramètre de #VAL étant le séparateur entre chaque identifiant

Remplir un tableau de tableaux avec une boucle

On peut vouloir utiliser les résultats retournés par une BOUCLE en-dehors de cette BOUCLE (dans un tout autre endroit du squelette). L’exemple ci-dessous permet de disposer d’un tableau (array en php) dont on pourra extraire les informations souhaitées.

Déclarer le tableau et le remplir avec une boucle :

#SET{tab, #ARRAY}
<BOUCLE_u(ARTICLES) {tout}>
   [(#SET{tab, #GET{tab}|push{#LISTE{#ID_ARTICLE, #TITRE}}})]
</BOUCLE_u>
   

À ce stade, nous avons un tableau peuplé ainsi :

+---+---+------------------+
! 0 ! 0 ! 1                !
!   ! 1 ! titre article 1  !
+---+---+------------------+
! 1 ! 0 ! 2                !
!   ! 1 ! titre article 2  !
+---+---+------------------+
! 2 ! 0 ! 3                !
!   ! 1 ! titre article 4  !
+---+---+------------------+

Accéder aux informations de ce tableau avec le slash (à partir de SPIP3) :

[(#GET{tab/1/1})]  affichera «titre article 2»
[(#GET{tab/2/0})]  affichera «3»

Avant SPIP3 il faut passer par le filtre |table_valeur :

[(#GET{tab}|table_valeur{1/1})]  affichera «titre article 2»
[(#GET{tab}|table_valeur{2/0})]  affichera «3»

Un tableau dans un critère IN
Avec l’opérateur IN dans un critère, SPIP attend :

Donc il ne faut pas lui transmettre un #GET qui contiendrait une liste (surtout en chaine de caractères).!
Il faut lui transmettre un tableau (#ARRAY)

Dans ton cas, tu n’as donc pas besoin de faire l’implode de
#GET{idart}, tu peux utiliser le tableau tel quel dans le critère avec IN.

Si tu es obligé de manipuler une liste stockée dans une variable alors
il faudra « l’exploder » pour que cette liste soit transformée en
tableau et utilisée par le IN :

<BOUCLE_gis(ARTICLES){gis}{id_article IN #GET{variablephp}|explode{','}}>
voire
<BOUCLE_gis(ARTICLES){gis}[{id_article IN (#GET{variablephp})}]>

NB :
-  implode : transforme un tableau (#ARRAY) en liste (séparée par ce que tu lui donnes en argument).
-  explode fait l’inverse : transforme une liste (séparée par ce que tu donne en argument) en tableau.


Les filtres dédiés

-  http://www.spip.net/fr_article4572.html
-  http://www.spip.net/fr_article4575.html


Syntaxe simplifiée avec slash

Dans un squelette SPIP, on peut accéder à une valeur d’un tableau par sa clé avec la syntaxe {tableau/cle}. Plus besoin de table_valeur

Exemple : #CONFIG{dimensions/hauteur} #GET{mon_tableau/cle1}

En php, la fonction _request ne fait pas ce traitement. On peut néanmoins bénéficier de ce décodage en définissant une autre fonction __request à ajouter dans mes_options :

function  __request($nom, $c=false) { 
  $x = explode('/', $nom); 
  $n = array_shift($x); 
  $val = _request($n, $c); 
  return count($x) ? table_valeur($val, implode('/', $x)) : $val; 
}
YannX - Mise à jour :16 mars 2024 à 13h17min