Carnet Wiki

Astuces longues pour SPIP !

Version 3 — Décembre 2011 JLuc

Les Astuces longues de SPIP sont des astuces qui nécessitent plus de 20 lignes pour être expliquées.

-  Partager des données entre plusieurs squelettes inclus (Zpip)

Question :
Dans ZPIP, la structure de base est définie à coup d’inclusion de grands blocs logiques du style

        ...        <div  <d  i  v  id="contenu">
                        < INCLURE{fond=contenu/#ENV{type},env}>
                &lt;/div &lt;/d  i  v >


&lt;div  &lt;d  i  v  id="navigation">
                        < INCLURE{fond=navigation/#ENV{type},env}>
                        < INCLURE{fond=extra/#ENV{type},env}>
                &lt;/div &lt;/d  i  v >....

Supposons par exemple que nous soyons dans un contexte « rubrique »

http///monsite http///monsite .fr/spip.php?rubriqueXX&lt;/code >
 rubriqueXX
 et que le squelette &lt; code>contenu/rubrique contenu/rubrique .html&lt;/code >  html  se comporte de manière à afficher l'article N°yy


Comment peut-on transmettre cet &lt; code>id_article&lt;/code >  id_article  dans l'inclusion <code>extra

ou dans l’inclusion navigation pour, par exemple, lister les autres articles de la rubrique. Il faut bien que le squelette appelé connaisse l’id de l’article à exclure que seul < code>contenu/rubrique contenu/rubrique .html</code > html connait !

Pour que extra/rubrique.html ou navigation/rubrique.html puisse tenir compte de la situation, il faut disposer d’un moyen pour leur transmettre cette valeur. Or, seul le squelette appelant peut transmettre une variable...

Réponse :
L’astuce (alambiquée) pour remonter des variables d’un squelette appelé, est d’affecter le résultat sérialisé de ce squelette à une variable tableau dans le squelette appelant :

Dans structure.html :

[(#SET{myvars,[(#INCLURE{fond=vars/#ENV{type},env})]})]

Dans vars/rubrique.html :

#CACHE{3600}
[(#SET{vars,#ARRAY{
    objet,rubrique,
    id_objet,#ENV{id_rubrique},
    titreRubrique,Rubriques,
    titrePage,#ENV{id_rubrique}?
}})]


<BOUCLE_rub(RUBRIQUES){id_rubrique}>
    [(#SET{vars, #GET{vars}|array_merge{#ARRAY{titreRubrique,#TITRE,idRubrique,#ID_RUBRIQUE}}})]
</BOUCLE_rub>


[(#GET{vars}|serialize)]
#FILTRE{trim}

Puis dans structure.html :

<INCLURE{fond=extra/#ENV{type},env}>

-  une boucle qui ne doit être exécutée que dans un certain contexte

tout le monde le sait (beaucoup le déplorent) :

[(#ENV{var}|=={val}|oui) <BOUCLE_test(TABLES){critere}>...</BOUCLE_test> ]

ne fonctionne pas.

en SPIP3, le critère {si ...} permet de définir la condition d’exécution depuis la boucle elle-même.

en SPIP2, il faut utiliser le plugin « bonux » et sa boucle « CONDITION ».

il existe néanmoins un autre moyen pour arriver à nos fins...

#SET{test, #ENV{truc}|=={coucou}|?{0, 999999}}
<BOUCLE_de_test(TABLES){id_table > #GET{test}}>
coucou !
</BOUCLE_de_test>

explications :

  • en premier lieu nous définissons notre test (présence de la variable « truc » dans l’environnement) et nous affectons à une variable « test » la valeur« 0 » ou « 999999 ».
    à ce stade, #GET{test} vaut donc soit « zéro », soit « neuf cent quatre-vingt-dix-neuf mille neuf cent quatre-vingt-dix-neuf ».
  • nous lançons alors la boucle dans laquelle nous demandons que l’« id_table » soit supérieur à notre valeur de test définie juste au-dessus.
    et le tour est joué...

DATE DU JOUR

dans un squelette, afficher la date du jour (la date courante) n’est pas toujours aisé.
deux variables peuvent entrer en jeu :

  • la date retournée par la boucle dans laquelle on veut afficher notre date du jour
  • une variable nommée date passée en url ou par le biais d’un formulaire

pour chaque cas, néanmoins, il existe une possibilité d’afficher la date du jour et ce sans que cette date soit tributaire du cache du squelette (ce sera toujours la date courante qui sera affichée)

dans une boucle dont la table possède

un champ date ou date_redac

hors boucle
pas de date ni de date_redac en url

ni passées par formulaire

#ENV{date_redac}

ou

#ENV{date}

#DATE_REDAC

ou

#DATE

variable date passée en url ou par formulaire #ENV{date_redac} #DATE_REDAC
variable date_redac passée en url ou par formulaire #ENV{date} #DATE
variables date et date_redac passées

en url ou par formulaire

définir en début de squelette la date courante avec par exemple :

#SET{cur_date, #VAL{Y-m-d h:i:s}|date}

puis l’utiliser dans le squelette avec :

#GET{cur_date}

JOUONS AVEC LES DATES

<blockquote class="spip">

voir aussi saisie des dates de publication et de rédaction antérieure (spip 2.0.x et 2.1.x)

</blockquote>

-  la date du prochain jeudi qui suit #DATE :

[(#VAL{Y-m-d}|date{#VAL{next Thursday}|strtotime{#DATE|affdate{U}}})]

-  le nom du jour de l’avant-veille de #DATE :

[(#VAL{Y-m-d}|date{#VAL{-2 days}|strtotime{#DATE|affdate{U}}}|nom_jour)]

-  la date de lundi prochain :

[(#SET{lundi_prochain, #VAL{Y-m-d 00:00:00}|date{#VAL{next Monday}|strtotime{#DATE|affdate{U}}}})]
#GET{lundi_prochain}

-  la date du dimanche d’après lundi prochain :

[(#SET{dimanche_apres, #VAL{Y-m-d 23:59:59}|date{#VAL{+6days}|strtotime{#GET{lundi_prochain}|affdate{U}}}})]
#GET{dimanche_apres}

-  afficher le label nouveau ! pour un article publié ou modifié il y a moins de 10 jours :

#SET{periode, -10days}
#TITRE[ (#DATE_MODIF|>{#VAL{Y-m-d H:i:s}|date{#GET{periode}|strtotime}}|oui) nouveau !]

et _fil_ (sur irc) propose encore plus simple :

#TITRE[ (#DATE|strtotime|>{#VAL{-10days}|strtotime}|?{nouveau !, ''})]

EXPORTER AU FORMAT CSV

Triton nous confie un petit exemple qui marche pour MS Excel et openOffice (il y a des particularités d’encodage de caractères) :

#CACHE{0} #HTTP_HEADER{Content-Type: text/csv; charset=windows-1252/Winlatin1} #HTTP_HEADER{Content-Disposition: attachment; filename=inscriptions.csv}
"date"; "nom_participant";"prenom";"paiement effectue"; "tarif_valide"; "promo";"telephone"; "email";"societe"; "nbr_part";"conjoint"; "mobile_dom";"type_paiement"; "souscripteur"
<BOUCLE_les_inscriptions_ouvertes(EVENEMENTS_LESINSCRIPTIONS){id_evenement}{nbr_part>0}>"[(#DATE|affdate{'d-m-Y'})]";"[(#NOM_PARTICIPANT|utf8_decode)]";"[(#PRENOM|utf8_decode)]";"[(#VERIFIER_PAIEMENT_INSCRIPTION{#ID_INSCRIPTION}|utf8_decode)]";"[(#TARIF_VALIDE|utf8_decode)]";"[(#PROMO|utf8_decode)]";"[(#TELEPHONE|utf8_decode)]";"[(#EMAIL|utf8_decode)]";"[(#SOCIETE|utf8_decode)]";"[(#NBR_PART|utf8_decode)]";"[(#CONJOINT|utf8_decode)]";"[(#MOBILE_DOM|utf8_decode)]";"[(#TYPE_PAIEMENT|utf8_decode)]";"[(#SOUSCRIPTEUR|utf8_decode)]"
</BOUCLE_les_inscriptions_ouvertes>
  • le http_header indique qu’il s’agit d’un document csv encodé pour MS excel
  • la premiere ligne c’est les têtières (en tete de colonne) du fichier csv
  • La boucle écrit ensuite le contenu ligne par ligne

Il faut, souvent, coller toutes les lignes comme ci-dessus, sinon, on peut, ou pas, se retrouver avec des lignes vides dans le csv....

Si tu colles ca dans un squelette (nommé squelette_cvs), il suffit
ensuite d’appeler la page spip.php ?page=squelette_cvs et le navigateur
te proposera de sauvegarder le fichier (ici inscriptions.csv - voir le
filename au dessus) ou de l ouvrir avec le logiciel de ton choix....

Apres, faut voir a quoi doit servir ton cvs, a etre lu directement par
une appli type MS/ Open Office (cet exemple) ou a autre chose, import
dans une base sql par exemple, auquel cas, il faudra peut-être modifier l’encodage de caractères...

Par ailleurs, paube indique qu’il faut d’abord passer les champs par le filtre textebrut avant de les passer à la moulinette de utf8_decode

on peut aussi « jolifier » et simplifier le code (surtout dans la boucle) :

#CACHE{0}
#HTTP_HEADER{Content-Type: text/csv; charset=windows-1252/Winlatin1}
#HTTP_HEADER{Content-Disposition: attachment; filename=inscriptions.csv}


"ordre"; "date"; "nom_participant"; "prenom"; "paiement effectue"; "tarif_valide"; "promo"; "telephone"; "email"; "societe"; "nbr_part"; "conjoint"; "mobile_dom"; "type_paiement"; "souscripteur"


<BOUCLE_inscriptions_ouvertes(EVENEMENTS_LESINSCRIPTIONS){id_evenement}{nbr_part>0}>#VAL{#COMPTEUR_BOUCLE;"[(#DATE|affdate{'d-m-Y'})]"; "#NOM_PARTICIPANT"; "#PRENOM"; "#VERIFIER_PAIEMENT_INSCRIPTION{#ID_INSCRIPTION}"; "#TARIF_VALIDE"; "#PROMO"; "#TELEPHONE"; "#EMAIL"; "#SOCIETE"; "#NBR_PART"; "#CONJOINT"; "#MOBILE_DOM"; "#TYPE_PAIEMENT"; "#SOUSCRIPTEUR"}|textebrut|utf8_decode)]
</BOUCLE_inscriptions_ouvertes>

l’astuce consiste à ajouter #COMPTEUR_BOUCLE; comme premier champ de #VAL (donc aussi "ordre"; en première ligne de la feuille)

Retour à la version courante

Toutes les versions