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:
/**
* App_Validate_Date
*
* Classe servant à faire la différene entre 2 dates
*
* Retournera True si valide
* False si faux
*
*/
class App_Validate_Date extends Zend_Validate_Abstract
{
const FALSEDATE = "falseDate";
const ILLEGALDIFF = "illegalDiff";

protected $_messageTemplates = array(
self::FALSEDATE =>
"False Date: L'une des dates est invalide",
self::ILLEGALDIFF =>
"ILLEGAL DIFF: La date d'emmenagement est plus récente que la date de déménagement"
);

/**
* la date de départ
*
* @var unknown_type
*/
protected $_date;

/**
* sert à instancier le validateur
*
* @param unknown_type $date
*/
public function __construct($date)
{
$this->setdate($date);
}

/**
* @return unknown_type
*/
public function getdate()
{
return $this->_date;
}

/**
* Setteur = initialiser la variable avec celle passée en paramètre
* @param unknown_type $_date
*/
public function setdate($_date)
{
$this->_date = $_date;
}

public function isValid($value)
{
$this->_setValue($value); //à laisser obligatoirement

if(Zend_Date::isDate($value, 'dd/mm/yy', 'fr_FR') && Zend_Date::isDate($this->_date, 'dd/mm/yy', 'fr_FR'))
{
$datevalue = new Zend_Date($value, 'fr_FR'); //on instancie une date de la valeur
$datedate = new Zend_Date($this->_date, 'fr_FR'); //on instancie la date

$testdate = $datedate->sub($datevalue);

if($testdate < 0) { return true; } else { $this->_error(self::ILLEGALDIFF);
return false;
}
}
else
{
$this->_error(self::FALSEDATE);
return false;
}

}

}
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.
if($this->_request->isPost())
{
$formdata = $this->_request->getPost();

$validator = new Zend_Validate(); //créer un validateur vide
$validator->addValidator(new Zend_Validate_Date('dd/mm/yy', 'fr_FR')); //ajout du validateur de verif date en 1°
$validator->addValidator(new App_Validate_Date($this->_request->getPost('date_debut'))); //ajoute le validateur de diff date en second

$form->date_fin->addValidator($validator); //ajoute la chaine de validateur afin de tous les verifier

if($form->isValid($formdata)) // ce isvalid appelle le isvalide du formulaire pour exécuter à la chaine tous les validateurs
{
//suite du traitement du formulaire
}
}

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.