Saisies masquées par afficher_si et tableaux multidimensionnels
Je suis tombé sur un souci avec la Fabrique et les saisies masquées en voulant ajouter les saisies des vérifs.
Dans le formulaire, le name de toutes les saisies sont de la sorte : objets[truc][muche]
, objets[machin][chouette]
etc.
En simplifiant, dans le traiter il y a un unique _request('objets')
qui renvoie un tableau multidimensionnel avec toutes les valeurs des saisies, et c'est ça qui est stocké.
Et là c'est le drame : les valeurs des saisies masquées sont toujours présentes dans le tableau.
Pour reproduire et déboguer j'ai fait un formulaire simplifié avec juste la partie qui nous intéresse : un sélecteur pour choisir un type de vérif, et dessous les options de chaque type de vérif, qui ne sont affichées qu'en fonction de la sélection précédente. Et ça reprend exactement les names utilisés dans la Fabrique (j'aurais pu simplifier un peu, mais au moins comme ça on est sûrs).
<?php
ini_set('xdebug.var_display_max_depth', '10');
function formulaires_test_afficher_si_saisies() {
$saisies = array(
// Sélection
array(
'saisie' => 'selection',
'options' => array(
'nom' => 'objets[0][champs][0][saisie_verifier][type]',
'data' => array(
'code_postal' => 'Code postal',
'date' => 'Date',
'entier' => 'Nombre entier',
),
),
),
// Options masquées en fonction de la sélection
array(
'saisie' => 'input',
'options' => array(
'nom' => 'objets[0][champs][0][saisie_verifier][options][code_postal][pays]',
'afficher_si' => '@objets[0][champs][0][saisie_verifier][type]@ == "code_postal"',
'defaut' => 'FR',
),
),
array(
'saisie' => 'input',
'options' => array(
'nom' => 'objets[0][champs][0][saisie_verifier][options][date][normaliser]',
'afficher_si' => '@objets[0][champs][0][saisie_verifier][type]@ == "date"',
'defaut' => 'datetime',
),
),
array(
'saisie' => 'input',
'options' => array(
'nom' => 'objets[0][champs][0][saisie_verifier][options][entier][min]',
'afficher_si' => '@objets[0][champs][0][saisie_verifier][type]@ == "entier"',
'defaut' => '5',
),
),
);
return $saisies;
}
function formulaires_test_afficher_si_charger() {
$contexte = array(
'editable' => true,
'objets' => '',
);
return $contexte;
}
function formulaires_test_afficher_si_traiter() {
var_dump(_request('objets'));
return array();
}
Si par exemple je sélectionne la dernière option « Entier », voilà le tableau posté :
array (size=1)
0 =>
array (size=1)
'champs' =>
array (size=1)
0 =>
array (size=1)
'saisie_verifier' =>
array (size=2)
'type' => string 'entier' (length=6)
'options' =>
array (size=3)
'code_postal' =>
array (size=1)
'pays' => string '' (length=0)
'date' =>
array (size=1)
'normaliser' => string '' (length=0)
'entier' =>
array (size=1)
'min' => string '5' (length=1)
Il y a toujours le code postal et la date alors qu'elles sont masquées. Leur valeur est certes vide, mais la clé est toujours présente. On pourrait s'attendre à ce que les clés correspondantes aux saisies masquées soient enlevées du tableau. Alors bug, pas bug ? J'ai pas plus creusé la question que ça pour l'instant (ça bouge beaucoup les afficher_si ces derniers temps :p)