La gestion auto du multi-étapes casse celleux qui font du multi-étapes de leur côté sans l'API PHP #214

Closed
opened 9 months ago by rastapopoulos · 3 comments
Owner

Le cas où ça pète est tout de même un peu rare :

  • avoir un form multi-étapes à la main, avec la méthode du core, déclarée à la main
  • avoir dedans ses propres champs, avec #SAISIE ou même direct en HTML peu importe
  • avoir en plus à un endroit, un appel à #GENERER_SAISIES (donc qui attend un tableau PHP) pour y mettre les champs extras de tel objet, ou en fait tout autre déclaration de saisies en tableau PHP

Alors dans ce cas, ce qui doit être généré par #GENERER_SAISIES est pété puisque ça passe dans tous les mécanismes auto qui prennent en compte $env['_etape'] ou _request('_etape') en essayant de chercher des champs dans une déclaration qui n'existe pas (puisque le form complet lui n'est pas déclaré en saisies PHP).

@b_b a ce cas pour le form de Géodiversité ici par exemple :
27e899cc0e

Et il pointe ces deux commits qui modifient le contenu quand ya "_etape" dans le contexte :
34704be534 + 608f46deb1

M'est-avis que dans les divers tests il ne faudrait pas QUE tester si ya "_etape", mais aussi si c'est bien un form déclaré en saisies PHP. S'il n'y a pas du tout de "saisies_par_etapes" dans l'environnement, alors il faut laisser tel quel, quelque chose dans ce goût là.

Le cas où ça pète est tout de même un peu rare : - avoir un form multi-étapes à la main, avec la méthode du core, déclarée à la main - avoir dedans ses propres champs, avec #SAISIE ou même direct en HTML peu importe - avoir *en plus* à un endroit, un appel à #GENERER_SAISIES (donc qui attend un tableau PHP) pour y mettre les champs extras de tel objet, ou en fait tout autre déclaration de saisies en tableau PHP Alors dans ce cas, ce qui doit être généré par #GENERER_SAISIES est pété puisque ça passe dans tous les mécanismes auto qui prennent en compte `$env['_etape']` ou `_request('_etape')` en essayant de chercher des champs dans une déclaration qui n'existe pas (puisque le form complet lui n'est pas déclaré en saisies PHP). @b_b a ce cas pour le form de Géodiversité ici par exemple : https://github.com/geodiversite/geodiversite/commit/27e899cc0e71120b0877a0cf71ffa1f1a6077eb5 Et il pointe ces deux commits qui modifient le contenu quand ya "_etape" dans le contexte : https://git.spip.net/spip-contrib-extensions/saisies/commit/34704be534d8f79edb7248eb991ad74071f3895c + https://git.spip.net/spip-contrib-extensions/saisies/commit/608f46deb18ed5e6dc6e09c4821de610002fd7ca M'est-avis que dans les divers tests il ne faudrait pas QUE tester si ya "_etape", mais aussi si c'est bien un form déclaré en saisies PHP. S'il n'y a pas du tout de "saisies_par_etapes" dans l'environnement, alors il faut laisser tel quel, quelque chose dans ce goût là.
Collaborator

Merci pour le ticket, je complète pour dire que les deux commits que je pointait sont ceux qui pètent la génération des attributs afficher_si sur les saisies du formulaires.

Pour le premier problème, celui avec #GENERER_SAISIES j'ai pu fourber facilement en passant un paramètre _etape vide à la balise, mais pour le pb des afficher_si, c'est une autre histoire...

Merci pour le ticket, je complète pour dire que les deux commits que je pointait sont ceux qui pètent la génération des attributs afficher_si sur les saisies du formulaires. Pour le premier problème, celui avec `#GENERER_SAISIES` j'ai pu fourber facilement en passant un paramètre `_etape` vide à la balise, mais pour le pb des afficher_si, c'est une autre histoire...
Collaborator

Avec le patch suivant les afficher_si fonctionnent bien dans mon cas :

