2009-09-10 3 views
1

В CakePHP есть встроенный способ проверки даты на определенный диапазон? Например, убедитесь, что определенная дата в будущем?Подтверждение CakePHP для дат

Если единственный способ - написать собственную функцию проверки подлинности, так как это будет довольно общий и полезный для всех моих контроллеров, который является лучшим файлом для его ввода?

ответ

1

AFAIK нет встроенной проверки для диапазонов дат. Ближайшим к нему будет range, но только если вы ожидаете, что все ваши даты будут отметками времени UNIX.

Вы можете поместить свой собственный метод проверки в AppModel, и он будет доступен для всех моделей.

3

Быстрый поиск Google для «CakePHP проверки в будущем даты» дает эту страницу: http://bakery.cakephp.org/articles/view/more-improved-advanced-validation (сделать поиск страницы для «будущего»)

Этот код (по ссылке) должны делать то, что вам нужно

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

Что я пропустил? ;) –

+0

Правильное форматирование кода разметки. :) – deceze

4

Я только что пришел с красивым легко исправить в этом вопросе с помощью Cake 2.x, убедитесь, что место выше вашей модели класса следующие:

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

Используйте validat ион правило, как в следующем:

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' 
     ) 
    ) 
); 

Наконец правило пользовательской проверки:

/** 
* 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

Если вы хотите быть более гибким и проверить на другое поле (если вы отправили две даты, например, и хотите, чтобы они были за другим) - попробуйте validateDate() и т. Д. Здесь: https://github.com/dereuromark /tools/blob/master/Model/MyModel.php#L1191 – mark

+0

Отличное предложение, возможно, мне придется использовать его в будущем, поскольку требования всегда меняются, кажется, отличная работа. – HelloSpeakman

+2

Вы также можете использовать CakeTime :: isFuture, чтобы немного упростить ситуацию. Это было добавлено в версии 2.4 –

1

Добавьте ниже функцию в 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; 
    } 

Использование

'date' => array(
     'not in future' => array(
      'rule' =>array('dateRange', array('max'=>'today')), 
     ) 
    ), 
Смежные вопросы