Cette fois-ci, j'ai besoin de pouvoir faire un certain nombre de
boucles Spip où seul l'objet/table/type change, pas les critères. Du
coup je souhaiterais pouvoir écrire quelque chose équivalent à :
<BOUCLE_x(#ENV{objet}){...}{...}> ... </BOUCLE_x>
qui bien entendu ne fonctionne pas (erreur : Table SQL « #ENV{boucle}
» inconnue). Des suggestions pour parvenir à mes fins ?
Le 9 septembre 2011 02:15, Gildas Cotomale <gildas.cotomale@gmail.com> a écrit :
Bonjour.
Cette fois-ci, j'ai besoin de pouvoir faire un certain nombre de
boucles Spip où seul l'objet/table/type change, pas les critères. Du
coup je souhaiterais pouvoir écrire quelque chose équivalent à :
<BOUCLE_x(#ENV{objet}){...}{...}> ... </BOUCLE_x>
qui bien entendu ne fonctionne pas (erreur : Table SQL « #ENV{boucle}
» inconnue). Des suggestions pour parvenir à mes fins ?
Bonsoir,
Tu pourrais tester tes objets de cette manière :
exemple: il y a une valeur pour id_article dans #ENV
[(#ENV{id_article}|oui) /* la syntaxe va dépendre du contexte */
/* tu dois surement utiliser un #INCLURE auquel tu passes le bon paramètre */
[(#INCLURE{fond=fond_comportant_la_boucle_idoine}{#ENV{id_article}})]
/* la syntaxe va dépendre du contexte */
]
Cette fois-ci, j'ai besoin de pouvoir faire un certain nombre de
boucles Spip où seul l'objet/table/type change, pas les critères. Du
coup je souhaiterais pouvoir écrire quelque chose équivalent à :
<BOUCLE_x(#ENV{objet}){...}{...}> ...</BOUCLE_x>
qui bien entendu ne fonctionne pas (erreur : Table SQL « #ENV{boucle}
» inconnue). Des suggestions pour parvenir à mes fins ?
Merci.
Je crois qu'il n'y a qu'avec les itérateurs et la boucle SQL que tu peux faire ça.
Tu pourrais tester tes objets de cette manière :
exemple: il y a une valeur pour id_article dans #ENV
[(#ENV{id_article}|oui) /* la syntaxe va dépendre du contexte */
/* tu dois surement utiliser un #INCLURE auquel tu passes le bon paramètre */
[(#INCLURE{fond=fond_comportant_la_boucle_idoine}{#ENV{id_article}})]
/* la syntaxe va dépendre du contexte */
]
Il faut autant de tests que d'objets possibles
C'est en fait ce que je voulais éviter : devoir répéter ma boucle
autant de fois qu'il y a d'objets ; c'est lourd à maintenir :-S Par
ailleurs, je voulais une solution qui puisse s'appliquer à des types
non-Spip que je ne connais pas encore (et donc ne peut pas prévoir) :
en fait je récupère le type d'objet et et son id dans une table de
liaison et je voulait boucler sur la table de l'odjet pour récupérer
le titre s'il existait.
Une idée non testée ...
Mais dans le principe ça devrait fonctionner (j'ai quelques cas
similaires qui le confirment)
Le 9 sept. 2011 à 11:23, Gildas Cotomale a écrit :
Le 9 septembre 2011 03:51, Jacques J. a écrit :
Bonsoir,
Tu pourrais tester tes objets de cette manière :
exemple: il y a une valeur pour id_article dans #ENV
[(#ENV{id_article}|oui) /* la syntaxe va dépendre du contexte */
/* tu dois surement utiliser un #INCLURE auquel tu passes le bon paramètre */
[(#INCLURE{fond=fond_comportant_la_boucle_idoine}{#ENV{id_article}})]
/* la syntaxe va dépendre du contexte */
]
Il faut autant de tests que d'objets possibles
C'est en fait ce que je voulais éviter : devoir répéter ma boucle
autant de fois qu'il y a d'objets ; c'est lourd à maintenir :-S Par
ailleurs, je voulais une solution qui puisse s'appliquer à des types
non-Spip que je ne connais pas encore (et donc ne peut pas prévoir) :
en fait je récupère le type d'objet et et son id dans une table de
liaison et je voulait boucler sur la table de l'odjet pour récupérer
le titre s'il existait.
Si c'est juste pour le titre, alors tu peux utiliser #INFO_TITRE{objet,#ID_OBJET}
qui marchera pour tout.
C'est une balise à reserver pour ce type d'usage, car contrairement à la boucle qui fait donc toutes les verifications à la compilation, la balise fait les vérifications à l'execution, c'est donc plus couteux.
Le 9 septembre 2011 09:09, RastaPopoulos a écrit :
Je crois qu'il n'y a qu'avec les itérateurs et la boucle SQL que tu peux
faire ça.
C'est peut-être le moment pour moi de m'y mettre, aux itérateurs ?
Je pensais carrément y aller en PHP directement, mais l'aller-retour
avec le langage de boucles de SPIP n'est pas évident, comme en
témoigne cette discussion sur laquelle je suis tombé vers 4h : http://www.mail-archive.com/spip@rezo.net/msg30558.html (d'autres se
sont arrachés aussi les cheveux sur le même problème) Là, je regarde
le code de vertebres Connexion · GitLab
Le 9 sept. 2011 à 11:23, Gildas Cotomale a écrit :
Le 9 septembre 2011 03:51, Jacques J. a écrit :
[...]
Il faut autant de tests que d'objets possibles
C'est en fait ce que je voulais éviter : devoir répéter ma boucle
autant de fois qu'il y a d'objets ; c'est lourd à maintenir :-S Par
ailleurs, je voulais une solution qui puisse s'appliquer à des types
non-Spip que je ne connais pas encore (et donc ne peut pas prévoir) :
en fait je récupère le type d'objet et et son id dans une table de
liaison et je voulait boucler sur la table de l'odjet pour récupérer
le titre s'il existait.
Si c'est juste pour le titre, alors tu peux utiliser #INFO_TITRE{objet,#ID_OBJET}
qui marchera pour tout.
Génial ! Je ne connaissais pas... et c'est exactement ce qu'il me
fallait ! Mille mercis Cédric.
C'est une balise à reserver pour ce type d'usage, car contrairement à la boucle qui fait donc toutes les verifications à la compilation, la balise fait les vérifications à l'execution, c'est donc plus couteux.
Vu le contexte/besoin, je n'ai pas trop le choix Mais la page en
question ne sera pas appelée par tous, juste les administrateurs
(peut-être les rédacteurs plus tard ?) et sera paginée et mise en
cache. En plus c'est un petit site (la table en question a environ
deux centaines de lignes)
Merci encore.
Le 9 sept. 2011 à 11:36, Gildas Cotomale a écrit :
Le 9 septembre 2011 09:09, RastaPopoulos a écrit :
Je crois qu'il n'y a qu'avec les itérateurs et la boucle SQL que tu peux
faire ça.
C'est peut-être le moment pour moi de m'y mettre, aux itérateurs ?
Les itérateurs sont séduisants, mais attention : la boucle SQL consiste à ecrire directement sa requete dans le squelette, ce qui ne passe plus par l'API sql de SPIP, et n'est donc plus portable en SQLite par exemple.
C'est une solution non générique pour du code que tu ne comptes pas distribuer.
Je pensais carrément y aller en PHP directement,
oui un filtre dans ce genre de cas là serait encore la meilleure solution
Merci encore. #INFO_TITRE{#OBJET,#ID_OBJET} fait ce que je veux : c'est exactement
ce dont j'avais besoin. (et dire que j'ai perdu deux jours à chercher
au lieu de poser la question directement) Et ça simplifie mon code au
passage (le type d'objet était passé en majuscules et se voyait
ajouter un S pour pouvoir être utilisé dans la boucle --du moins je
l'espérait, sauf que le parseur ne s'attendait pas à un nom généré
dynamiquement)
C'est peut-être le moment pour moi de m'y mettre, aux itérateurs ?
Les itérateurs sont séduisants, mais attention : la boucle SQL consiste à ecrire directement sa requete dans le squelette, ce qui ne passe plus par l'API sql de SPIP, et n'est donc plus portable en SQLite par exemple.
C'est une solution non générique pour du code que tu ne comptes pas distribuer.
J'essaye d'écrire mes requêtes de façon la plus portable possible mais
c'est vrai qu'on y perdrait quand même quelque chose quelque soit le
soin apporté (par exemple le préfixe des tables qui peut ne pas être
spip_ et dans le cas présent un pluriel --nom de table-- qui peut ne
pas consister juste en l'ajout d'un S au type d'objet, etc.) C'est
donc pas si génial pour les boucles SQL... mais ça reste séduisant
pour du YQL/YAM/CSV/... Dès que j'ai un peu de temps, je vais faire
mumuse avec (et pour ce qui concerne le besoin actuel cette balise non
documentée me va bien)
Je pensais carrément y aller en PHP directement,
oui un filtre dans ce genre de cas là serait encore la meilleure solution
Tu veux dire pouvoir faire quelque chose du genre ?
<BOUCLE_x([(#ENV{objet}|monfiltre)]){...}{...}> ... </BOUCLE_x>
Parce-que à part passer une variable d'environnement à la SPIP, j'ai
essayé de l'appeler en PHP sans succès non plus
<BOUCLE_x(<?php $_GET['objet']; ?>){...}{...}> ... </BOUCLE_x>
Du coup je pensais générer toute la boucle en PHP sans trop savoir si
ce sera mieux
<?php echo "<BOUCLE_x($_GET[objet]){...}{...}> ... </BOUCLE_x>"; ?>
Vertebres est encore une autre approche : elle consiste à produire un squelette en fonction du nom de l'objet, puis ensuite à le calculer.
Ça va plus loin que ce que je pensais faire (au lieu de juste générer
une boucle dans le squelette on génère carrément tout le squelette
adapté) et c'est vrai que le résultat est bluffant ! Un vrai modèle du
genre.