Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 20-09-2010 10:05:46

jean
Membre
Date d'inscription: 25-08-2008
Messages: 107

[Résolu][ZF 1.10] Exemple de validator date début / date fin ?

Bonjour,

Dans une form, j'ai une Date_Debut et une Date_Fin.

Je recherche un exemple de validator (Zend_Validate_Abstract) qui me permette de contrôler que la date de début est bien inférieure à la date de fin.

J'imagine qu'un "gentil membre" aura la solution !

Merci par avance,

Jean

Dernière modification par jean (21-09-2010 08:55:56)

Hors ligne

 

#2 20-09-2010 10:17:22

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Résolu][ZF 1.10] Exemple de validator date début / date fin ?

Salut,

Je n'ai pas de validateur tout prêt, mais pour ce type de comparaison de date ce n'est pas très complexe. Il suffit de convertir les deux dates en timestamp que tu soustrais.

Avec Zend_Date, c'est la méthode getTimestamp(), avec PHP strtotime().

Créer un validateur à partir de ça ne devrait pas trop te bloquer.


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#3 21-09-2010 08:59:31

jean
Membre
Date d'inscription: 25-08-2008
Messages: 107

Re: [Résolu][ZF 1.10] Exemple de validator date début / date fin ?

J'ai trouvé cet exemple sur google code. Il faudra peut être l'adapter pour des dates affichées au format francais. J'espère qu'il vous sera utile  :

Code:

class JS_Validate_CompareDates extends Zend_Validate_Abstract{
      const MSG_DATEBEFORE = 'msgDateBefore';
      public $date = null;
      
      protected $_messageTemplates = array(
              self::MSG_DATEBEFORE => "End date must be start date"
      );
       
       /**
        * The fields the current element needs to compare
        * 
        * @var array
        */
       protected $_fieldsToCompare = array();
       
       /**
        * constructor of this validator
        * The argument of this constructor is the third element of the elements addValidator
        * method. 
        * @return unknown_type
        */
       public function __construct($fieldsToCompare =array()){
               if(is_array($fieldsToCompare)){
                       foreach($fieldsToCompare as $field){
                               $this->_fieldsToCompare[] = (string) $field;
                       }
               }else{
                       $this->_fieldsToCompare[] = (string) $fieldsToCompare;
               }
               
               
       }
       /**
        * check if the element using this validator is valid.
        * 
        * This method will compare the $value of the element to the other elements 
        * it needs to match. If they all match, the method returns true.
        * 
        * @param $value string
        * @param $context array  All other elements from the form
        * @return boolean Returns true if the element is valid.
        * @see Validate/Zend_Validate_Interface#isValid($value)
        */
       public function isValid($value, $contexts = null){
               $value = (string)$value;
               $this->_setValue($value);
               
               $error = false;
               var_dump($value);
               var_dump($this->_fieldsToCompare);
               exit;
               foreach($this->_fieldsToCompare as $fieldname){
                       
                       if(!isset($context[$fieldname]) || $value !== $context[$fieldname]){    
                               $error = true;
                               $this->_error(self::MSG_DATEBEFORE);
                               break;
                       }
               }
               return !$error;
               
               $date1 = new Zend_Date();
               $date1->set($value, Zend_Date::DATES);
               
               var_dump($date1);
               $date2 = new Zend_Date();
               $date2->set($this->getMinDate(), Zend_Date::DATES);
               var_dump($date2);
               $date = $date1->compareDate($date2,Zend_Date::DATES);
               var_dump($date);
               exit;
       }
       
       public function setMinDate($value){
               $this->date = $value;
               
       }
       
       public function getMinDate(){
               return $this->date;     
       }
       
       

 }

  and my form:

  <?php
  class JS_Form_NewEventForm extends ZendX_JQuery_Form{

       public function init($options=null){
               //parent::__construct($options);
               
               $this->setName("newEvent");
               $this->addElementPrefixPath('JS_Validate','JS/Validate/','validate');           
               //naam
                $evtName = new Zend_Form_Element_Text("evt_name");
                $evtName->setLabel("Evenement Naam: ")
                                ->setRequired(true);
                // omschrijving
                $evtDescription = new Zend_Form_Element_Textarea("evt_description",array("rows"=>6,"cols"=>25));
                $evtDescription->setLabel("Evenement omschrijving: ");
                
                // locatie
                
                $evtAdr = new Zend_Form_Element_Select("adr_id");
                $evtAdr->setLabel("Locatie: ");
                $locaties = $this->getLocations();
                $evtAdr->setMultiOptions($locaties);
                
                $newAdr = new Zend_Form_Element_Button("new_adr");
                $newAdr->setLabel("+");
                // begin datum  
                $evtStartDate = new ZendX_JQuery_Form_Element_DatePicker("evt_startdate",array("label"=> "Begin Datum"));
                $evtStartDate->setJQueryParam('dateFormat', 'dd-mm-yy');
                $evtStartDate->addValidator(new Zend_Validate_Date('DD-MM-YYYY'));
                $evtStartDate->addValidator('CompareDates',false,array($evtEndDate));
                // date validator
                
                
                
                // eind datum
                $evtEndDate = new ZendX_JQuery_Form_Element_DatePicker("evt_enddate",array("label"=> "Eind Datum"));
                $evtEndDate->setJQueryParam('dateFormat', 'dd-mm-yy');
                $evtEndDate->addValidator(new Zend_Validate_Date('DD-MM-YYYY'));
                $evtEndDate->addValidator('CompareDates',false,array($evtStartDate));
                // begin tijd
                $evtStartTime = new Zend_Form_Element_Text("evt_starttime");
                $evtStartTime->setLabel("Begin Tijd");
                $evtStartTime->addValidator(new Zend_Validate_Date('hh:mm',new Zend_Locale('auto')));
                
                // eind tijd
                $evtEndTime = new Zend_Form_Element_Text("evt_endtime");
                $evtEndTime->setLabel("Eind tijd");
                $evtEndTime->addValidator(new Zend_Validate_Date('hh:mm'));
                // aantal personen
                $amountPersons = new Zend_Form_Element_Text("evt_amtpersons");
                $amountPersons->setLabel("Aantal personen nodig ");
                                        
                $save = new Zend_Form_Element_Submit("save");
                $save->setLabel("Opslaan");
                
                
                $this->addElements(array($evtName,$evtDescription,$evtAdr,$newAdr,$evtStartDate,$evtEndDate,$evtStartTime,$evtEndTime,$amountPersons,$save));
                $this->setMethod('post');
                $this->setAction(Zend_Controller_Front::getInstance()->getBaseUrl().'/events/add');
        
        
        }
        private function getLocations(){
                
                $adrTable = new JS_Model_DbTable_addresses();
                $rows = $adrTable->getAddressList();
                return $rows;
        }
        
        
  }

Hors ligne

 

#4 21-09-2010 10:46:25

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [Résolu][ZF 1.10] Exemple de validator date début / date fin ?

j'ai le validateur qu'il te faut, fait maison. Il n'est peut être pas top mais il a le mérite de fonctionner :

Code:

/**
 * 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 de fin est plus récente que la date de début"
  );
    
    /**
     * 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;
        }
        
    }

}

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages