2009-09-10 16 views
1

Dans CakePHP, existe-t-il un moyen intégré de valider une date dans une certaine plage? Par exemple, vérifiez qu'une certaine date est dans le futur?Validation CakePHP pour les dates

Si la seule option est d'écrire ma propre fonction de validation personnalisée, puisque ce sera générique et utile à tous mes contrôleurs, quel est le meilleur fichier pour le mettre?

Répondre

1

AFAIK il n'y a pas de validation intégrée pour les plages de dates. Le plus proche serait range, mais uniquement si vous pensez que toutes vos dates sont des horodatages UNIX.

Vous pouvez mettre votre propre méthode de validation dans le AppModel et il sera disponible dans tous les modèles.

3

Une recherche rapide sur Google pour "validation future date CakePHP" vous donne cette page: http://bakery.cakephp.org/articles/view/more-improved-advanced-validation (faire une recherche de page pour "l'avenir")

Ce code (à partir du lien) devrait faire ce que vous avez besoin

function validateFutureDate($fieldName, $params) 
    {  
     if ($result = $this->validateDate($fieldName, $params)) 
     { 
      return $result; 
     } 
     $date = strtotime($this->data[$this->name][$fieldName]);   
     return $this->_evaluate($date > time(), "is not set in a future date", $fieldName, $params); 
    } 
+0

Qu'est-ce que j'ai manqué? ;) –

+0

Formatage correct du code de démarquage. :) – deceze

4

Je suis venu avec une belle solution facile à ce problème en utilisant 2.x Cake, assurez-vous de placer les éléments suivants au-dessus de votre classe de modèle:

App::uses('CakeTime', 'Utility'); 

Utilisez un Validat règle ion comme ce qui suit:

public $validate = array(
    'deadline' => array(
     'date' => array(
      'rule' => array('date', 'ymd'), 
      'message' => 'You must provide a deadline in YYYY-MM-DD format.', 
      'allowEmpty' => true 
     ), 
     'future' => array(
      'rule' => array('checkFutureDate'), 
      'message' => 'The deadline must be not be in the past' 
     ) 
    ) 
); 

Enfin, la règle de validation personnalisée:

/** 
* checkFutureDate 
* Custom Validation Rule: Ensures a selected date is either the 
* present day or in the future. 
* 
* @param array $check Contains the value passed from the view to be validated 
* @return bool False if in the past, True otherwise 
*/ 
public function checkFutureDate($check) { 
    $value = array_values($check); 
    return CakeTime::fromString($value['0']) >= CakeTime::fromString(date('Y-m-d')); 
} 
+1

Si vous voulez être plus flexible et vérifier par rapport à un autre champ (si vous avez posté deux dates par exemple et que vous voulez être l'un après l'autre) - essayez validateDate() etc à partir d'ici: https://github.com/dereuromark /tools/blob/master/Model/MyModel.php#L1191 – mark

+0

Excellente suggestion, je devrai peut-être l'utiliser à l'avenir car les exigences changent constamment, semble-t-il, un excellent travail. – HelloSpeakman

+2

Vous pouvez également utiliser CakeTime :: isFuture pour simplifier un peu les choses. Cela a été ajouté en v2.4 –

1

Ajoutez la fonction ci-dessous dans votre AppModel

/** 
    * date range validation 
    * @param array $check Contains the value passed from the view to be validated 
    * @param array $range Contatins an array with two parameters(optional) min and max 
    * @return bool False if in the past, True otherwise 
    */ 
    public function dateRange($check, $range) { 

     $strtotime_of_check = strtotime(reset($check)); 
     if($range['min']){ 
      $strtotime_of_min = strtotime($range['min']); 
      if($strtotime_of_min > $strtotime_of_check) { 
       return false; 
      } 
     } 

     if($range['max']){ 
      $strtotime_of_max = strtotime($range['max']); 
      if($strtotime_of_max < $strtotime_of_check) { 
       return false; 
      } 
     } 
     return true; 
    } 

Utilisation

'date' => array(
     'not in future' => array(
      'rule' =>array('dateRange', array('max'=>'today')), 
     ) 
    ), 
Questions connexes