Saisies : étapes et affichage conditionnel

Bonsoir à tous,

Depuis mon précédent post, j’essaie de partir sur quelque chose de plus simple mais je tombe sur un os lors de la déclaration de mon formulaire d’édition d’un objet éditorial avec Saisies.

Voici le formulaire :

	$saisies = [
		'options' => [
			'etapes_activer' => true,
			'etapes_ignorer_recapitulatif' => true
		],
		[
			'saisie' => 'fieldset',
			'options' => [
				'nom'  => 'description',
				'label' => 'Description',
			],
			'saisies' => [
				[
					'saisie' => 'input',
					'options' => [
						'nom' => 'titre',
						'label' => 'Titre',
						'obligatoire' => 'oui',
					]
				],
				[
					'saisie' => 'selection',
					'options' => [
						'nom' => 'type',
						'obligatoire' => 'oui',
						'label' => 'Type',
						'data' => [
							'one' => 'One',
							'two' => 'Two',
						]
					],
				],
			],
		],
		[
			'saisie' => 'fieldset',
			'options' => [
				'nom'  => 'one_first_step',
				'label' => 'Première étape pour One',
				'afficher_si' => '@type@ == "one"',
			],
			'saisies' => [
				[
					'saisie' => 'input',
					'options' => [
						'nom' => 'titre_one',
						'label' => 'One Titre',
						'obligatoire' => 'oui',
					]
				],
			],
		],
		[
			'saisie' => 'fieldset',
			'options' => [
				'nom'  => 'one_second_step',
				'label' => 'Deuxième étape pour One',
				'afficher_si' => '@type@ == "one"',
			],
			'saisies' => [
				[
					'saisie' => 'input',
					'options' => [
						'nom' => 'descriptif_one',
						'label' => 'One Descriptif',
						'obligatoire' => 'oui',
					]
				],
			],
		],
		[
			'saisie' => 'fieldset',
			'options' => [
				'nom'  => 'two_single_step',
				'label' => 'Unique étape pour Two',
				'afficher_si' => '@type@ == "two"',
			],
			'saisies' => [
				[
					'saisie' => 'input',
					'options' => [
						'nom' => 'titre_two',
						'label' => 'Two Titre',
						'obligatoire' => 'oui',
					]
				],
			],
		],
	];

L’idée est donc d’avoir plusieurs étapes : sur la première « page », on peut sélectionner un type qui va conditionner les étapes suivantes:

  • si on choisit « One », on doit pouvoir poursuivre l’édition de l’objet en deux étapes
  • si on choisit « Two », une seule étape reste à remplir avant enregistrement

MAIS :

  • si je sélectionne « One », j’ai bien les deux étapes qui s’affichent, mais à la troisième étape je n’ai pas le bouton « Enregister » mais le bouton « Suivant » ; si je clique sur « Suivant », une validation se produit et l’erreur « Il y a 8 erreurs dans votre saisie, veuillez vérifier les informations. » s’affiche.
  • si je sélectionne « Two », je n’ai bien plus qu’une étape qui s’affiche, j’ai bien le bouton « Enregistrer » mais j’ai la même erreur « Il y a 8 erreurs dans votre saisie, veuillez vérifier les informations. » qui s’affiche.

Ce que j’essaie d’accomplir est-il possible ? Si oui, que manque-t-il dans la déclaration de mes saisies ?

Merci par avance,

Bonne soirée !

Je viens de regarder, ca m’a l’air correct. Tu pourrais envoyer un code complet pour que je vérifier où ca coince ?

Merci @maieul !

J’essaie de reproduire sur un exemple minimal de plugin généré depuis la fabrique et je te mets ça à disposition dans la journée.

pas d’urgence, je ne pourrais pas m’y pencher avant dimanche après midi.

Voici un plugin minimaliste (bricebou/etapes - etapes - reclic.dev vous délivre votre code) généré avec la Fabrique avec quelques opérations ensuite :

  • on retire tout le contenu dans formulaires/editer_etape.html (sinon, l’option pour mettre en place le multi-étapes semble sans effet) ;
  • on revoie le tableau des saisies et on crée les différents fieldsets pour mettre en place des étapes en fonction du select de la première page.

[EDIT] : je me rends compte qu’à partir du moment où j’utilise l’option ‹ etapes_activer ›, avec ou sans récapitulatif :

	$saisies = [
		'options' => [
			'etapes_activer' => true,
		],
		...
	];

j’obtiens l’erreur suivante dans les logs :

2023-10-13 12:46:33 172.22.0.5 (pid 4954) :Pri:CRITIQUE: Afficher_si incorrect.  syntaxe_incorrecte

Merci encore et par avance :slight_smile:

Je suis en train d’enqueter. Je répons rapidement sur ce que j’ai capté pour l’instant.

on retire tout le contenu dans formulaires/editer_etape.html (sinon, l’option pour mettre en place le multi-étapes semble sans effet) ;

effectivement par défaut cela sera sans effet, mais tu pourrais très bien le faire en appelant les bon fichiers. Mais ca n’a pas grand intéret

[EDIT] : je me rends compte qu’à partir du moment où j’utilise l’option ‹ etapes_activer ›, avec ou sans récapitulatif :

a creuser

Et donc sur la base. Ton problème se situe à cette ligne là

en gros tu utiliser une fonction de SPIP qui t’assure que les champs d’un OBJET répondent à la définition qui a été donné, à savoir qu’ls sont bien remplis.

SAUF que tes champs tu les a masqués par afficher_si, donc forcément certains sont vides au moment où tu vérifier l’étape finale. Et donc ca provoque des erreurs (tu peux le voir en faisant un var_dump après)

Mais en fait tu n’a pas besoin de cette ligne, car puisque tu déclare tes champs de FORMULAIRE (et j’insiste sur la différence entre champ de formulaire et champ d’objet) comme « obligatoire » via la déclaration en SAISIE, bah en fait le plugin saisies s’occupe deja de vérifier que les champs sont bien rempls, tout en tenant compte des afficher_si.

DONC : supprime la ligne et ca devrait le faire.

Cela étant, en debugant ca j’ai remarqué aussi 2/3 bizarreries dans saisies, mais sans incidences directe sur ton truc, a priori. Je testerai demain pour vérifier plus en détails.

Merci beaucoup @maieul pour ces explications !

Du coup, je poursuis mes essais mais me rend compte que le bouton « Enregistrer » n’apparaît pas si il reste une étape masquée après celle que l’on cherche à valider.

Si on a :

  • selection one / two
  • 1ère étape de one
  • 2ème étape de one
  • 1 étape pour two

La 2ème étape pour One présente toujours les boutons « Précédent »/« Suivant » au lieu de enregistrer.
Mais un clic sur « Suivant » déclenche bien l’enregistrement du formulaire, la création de l’objet.

C’est effectivmeent un bug. J’ai ouvert un ticket.

Et donc cette PR devrait résoudre le problème.

Merci beaucoup @maieul pour cette PR et ta réactivité !

Je viens de tester et ça marche parfaitement ! :slight_smile:

le log erronée Afficher_si incorrect. syntaxe_incorrecte est corrigé dans le master de la branche saisie.

bon en fait on m’a signalé que cette PR ne pouvait pas marcher dans tous les cas, mais uniquement dans ton cas précis où l’on n’a plus d’étape après l’étape courante. Mais parfois on peut avoir des étapes conditionnés après l’étape courante.

Bref, j’ai pondu une autre PR 339

La version 4.11.0 de saisie corrige cela.

Merci beaucoup @maieul !