Travailler sur les validateurs start_date end_date symfony

Bonjour,

Voilà j’écris cet article pour partager une solution sur un formulaire symfony qui contient un widget start_date et end_date utilisant sfWidgetFormI18nDate.

Le problème était de pouvoir, en fonction de la start_date, définir une end_date minimale dans un validateur.

La solution était pour ce formulaire de surcharger la méthode doBind pour récupérer les valeurs du start_date et définir le minimum pour le end_date.

Voici le code pour la solution :

// on récupère d'abord la valeur de la start date dans une variable $date
$date = strtotime($values['start_date']['day']."/".$values['start_date']['month']."/".$values['start_date']['year']);
// Ensuite on ajoute la valeur minimale que l'on veut pour le end date
$date = strtotime("+ 5 month", $date);

// Enfin on met en place le validateur pour cette end date
$this->validatorSchema['end_date'] = new sfValidatorDate(array("min" => $date), array("min" => "La date doit être supérieure à %min%"));

Voilà j’espère que cette solution pourra aider du monde 🙂

Merci à Lermit et Yochima pour leur aide.

Si vous avez apprécié cet article, pensé à laissé un commentaire ou vous abonner au flux RSS feed.

7 thoughts on “Travailler sur les validateurs start_date end_date symfony

  1. Salut !

    Sympa la petite astuce, mais j’ai quand même une petite question 🙂

    Pourquoi placer du code de validation dans le doBind du formulaire ? ce code (de trois lignes, certes) n’est pas réutilisable partout, et ça, c’est pas cool.
    A vu de nez, j’aurais étendu le validateur sfValidatorDateRange pour y ajouter une option qui gérerait l’intervalle minimum entre les deux dates.

    Vous en pensez quoi ?

  2. C’est vrai que c’est possible avec le sfValidatorDateRange, mais comme je ne trouvais pas de solution lorsque j’étais face à ce problème et que je ne connaissais pas le sfValidatorDateRange c’est pour cela que je l’ai fait dans le doBind.
    Par ailleurs je devais personnaliser la end_date en fonction d’autres options du formulaire c’est pour cela que je suis passé par le doBind.

    Mais ta solution est aussi acceptable 🙂

    Merci

    edit : Ah et je n’utilisais cette solution que pour ce formulaire là il y a ça aussi qui a joué 😉

  3. Yop !

    Le problème avec ta solution, c’est que tu pars du principe que la date de début est correctement formée. Tu as essayé d’envoyer une start_date incomplète (du style sans le jour) ?

    L’avantage de passer par un validateur, et plus forte raison par le sfValidatorRange, c’est que tu t’assures en premier lieu que les deux dates sont correctes, puis qu’ensuite tu les as à disposition pour continuer les vérifs.

    Si tu as besoin de vérifier la cohérence de la date de fin par rapport à d’autres champs que la date de début, un postValidator dans le form sera tout aussi adapté 🙂

  4. J’ai déjà un validator sur ma start_date donc du coup si le jour n’est pas rempli, le validateur indique que la date est incorrecte 😉

    Surement que ta solution pour le postValidator est plus adapté et donc si je peux je mettrais le postValidator en place si c’est mieux de le faire ainsi 🙂

    ps : cela ne fait que 3 mois que j’ai commencé à utiliser symfony c’est ça aussi qui fait que je galérais tant sur ce problème… ^^

  5. Salut,

    De manière générale, étendre le binding pour la validation des données est une mauvaise pratique car il n’est pas possible de remonter correctement les erreurs au formulaire.
    Toute validation doit être faite par le validatorSchema, qui traite les erreurs, les formatte…

    La validation de données transmises par l’utilisateur doit donc être gérée exclusivement avec des validateurs (qui sont testés unitairement).
    Une exception : il est parfois judicieux de garder le contexte de validation, un sfValidatorCallback est utilisé dans ce cas, et le callback doit bien sur être testé unitairement !

    Pour aller plus loin, il y a 3 manière d’ajouter un validateur sur un form :
    * avant la validation des champs manipule l’ensemble des données passées (preValidator)
    * sur un champ, manipule la donnée uniquement
    * après la validation des champs, manipule l’ensemble des données passées (postValidator)

    Comme le souligne Kévin, une bonne pratique est d’étendre le validateur de « date range ».

    Personnellement, j’aurai plutôt utilisé un post validator sur le form.

    Bonne continuation !

  6. bonjour j’aurais souhaite que tu developpe un peu le postvalidator .je voudrais faire un formulaire de reservation de billet d’avion donc la date arrivee doit etre superieure a la date depart et je suis pas avance niveau validateurs donc si tu peux m’aider je t’en serais vraiment reconnaissant (j’utilise symfony2)

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *