Tout d'abord, il faut savoir que sfValidatorDate et sfValidatorDateTime sont presque identiques. sfValidatorDateTime étend sfValidatorDate qui elle même étend sfValidatorBase. Il faut aussi noter que sfValidatorDateTime redéfini un constructeur qui appel le constructeur parent, donc celui de sfValidatorDate et initialise l'option with_time à true.

Pour être plus clair, si vous avez une valeur de type DateTime à valider, vous n'êtes pas obligé d'utiliser la classe sfValidatorDateTime. Il vous suffira juste d'utiliser sfValidatorDate et de préciser vous même l'option with_time à true car elle est par défaut à false.
Je préconise tout de même l'utilisation de sfValidatorDateTime à sfValidatorDate si vous avez une valeur de type DateTime à valider. Car la personne qui passera derrière votre code comprendra de suite le type de la valeur à valider.
Je sais, je me contredis mais c'est pour que vous compreniez bien la subtilité entre les deux.

L'option date_format

Maintenant que tout est dit, nous allons passer au coeur du problème. Comment valider une date qui a un format français où bien même atypique ? La solution se trouve dans l'option date_format. On peut en effet lui donner une expression régulière. Celle-ci va nous permettre d'indiquer au validateur où se trouve le jour, le mois, l'année, l'heure, les minutes et les secondes.

Lorsque vous allez instancier sfValidatorDate, vous allez devoir procéder de la manière suivante :

$this->setValidators(array(
  'date' => new sfValidatorDate(
    array(
      'date_format' => '~(?P<day>\d{2})/(?P<month>\d{2})/(?P<year>\d{4})~'
    )
  )
));

L'exemple ci-dessus fonctionne uniquement pour les date ayant le format jj/mm/aaaa.
Comme vous pouvez le voir, ce qui nous permet d'indiquer où se trouve chaque élément de la date est l'option ?P<element>
Voici la liste des noms des éléments que l'on peut rechercher dans l'expression régulière :

  • day
  • month
  • year
  • hour
  • minute
  • second

Mais si vous avez un format atypique par exemple mm-aaaa/jj (oui je sais c'est tiré par les cheveux mais c'est pour l'exemple) vous devrez utiliser l'expression régulière suivante :

$this->setValidators(array(
  'date' => new sfValidatorDate(
    array(
      'date_format' => '~(?P<month>\d{2})-(?P<year>\d{4})/(?P<day>\d{2})~'
    )
  )
));

Si vous ne connaissez pas les expressions régulières, je vous conseille d'aller faire un tour sur le chapitre dédié à ce sujet sur le Site du Zéro.

L'option min et max

Ces deux options sont similaires pour le paramètre qu'elles prennent. Simplement min permet d'indiquer la date minimale que l'utilisateur doit fournir et max, la date maximale.

Vous pouvez donner soit un timestamp ou un paramètre de type string qui peut-être pris en compte par la classe DateTime. Voici une liste non-exhaustive :

  • now
  • yesterday
  • tomorrow

Vous pouvez trouver la liste complète sur la documentation de PHP.net.
De cette manière là, vous pouvez indiquer par exemple un age minimal de 18 ans de cette manière :

$this->setValidators(array(
  'date' => new sfValidatorDate(
    array(
      'date_format' => '~(?P<day>\d{2})/(?P<month>\d{2})/(?P<year>\d{4})~',
      'max'         => '18 years ago'
    )
  )
));

Voilà j'ai fait le tour sur les principales options des classes sfValidatorDate et sfValidatorDateTime.
Si vous avez des questions ou remarques, je reste bien sûr à votre disposition.

(Photo : Petits partages entre amis)