Tester des dates avec la classe dateComparator de symfony2

Dans cet article je vais vous expliquer comment créer un validator qui va vérifier la date soumise via un formulaire.

Dans cet exemple nous allons vérifier que la date indiquée par l’utilisateur est bien supérieure à celle du jour + 1 mois.

Tous se passe au niveau de votre entity, voici le code et les explications suivront:



<?php

namespace VotreNameSpace\Entity;

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\ExecutionContext;
use Symfony\Component\Finder\Comparator\DateComparator;

/**
* Opart\DealBundle\Entity\Deal
*
* @Assert\Callback(methods={"testDateValidite"})
*/
class Deal
{
/**

* @var date $dateValidite
*
* @ORM\Column(name="dateValidite", type="datetime")
*/
private $dateValidite;

public function testDateValidite(ExecutionContext $context)

{

$dateComparator=new DateComparator($this->dateValidite->format('Y-m-d H:i:s'));
$dateComparator->setOperator(">");
$test=new \DateTime('now');
$test->add(new \DateInterval('P1M'));
if($dateComparator->test($test->format('U'))) {
$propertyPath = $context->getPropertyPath() . '.dateValidite';
$context->setPropertyPath($propertyPath);
$context->addViolation('Votre annonce doit être valide pendant au moins un mois', array(), null);
}
}

/**
* Set dateValidite
*
* @param date $dateValidite
*/
public function setDateValidite($dateValidite)
{
$this->dateValidite = $dateValidite;
}

/**
* Get dateValidite
*
* @return date
*/
public function getDateValidite()
{
return $this->dateValidite;
}

}


 On commence par appeler les classes dont on va avoir besoin.



use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\ExecutionContext;
use Symfony\Component\Finder\Comparator\DateComparator;


– Assert va nous permettre d’utiliser les annotations directement dans notre entity pour gérer les contraintes.
– ExecutionContext nous permettra d’afficher sur nos champs les erreurs détectées
– Datecomparator est la classe qui va nous permettre de tester notre date

On spécifie notre callback



@Assert\Callback(methods={"testDateValidite"})


– Cette annotation indique qu’il faudra appeler la fonction « testDateValidite » lorsque le formulaire sera soumis.

Création de l’objet DateComparator



$dateComparator=new DateComparator($this->dateValidite->format('Y-m-d H:i:s'));


– Ici on créé un nouvel objet dateComparator et on lui assigne comme cible la date de notre objet (en l’occurence celle soumise via notre formulaire)

On indique quel comparaison on veut effectuer



$dateComparator->setOperator(">");


– Ici on spécifie l’opérateur de comparaison.

On créé notre date de comparaison



$test=new \DateTime('now');
$test->add(new \DateInterval('P1M'));


– On créé un nouvel objet date et on lui ajoute un mois.

On effectue la comparaison



if($dateComparator->test($test->format('U'))) {
$propertyPath = $context->getPropertyPath() . '.dateValidite';
$context->setPropertyPath($propertyPath);
$context->addViolation('Votre annonce doit être valide pendant au moins un mois', array(), null);
}


Si le test est positif, c’est à dire que notre date de test (aujourd’hui + 1 mois) est supérieure à la date soumise par l’utilisateur alors on renvoi un message d’erreur vers le champ nommé « dateValidite ».

 

 

Laisser un commentaire

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