Carnet Wiki

Astuces #ARRAY, #LISTE et boucles DATA

Version 15 — 2 mesi fa JLuc

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 :

+---+---+------------------+
!  !  ! 1                !
!   ! 1 ! titre article 1  !
+---+---+------------------+
! 1 !  ! 2                !
!   ! 1 ! titre article 2  !
+---+---+------------------+
! 2 !  ! 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; 
}

Lister les tables de SPIP

<h3>Tables contenant 'mot'<h3>
<ul><BOUCLE_objets(POUR){tableau #REM|lister_tables_objets_sql}{cle==mot}>
	<li>Nom MYSQL=#CLE / Descriptif : [(#VALEUR{texte_objets}|_T)]	/ Nom résumé : #VALEUR{table_objet}</li>
</BOUCLE_objets>
</ul>