diff --git a/inc/saisies_afficher.php b/inc/saisies_afficher.php
index 2ef13c8..5f644cf 100644
--- a/inc/saisies_afficher.php
+++ b/inc/saisies_afficher.php
@@ -117,14 +117,10 @@ function saisies_generer_html($champ, $env = array()) {
 
 	// S'il y a le détail des saisies du même formulaire, on le passe en contexte. Utiliser pour générer correctement les afficher_si
 	// Attention, en cas de multi-étapes, on passe le contexte de toutes les saisies, classées par etape en cherchant par priorit dans `saisies_par_etapes`, puis `_saisies_par_etapes`, puis `saisies` qu'on regroupe en étape.
-	if (isset($env['_etape'])) {
-		if (isset($env['saisies_par_etapes'])) {
-			$contexte['_saisies'] = $env['saisies_par_etapes'];
-		} elseif (isset($env['_saisies_par_etapes'])) {
-			$contexte['_saisies'] = $env['_saisies_par_etapes'];
-		} else {
-			$contexte['_saisies'] = isset($env['saisies']) ? saisies_lister_par_etapes($env['saisies']) : array();
-		}
+	if (isset($env['_etape']) and isset($env['saisies_par_etapes'])) {
+		$contexte['_saisies'] = $env['saisies_par_etapes'];
+	} elseif (isset($env['_etape']) and isset($env['_saisies_par_etapes'])) {
+		$contexte['_saisies'] = $env['_saisies_par_etapes'];
 	} else {
 		$contexte['_saisies'] = isset($env['saisies']) ? $env['saisies'] : array();
 	}
diff --git a/inc/saisies_afficher_si_js.php b/inc/saisies_afficher_si_js.php
index 3941c1c..a5b49d8 100644
--- a/inc/saisies_afficher_si_js.php
+++ b/inc/saisies_afficher_si_js.php
@@ -26,7 +26,7 @@ function saisies_afficher_si_js($condition, $saisies_par_etapes = array()) {
 		return '';
 	}
 	$saisies_par_etapes = pipeline('saisies_afficher_si_saisies', $saisies_par_etapes);
-	if ($etape = _request('_etape')) {
+	if ($etape = _request('_etape') and (_request('saisies_par_etapes') or _request('_saisies_par_etapes'))) {
 		$saisies_etape_courante_par_nom = saisies_lister_par_nom($saisies_par_etapes["etape_$etape"]['saisies']);
 		$saisies_toutes_par_nom = saisies_lister_par_nom($saisies_par_etapes);
 	} else {

Mais ça supprime un cas d'usage dans saisies_generer_html() dont je ne connais pas l'utilité cf https://git.spip.net/spip-contrib-extensions/saisies/src/branch/master/inc/saisies_afficher.php#L126

ping @maieul

Avec le patch suivant les afficher_si fonctionnent bien dans mon cas : ```diff diff --git a/inc/saisies_afficher.php b/inc/saisies_afficher.php index 2ef13c8..5f644cf 100644 --- a/inc/saisies_afficher.php +++ b/inc/saisies_afficher.php @@ -117,14 +117,10 @@ function saisies_generer_html($champ, $env = array()) { // S'il y a le détail des saisies du même formulaire, on le passe en contexte. Utiliser pour générer correctement les afficher_si // Attention, en cas de multi-étapes, on passe le contexte de toutes les saisies, classées par etape en cherchant par priorit dans `saisies_par_etapes`, puis `_saisies_par_etapes`, puis `saisies` qu'on regroupe en étape. - if (isset($env['_etape'])) { - if (isset($env['saisies_par_etapes'])) { - $contexte['_saisies'] = $env['saisies_par_etapes']; - } elseif (isset($env['_saisies_par_etapes'])) { - $contexte['_saisies'] = $env['_saisies_par_etapes']; - } else { - $contexte['_saisies'] = isset($env['saisies']) ? saisies_lister_par_etapes($env['saisies']) : array(); - } + if (isset($env['_etape']) and isset($env['saisies_par_etapes'])) { + $contexte['_saisies'] = $env['saisies_par_etapes']; + } elseif (isset($env['_etape']) and isset($env['_saisies_par_etapes'])) { + $contexte['_saisies'] = $env['_saisies_par_etapes']; } else { $contexte['_saisies'] = isset($env['saisies']) ? $env['saisies'] : array(); } diff --git a/inc/saisies_afficher_si_js.php b/inc/saisies_afficher_si_js.php index 3941c1c..a5b49d8 100644 --- a/inc/saisies_afficher_si_js.php +++ b/inc/saisies_afficher_si_js.php @@ -26,7 +26,7 @@ function saisies_afficher_si_js($condition, $saisies_par_etapes = array()) { return ''; } $saisies_par_etapes = pipeline('saisies_afficher_si_saisies', $saisies_par_etapes); - if ($etape = _request('_etape')) { + if ($etape = _request('_etape') and (_request('saisies_par_etapes') or _request('_saisies_par_etapes'))) { $saisies_etape_courante_par_nom = saisies_lister_par_nom($saisies_par_etapes["etape_$etape"]['saisies']); $saisies_toutes_par_nom = saisies_lister_par_nom($saisies_par_etapes); } else { ``` Mais ça supprime un cas d'usage dans `saisies_generer_html()` dont je ne connais pas l'utilité cf https://git.spip.net/spip-contrib-extensions/saisies/src/branch/master/inc/saisies_afficher.php#L126 ping @maieul
Collaborator

Je viens d'envoyer le patch dans un PR pour avancer sur le sujet.

Je viens d'envoyer le patch dans un PR pour avancer sur le sujet.
maieul closed this issue 6 months ago
Sign in to join this conversation.
No Milestone
No Assignees
2 Participants
Notifications
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
There is no content yet.