Champs Extras ajoute ses champs même lorsque ce n’est pas nécessaire.
@b_b a trouvé un cas intéressant de bug avec Champs Extras. Facilement reproductible à l’heure actuelle
- créer un champs extras de date sur un auteur, par exemple "date_adhesion" avec une normalisation de type date (c’est par défaut le cas en créant un champ date avec le plugin d’interface).
- éditer un auteur en lui affectant cette date
- éditer un auteur en cliquant "Générer un nouveau mot de passe et l’envoyer par mail"
- l’auteur a perdu la date.
Ce qu’il se passe c’est que :
- on est dans un formulaire d’édition d’objet, donc champs extras peut s’activer,
- le bouton de génération de password est activé dans la partie verifier() du formulaire, et appelle
auteur_modifier($id_auteur, ['pass' => 'xxx'])
, - cette fonction appelle
objet_modifier_champs()
, - qui lance le pipeline
pre_edition
avecaction = modifier
, - cela déclenche champs extras qui complète les champs car dans l’environnement POST se trouve la clé
cextra_date_adhesion
(postée par le formulaire d’édition). Champs extras ajoute donc 'date_adhesion' => 'la date' -
objet_modifier_champs
exécute ensuitesql_updateq
, qui échoue sur date_adhesion car la date n’est pas correctement formattée
Effectivement, le traitement de "normalisation" est effectué par champs extras dans le pipeline 'verifier', qui est donc appelé après la partie verifier() du formulaire d’édition, sauf que dans ce cas de figure (traitement précoce dans vérifier), on ne rentre jamais dans ce code.
Problème principal
Je pense que le problème principal est le chargement de champs extras sur l’exécution auteur_modifier($id_auteur, ['pass' => 'xxx'])
: une liste de champs fixe est transmise, et champs extras ne devrait pas compléter ce tableau dans ce cas, il me semble.
Sauf que cette liste de champs de départ n’est actuellement pas communiquée au pipeline 'pre_edition', même si elle est bien transmise à objet_modifier_champs()
. Si champs extras en avait connaissance, il pourrait dire : je n’ajoute pas automatiquement mes champs, assez logiquement.
On pourrait transmettre donc au pipeline pre_edition
(dans objet_modifier_champs) :
- dans [args] :
'data' => isset($options['data']) ? $options['data'] : null
Champs extras pourrait alors ne pas chercher à charger ses champs dans son pipeline pre_edition si la clé data est renseignée.