[Formidable] Champ case à cocher obligatoire avec stockage valeur 0 ne valide jamais #258

Closed
opened 3 weeks ago by RealET · 8 comments
RealET commented 3 weeks ago
Collaborator

Bonjour,

Le problème

J'ai un champ dans formidable de type case à cocher définit ainsi :

270|Congrès 270 €
0|Étudiant 0 €

Et le champ est obligatoire

Impossible de valider le formulaire, il signale qu'il y a une erreur dans la saisie.

J'ai triché en écrivant :

0€|Étudiant 0 €

Mais c'est pas propre.

comportement attendu

Pouvoir explicitement stocker 0 (zéro) et le champ obligatoire soit considéré comme rempli.

Solution proposée par @rastapopoulos

(Mais la soluce quand même, il me semble depuis le début il faut un === ici, surtout pas == : https://git.spip.net/spip-contrib-extensions/saisies/src/branch/master/inc/saisies_verifier.php#L73 )

Bonjour, # Le problème J'ai un champ dans formidable de type case à cocher définit ainsi : ``` 270|Congrès 270 € 0|Étudiant 0 € ``` Et le champ est **obligatoire** Impossible de valider le formulaire, il signale qu'il y a une erreur dans la saisie. J'ai triché en écrivant : ``` 0€|Étudiant 0 € ``` Mais c'est pas propre. # comportement attendu Pouvoir explicitement stocker 0 (zéro) et le champ obligatoire soit considéré comme rempli. # Solution proposée par @rastapopoulos (Mais la soluce quand même, il me semble depuis le début il faut un === ici, surtout pas == : https://git.spip.net/spip-contrib-extensions/saisies/src/branch/master/inc/saisies_verifier.php#L73 )
Poster
Collaborator

J'ai testé la solution du === mais ça n'est pas là que ça se passe.
En effet, $valeur vaut à cet endroit : Array ( )

J'ai testé la solution du === mais ça n'est pas là que ça se passe. En effet, `$valeur` vaut à cet endroit : `Array ( )`
Poster
Collaborator

Et c'est https://git.spip.net/spip-contrib-extensions/saisies/src/branch/master/inc/saisies_request.php#L197 qui supprime les zéros, comme le montre l'exemple Example #2 array_filter() without callback de la doc : https://www.php.net/manual/en/function.array-filter.php

Et c'est https://git.spip.net/spip-contrib-extensions/saisies/src/branch/master/inc/saisies_request.php#L197 qui supprime les zéros, comme le montre l'exemple `Example #2 array_filter() without callback` de la doc : https://www.php.net/manual/en/function.array-filter.php
Poster
Collaborator

Et j'ai essayé avec ceci :

function saisies_get_valeur_saisie($saisie, $valeurs = null) {
	$champ = $saisie['options']['nom'];
	$file = saisies_saisie_est_fichier($saisie);

	// Cas de la saisie 'fichiers':
	if ($file and !is_array($valeurs)) {
		$valeur = saisies_request_from_FILES($champ);
	}
	// Tout type de saisie, sauf fichiers
	else {
		$valeur = saisies_request($champ, $valeurs);
		// Filtrer les tableaux. Ex d'application:
		// - saisie date/heure qui envoi des input texte en tableau > il faut pas que les champs envoyés soient vides
		// - saisie destinataire, qui pourrait avoir une première option vide
		if (is_array($valeur)) {
			$valeur = array_filter($valeur, 'saisies_notnull');
		}
	}
	return $valeur;
}

function saisies_notnull($valeur) {
	return (!is_null($valeur));
}

Et là, la valeur 0 est bien prise en compte

Je ne commite rien parce que je n'ai aucune idée des effets de bords que cette modification pourrait avoir.

Et j'ai essayé avec ceci : ``` function saisies_get_valeur_saisie($saisie, $valeurs = null) { $champ = $saisie['options']['nom']; $file = saisies_saisie_est_fichier($saisie); // Cas de la saisie 'fichiers': if ($file and !is_array($valeurs)) { $valeur = saisies_request_from_FILES($champ); } // Tout type de saisie, sauf fichiers else { $valeur = saisies_request($champ, $valeurs); // Filtrer les tableaux. Ex d'application: // - saisie date/heure qui envoi des input texte en tableau > il faut pas que les champs envoyés soient vides // - saisie destinataire, qui pourrait avoir une première option vide if (is_array($valeur)) { $valeur = array_filter($valeur, 'saisies_notnull'); } } return $valeur; } function saisies_notnull($valeur) { return (!is_null($valeur)); } ``` Et là, la valeur 0 est bien prise en compte Je ne commite rien parce que je n'ai aucune idée des effets de bords que cette modification pourrait avoir.

Ah oui pardon c'est une saisie checkbox donc tableau.

Mais c'est pas null qu'on veut filtrer, ça existe quasi jamais null, c'est des input text (cf l'exemple pour date heure). Donc il faut aussi filtrer "" chaine vide.

