Проверка CakePHP для дат - PullRequest
       8

Проверка CakePHP для дат

3 голосов
/ 10 сентября 2009

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

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

Ответы [ 4 ]

6 голосов
/ 05 марта 2013

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

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

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

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'));
}
3 голосов
/ 10 сентября 2009

Быстрый поиск в 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);
    } 
3 голосов
/ 10 сентября 2009

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

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

1 голос
/ 04 октября 2015

Добавьте указанную ниже функцию в 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')),
        )
    ),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...