Browse Source

Afficher_si,

la syntaxe `@toto@ IN 'A,B'` était prévue au départ pour les cas où
`toto` renvoie un array.

Mais côté JS, elle marchait également si @toto@ était une chaine.
Donc `@toto@ IN 'A,B'` était équivalent à `@toto@ == 'A' || @toto@ ==
'B'`. Sans doute une erreur de ma part lors de la réécriture il y a
quelques temps.

Cependant, maintenant que c'est fait, cela parait plutôt
logique/pratique.

Du coup on étend aussi cela côté PHP...

cf. https://contrib.spip.net/Formidable-le-generateur-de-formulaires#comment510112

Cela répond du reste à une demande formulé dans la discussion sur le
sens de `IN` en #44.

Close #163

Fix #44
Pour résumer :
- si le champ est monovalué, IN a le sens de "la valeur appartient à ce
tableau"
- si le champ est tabulaire, IN a le sens historique de "au moins une
valeur appartient à ce tableau" (donc plutôt un INTERSECTION)
- on laisse tomber de changer de syntaxe pour exprimer une vrai
INTERSECTION + on garde la petite erreur logique sur IN qui prend le
sens d'intersection
- a priori, pas besoin de dev un INCLUS, et si c'est le cas on fera plus
tard.
no_submit
Maïeul 10 months ago
parent
commit
f7940b0bf4
  1. 12
      inc/saisies_afficher_si_commun.php
  2. 28
      tests/saisies_afficher_si/saisies_tester_condition_afficher_si.php

12
inc/saisies_afficher_si_commun.php

@ -136,6 +136,16 @@ function saisies_tester_condition_afficher_si($champ, $total, $operateur='', $va
$champ = $tenter_unserialize;
}
}
// Transformation en tableau des valeurs et valeur_champ, si IN/!IN
if ($operateur === 'IN' or $operateur === '!IN') {
if (!is_array($champ)) {
if ($champ) {
$champ = array($champ);
} else {
$champ = array();
}
}
}
//Et maintenant appeler les sous fonctions qui vont bien
if (is_string($champ)) {
@ -182,7 +192,7 @@ function saisies_tester_condition_afficher_si_string($champ, $operateur, $valeur
}
/**
* Teste un condition d'afficher_si lorsque la valeur postée est un tableau
* Teste un condition d'afficher_si lorsque la valeur postée est un tableau
* @param array champ le champ à tester.
* @param string $operateur : l'opérateur:
* @param string $valeur la valeur à tester pour un IN. Par exemple "23" ou encore "23", "25"

28
tests/saisies_afficher_si/saisies_tester_condition_afficher_si.php

@ -215,6 +215,34 @@
2 => '',
3 => "!IN",
4 => "2,3"
),
'string_presence_IN_multiple' => array(
0 => true,
1 => 'choix1',
2 => '',
3 => 'IN',
4 => 'choix1,choix2'
),
'string_presence_NOT_IN_multiple' => array(
0 => true,
1 => 'choix3',
2 => '',
3 => '!IN',
4 => 'choix1,choix2'
),
'string_absence_IN_multiple' => array(
0 => false,
1 => 'choix3',
2 => '',
3 => 'IN',
4 => 'choix1,choix2'
),
'string_absence_NOT_IN_multiple' => array(
0 => false,
1 => 'choix2',
2 => '',
3 => '!IN',
4 => 'choix1,choix2'
)
);
return $essais;

Loading…
Cancel
Save