Critères optionnels et passage automatique de #ENV dans les modèles #2788

Closed
opened 11 years ago by maieul · 15 comments
maieul commented 11 years ago
Collaborator

Un exemple sera plus simple :

j'avais sous SPIP 2.1 un modèles sites.html de la forme suivante :




[(#LOGO_RUBRIQUE|image_reduire{100}|inserer_attribut{alt,#TITRE}|inserer_attribut{class,''}sinon{#TITRE})]

Je pouvais l'appeler soit via :

<sites|> et dans ce cas j'avais les sites de toutes les rubriques, soit via <sites|id_rubrique=1> et cela me permettait d'avoir les sites de la rubrique 1.

Patatra, avec SPIP 3 cette option saute (avec ZPIP). En effet j'ai un id_rubrique dans le squelette appelant, j'ai donc un id_rubrique dans le modèle (selon la nouvelle règle de transmissions des #ENV aux modèles à SPIP 3).

La solution que j'ai trouvé pour le moment (mais pas top) est





[(#LOGO_RUBRIQUE|image_reduire{100}|inserer_attribut{alt,#TITRE}|inserer_attribut{class,''}sinon{#TITRE})]

Mais c'est moche. Il faudrait trouver un système plus pratique. Sur IRC (avec cerdic et denisb), denisb a suggéré




[(#LOGO_RUBRIQUE|image_reduire{100}|inserer_attribut{alt,#TITRE}|inserer_attribut{class,''}sinon{#TITRE})]

Sauf que comme le précise http://www.spip.net/fr_article4013.html : « Le critère ne sera pris en compte par la boucle que si une variable de même nom est présente dans l’environnement. »

Un exemple sera plus simple : j'avais sous SPIP 2.1 un modèles sites.html de la forme suivante : <pre> <BOUCLE_rubriques(RUBRIQUES){par titre}{id_rubrique ?}> <B_sites> <h3 class='spip'>[(#LOGO_RUBRIQUE|image_reduire{100}|inserer_attribut{alt,#TITRE}|inserer_attribut{class,''}sinon{#TITRE})]</h3> <ul class='spip'> <BOUCLE_sites(SITES){id_rubrique}{par nom_site}{syndication=non}> <li><a href="#URL_SITE" class='spip_out'>#NOM_SITE</a></li> </BOUCLE_sites> </ul> </B_sites> </BOUCLE_rubriques> </pre> Je pouvais l'appeler soit via : `<sites|>` et dans ce cas j'avais les sites de toutes les rubriques, soit via `<sites|id_rubrique=1>` et cela me permettait d'avoir les sites de la rubrique 1. Patatra, avec SPIP 3 cette option saute (avec ZPIP). En effet j'ai un id_rubrique dans le squelette appelant, j'ai donc un id_rubrique dans le modèle (selon la nouvelle règle de transmissions des #ENV aux modèles à SPIP 3). La solution que j'ai trouvé pour le moment (mais pas top) est <pre> <BOUCLE_sans_id(CONDITION){si #ENV{id_rubrique}|=={-1}}> <BOUCLE_rubriques(RUBRIQUES){par titre}> <B_sites> <h3 class='spip'>[(#LOGO_RUBRIQUE|image_reduire{100}|inserer_attribut{alt,#TITRE}|inserer_attribut{class,''}sinon{#TITRE})]</h3> <ul class='spip'> <BOUCLE_sites(SITES){id_rubrique} {par nom_site}{syndication=non}> <li><a href="#URL_SITE" class='spip_out'>#NOM_SITE</a></li> </BOUCLE_sites> </ul> </B_sites> </BOUCLE_rubriques> </BOUCLE_sans_id> <BOUCLE_sites2(BOUCLE_sites) /> <//B_sans_id> </pre> Mais c'est moche. Il faudrait trouver un système plus pratique. Sur IRC (avec cerdic et denisb), denisb a suggéré <pre> <BOUCLE_rubriques(RUBRIQUES){par titre}{id_rubrique ?=#ENV{args/id_rubrique}}> <B_sites> <h3 class='spip'>[(#LOGO_RUBRIQUE|image_reduire{100}|inserer_attribut{alt,#TITRE}|inserer_attribut{class,''}sinon{#TITRE})]</h3> <ul class='spip'> <BOUCLE_sites(SITES){id_rubrique}{par nom_site}{syndication=non}> <li><a href="#URL_SITE" class='spip_out'>#NOM_SITE</a></li> </BOUCLE_sites> </ul> </B_sites> </BOUCLE_rubriques> </pre> Sauf que comme le précise http://www.spip.net/fr_article4013.html : « Le critère ne sera pris en compte par la boucle que si une variable de même nom est présente dans l’environnement. »

La question est donc "comment faire un critère conditionnel qui ne prenne que les arguments passés explicitement en paramètre lors de l'appel du modèle".

Vu que ceux ci sont les seuls à pouvoir être récupérés également par #ENV{arg/nomdelargument}, la question est "comment boucler sur l'environnement défini par #ENV{arg/...}"

Une idée serait donc d'ajouter une balise spip permettant de modifier l'environnement de la manière voulue.

#SETENV{arg/} -> l'environnement se réinitialise avec l'ensemble des valeurs de #ENV{arg/...}

Si utile, #SETENV pourrait accepter des arguments d'autres formes pour ajouter ou modifier ou supprimer d'autres valeurs ou jeux de valeurs.

La question est donc "comment faire un critère conditionnel qui ne prenne que les arguments passés explicitement en paramètre lors de l'appel du modèle". Vu que ceux ci sont les seuls à pouvoir être récupérés également par #ENV{arg/nomdelargument}, la question est "comment boucler sur l'environnement défini par #ENV{arg/...}" Une idée serait donc d'ajouter une balise spip permettant de modifier l'environnement de la manière voulue. #SETENV{arg/} -> l'environnement se réinitialise avec l'ensemble des valeurs de #ENV{arg/...} Si utile, #SETENV pourrait accepter des arguments d'autres formes pour ajouter ou modifier ou supprimer d'autres valeurs ou jeux de valeurs.
Poster
Collaborator

Je ne vois pas en quoi modifier #ENV{arg/} permettra de faire un critère optionnel …

Je ne vois pas en quoi modifier #ENV{arg/} permettra de faire un critère optionnel …

C'est dans le cadre du portage d'un modèle qui fonctionne en SPIP2 et ne fonctionne plus en SPIP3 à cause d'un critère conditionnel. La proposition est de créer une nouvelle commande qui modifie tout l'env (qui le vide d'abord puis le recrée avec les différentes valeurs de arg/ affectées mais sans arg/ , c'est à dire que si ya #ENV{arg/id_article} avant, ce sera #ENV{id_article} après.
Il suffirait de mettre #SETENV{arg/} au début d'un modèle, et l'environnement ne contient plus QUE les paramètres passés explicitement, serait identique en SPIP3 à ce qu'il était en SPIP2, et les anciennes boucles marcheraient.

C'est dans le cadre du portage d'un modèle qui fonctionne en SPIP2 et ne fonctionne plus en SPIP3 à cause d'un critère conditionnel. La proposition est de créer une nouvelle commande qui modifie tout l'env (qui le vide d'abord puis le recrée avec les différentes valeurs de arg/ affectées mais sans arg/ , c'est à dire que si ya #ENV{arg/id_article} avant, ce sera #ENV{id_article} après. Il suffirait de mettre #SETENV{arg/} au début d'un modèle, et l'environnement ne contient plus QUE les paramètres passés explicitement, serait identique en SPIP3 à ce qu'il était en SPIP2, et les anciennes boucles marcheraient.
Poster
Collaborator

a ok, #SETENV influencerait l'#ENV de 1er niveau. Ce n'était pas très clair. Je croyais que #SETENV{arg/} permettait de modifier #ENV{arg}

a ok, #SETENV influencerait l'#ENV de 1er niveau. Ce n'était pas très clair. Je croyais que #SETENV{arg/} permettait de modifier #ENV{arg}

... et en conséquence il sera possible d'utiliser un critère conditionnel.

De manière plus générale une ou des instructions SPIP pour manipuler l'environnement pourraient être utiles.

... et en conséquence il sera possible d'utiliser un critère conditionnel. De manière plus générale une ou des instructions SPIP pour manipuler l'environnement pourraient être utiles.
Poster
Collaborator

ouais, mais je crains le pire avec ca (comme les $GLOBALS qu'on trouve de manière pourrie dans certains codes PHP)

ouais, mais je crains le pire avec ca (comme les $GLOBALS qu'on trouve de manière pourrie dans certains codes PHP)

oui, dans l'idée #SETENV vide l'env et le réaffecte avec autant de valeurs qu'il y a d'entrées dans le tableau reçu en argument. A adapter ou étendre à d'autres manipulations.

oui, dans l'idée #SETENV vide l'env et le réaffecte avec autant de valeurs qu'il y a d'entrées dans le tableau reçu en argument. A adapter ou étendre à d'autres manipulations.
Owner

très mauvaise idée que d'introduire une modification du #ENV, je pense qu'il faut trouver autre chose.

très mauvaise idée que d'introduire une modification du #ENV, je pense qu'il faut trouver autre chose.
Owner

Version cible mise à 3.1

**Version cible mise à 3.1**
b_b commented 9 years ago
Owner

Voir la méthode utilisée dans le modèle de GIS pour contourner ce problème :

http://zone.spip.org/trac/spip-zone/browser/plugins/gis/trunk/modeles/carte_gis.html

http://zone.spip.org/trac/spip-zone/changeset/69436/

À mon avis c'est une bonne piste.

Voir la méthode utilisée dans le modèle de GIS pour contourner ce problème : http://zone.spip.org/trac/spip-zone/browser/_plugins_/gis/trunk/modeles/carte_gis.html http://zone.spip.org/trac/spip-zone/changeset/69436/ À mon avis c'est une bonne piste.
Owner

on peut regarder aussi l'astuce donnée dans le paragraphe 10 (Les modèles et leur contexte en SPIP3) de http://contrib.spip.net/Astuces-longues-pour-SPIP (utiliser 2 critères dépendants de #ENV{args/id_objet}).

on peut regarder aussi l'astuce donnée dans le paragraphe 10 (Les modèles et leur contexte en SPIP3) de http://contrib.spip.net/Astuces-longues-pour-SPIP (utiliser 2 critères dépendants de #ENV{args/id_objet}).
b_b commented 9 years ago
Owner

Vu les solutions proposées pour s'adapter au nouveau comportement, je pense qu'on peut fermer le ticket.

Vu les solutions proposées pour s'adapter au nouveau comportement, je pense qu'on peut fermer le ticket.
Owner

Probablement qu'en debut de modèle il suffirait de mettre
[(#ENV{args/id_rubrique}|setenv{id_rubrique})] et le tour sera joué
Statut changé à Fermé

Probablement qu'en debut de modèle il suffirait de mettre `[(#ENV{args/id_rubrique}|setenv{id_rubrique})]` et le tour sera joué **Statut changé à Fermé**
Poster
Collaborator

tiens je remarque que par rapport à il y a 2 ans, cedric s'est converti à la modification de env...

tiens je remarque que par rapport à il y a 2 ans, cedric s'est converti à la modification de env...
Fil commented 8 years ago
Owner

à noter |setenv n'est pas (encore) dispo, c'est juste une proposition envoyée sur la liste spip-dev le 16.10.2014

à noter |setenv n'est pas (encore) dispo, c'est juste une proposition envoyée sur la liste spip-dev le 16.10.2014
Sign in to join this conversation.
No Milestone
No project
No Assignees
6 Participants
Notifications
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
There is no content yet.