août
18
2009

Validateur de dates

Certains d’entre vous ont voulu à plusieurs reprises faire un formulaire avec différents champs de Dates. L’une devant être inférieure à l’autre comme une date d’emménagement et de déménagement.

Bien évidement, le framework Zend a pensé à tout ceci avec le composant Zend_Date mais n’a pas pensé aux formulaires. Il n’y a pas de validateur connu (pour le moment) servant à ceci.

C’est pourquoi, dans le but d’en avoir un sous la main et aussi car j’en avais surtout besoin, je créai un validateur de dates. Il me permet de différencier deux champs contenant une date (de préférence des datepickers jQuery ou Dojo) et dire si oui ou non la date 1 est plus ancienne que la date 2.

Voici d’ailleurs le code du validateur:

 PHP |  copy code |? 
01
/**
02
 * App_Validate_Date
03
 * 
04
 * Classe servant à faire la différene entre 2 dates
05
 * 
06
 * Retournera True si valide
07
 * False si faux
08
 *
09
 */
10
class App_Validate_Date extends Zend_Validate_Abstract
11
{
12
	const FALSEDATE = "falseDate";
13
	const ILLEGALDIFF = "illegalDiff";
14
 
15
	protected $_messageTemplates = array(
16
    self::FALSEDATE  =>
17
      "False Date: L'une des dates est invalide",
18
    self::ILLEGALDIFF  =>
19
      "ILLEGAL DIFF: La date d'emmenagement est plus récente que la date de déménagement"
20
  );
21
 
22
	/**
23
	 * la date de départ
24
	 *
25
	 * @var unknown_type
26
	 */
27
	protected $_date;
28
 
29
	/**
30
	 * sert à instancier le validateur
31
	 *
32
	 * @param unknown_type $date
33
	 */
34
	public function __construct($date)
35
	{
36
		$this->setdate($date);
37
	}
38
 
39
	/**
40
	 * @return unknown_type
41
	 */
42
	public function getdate() 
43
	{
44
		return $this->_date;
45
	}
46
 
47
	/**
48
	 * Setteur = initialiser la variable avec celle passée en paramètre
49
	 * @param unknown_type $_date
50
	 */
51
	public function setdate($_date) 
52
	{
53
		$this->_date = $_date;
54
	}
55
 
56
	public function isValid($value)
57
	{
58
		$this->_setValue($value);			//à laisser obligatoirement
59
 
60
 
61
		if(Zend_Date::isDate($value, 'dd/mm/yy', 'fr_FR') && Zend_Date::isDate($this->_date, 'dd/mm/yy', 'fr_FR'))
62
		{
63
			$datevalue = new Zend_Date($value, 'fr_FR');			//on instancie une date de la valeur
64
			$datedate = new Zend_Date($this->_date, 'fr_FR');		//on instancie la date 
65
 
66
			$testdate = $datedate->sub($datevalue);
67
 
68
			if($testdate < 0)
69
			{
70
				return true;
71
			}
72
			else
73
			{
74
				$this->_error(self::ILLEGALDIFF);
75
				return false;	
76
			}
77
		}
78
		else
79
		{
80
			$this->_error(self::FALSEDATE);
81
			return false;
82
		}
83
 
84
	}
85
 
86
}

Pour l’utiliser, je n’ai pu le faire que du côté contrôleur. Il faut bien récupérer les deux valeurs après avoir posté le forum. Et voici donc les étapes à effectuer pour que cela marche.
 PHP |  copy code |? 
01
if($this->_request->isPost())
02
{
03
	$formdata = $this->_request->getPost();
04
 
05
	$validator = new Zend_Validate();  //créer un validateur vide
06
	$validator->addValidator(new Zend_Validate_Date('dd/mm/yy', 'fr_FR')); //ajout du validateur de verif date en 1°
07
	$validator->addValidator(new App_Validate_Date($this->_request->getPost('date_debut')));	//ajoute le validateur de diff date en second
08
 
09
	$form->date_fin->addValidator($validator);	//ajoute la chaine de validateur afin de tous les verifier
10
 
11
	if($form->isValid($formdata)) // ce isvalid appelle le isvalide du formulaire pour exécuter à la chaine tous les validateurs
12
	{
13
            //suite du traitement du formulaire
14
        }
15
}

J’espère que ce validateur vous aidera dans vos projets. Si vous comptez l’améliorer, prévenez moi en m’envoyant les améliorations apportées.

Articles Connexes

A propos de l'Auteur: Benjamin Besse

Je suis Analyste Développeur chez Goomeo et je suis passioné par tout ce qui touche aux technologies du Web. J'ai commencé par apprendre l'utilisation du Framework Zend et j'ai continué naturellement via Android. Le tout seulement avec les bases acquises en DUT et Licence professionnelle Informatique.

Laisser un commentaire

Mots-Clefs