Validateurs dynamiques
Il est courant qu’un formulaire web nécessite des validateurs dynamiques, c’est à dire dépendant de certaines valeurs du formulaire lui même. Dans une des applications que j’ai écrite récemment une case à côcher permet à l’utilisateur de tester le formulaire et de ne pas enclencher l’action normale. Ainsi lorsque cette case à côcher est validée, un champs du formulaires n’est plus obligatoire, et un autre le devient.
Pour résoudre ce problème, une des solutions connue consiste à surcharger la méthode bind
de
la classe du formulaire, dérivée de sfForm
, et de changer à la
volée les validateurs.
Pour ma part je préfère exécuter ce changement dynamique de validateur dans
le preValidator
. Voici ce que cela donne:
public function configure() { [...] $this->validatorSchema->setPreValidator( new sfValidatorCallback ( array('callback' => array($this, 'isTest')))); }
public function isTest($validator, $values) { if (isset($values'is_test')) { $this->validatorSchema['email_recipients']->addOption('required', false); $this->validatorSchema['test_recipient']->addOption('required', true); } else { $this->validatorSchema['email_recipients']->addOption('required', true); $this->validatorSchema['test_recipient']->addOption('required', false); } return $values; }
Le code est plus facile à maintenir: tout ce qui concerne la validation
s’exécute uniquement dans des validateurs, sans passer par une méthode,
bind
qui n’a rien à voir avec ce processus.