Mais juste pas "0" alors que empty("0") renvoie true. On veut filtrer null et "" chaine vide.

Ah oui pardon c'est une saisie checkbox donc tableau. Mais c'est pas null qu'on veut filtrer, ça existe quasi jamais null, c'est des input text (cf l'exemple pour date heure). Donc il faut aussi filtrer "" chaine vide. Mais juste pas "0" alors que `empty("0")` renvoie true. On veut filtrer `null` et "" chaine vide.

Càd le même principe que proposé mais avec : return (!empty($valeur) and $valeur != "0")

Càd le même principe que proposé mais avec : `return (!empty($valeur) and $valeur != "0")`
Poster
Collaborator

Après lecture de la doc de https://www.php.net/manual/en/function.empty.php, et compris que ça considère 0 (ce qui est la valeur passée à cet endroit, et non pas la string '0'), j'ai fait ça avec :
return (isset($valeur) AND $valeur !== '');

Après lecture de la doc de https://www.php.net/manual/en/function.empty.php, et compris que ça considère 0 (ce qui est la valeur passée à cet endroit, et non pas la string '0'), j'ai fait ça avec : `return (isset($valeur) AND $valeur !== '');`
Owner

Sur la PR je fais des tests.

Mais sur le fond j'ai du mal à comprende l'interet d'avoir un checkbox proposant deux pris dont un prix égal à 0. A ce moment là autant utiliser soit un radio, soit un checkbox sans rien à cocher, non ?

Sur la PR je fais des tests. Mais sur le fond j'ai du mal à comprende l'interet d'avoir un checkbox proposant deux pris dont un prix égal à 0. A ce moment là autant utiliser soit un radio, soit un checkbox sans rien à cocher, non ?
Poster
Collaborator

Alors, c'est un ancien formulaire que j'ai adapté dans le temps.
Avant, tous les prix étaient > 0, et il y avait des cases supplémentaires pour hôtel et repas.
Là, il n'y a plus que 2 prix (Et un JS qui en fait la somme) et une zone qui ne s'affiche que si la 2e case est sélectionnée.

Tu peux le voir ici : https://www.rfam.fr/spip.php?rubrique3

Autrement dit, c'est sans doute un formulaire qui aurait pu être conçu autrement s'il avait été ainsi dès le départ.

Mais c'est son historique qui fait qu'il est ainsi.

Alors, c'est un ancien formulaire que j'ai adapté dans le temps. Avant, tous les prix étaient > 0, et il y avait des cases supplémentaires pour hôtel et repas. Là, il n'y a plus que 2 prix (Et un JS qui en fait la somme) et une zone qui ne s'affiche que si la 2e case est sélectionnée. Tu peux le voir ici : https://www.rfam.fr/spip.php?rubrique3 Autrement dit, c'est sans doute un formulaire qui aurait pu être conçu autrement s'il avait été ainsi dès le départ. Mais c'est son historique qui fait qu'il est ainsi.
maieul closed this issue 2 weeks ago
Sign in to join this conversation.
No Milestone
No Assignees
3 Participants
Notifications
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
There is no content yet.