Проверка даты CakePHP с использованием формата массива даты - PullRequest
2 голосов
/ 10 октября 2010

Привет,

На мой взгляд, у меня есть ввод даты, установленный так:

echo $form->input('cc_expdate', array('label' => __('exp. date', true),
        'type' => 'date', 'dateFormat' => 'MY', 'default' => date('Y'),
        'minYear' => date('Y'), 'maxYear' => date('Y', strtotime("+10 years")),
        'orderYear' => 'asc', 'separator' => ' ', 'monthNames' => false));

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

'cc_expdate' => array(
    'rule' => array('date', 'my'),
 'message' => 'Please select a valid expiration date'
)

Но проверка всегда терпит неудачу. Когда я смотрю на $this->data, я вижу, что дата проходит через форму в виде массива (например, 'cc_expdate' => array('month' => '10', 'year' => '2010')), но кажется, что правило проверки даты ожидает строку типа 10-2010. Я охотился вокруг Cake и проверял документацию, но не мог найти ничего, покрывающего это. Похоже, это должно быть простой задачей, я что-то упустил или Cake не имеет встроенной проверки для элементов формы 'date'?

ура
-Bri

Ответы [ 3 ]

1 голос
/ 11 марта 2014

Лучшее решение / взломать это добавить дополнительное скрытое поле, представляющее день. В этом случае вы отправите свою форму так, как ожидается от Cake: array ('day' => 1, 'month' => 12, 'year' => 1980), и теперь у вас есть нормальная проверка даты в вашей модели и нет проблем с сохранением поврежденного значения даты в вашей базе данных.

Пример:

Вид:

<?php echo $this->Form->input('YourModel.cc_expdate.day', array('type' => 'hidden', 'value' => 1));    
echo $this->Form->input('cc_expdate', array('label' => __('exp. date'),
            'type' => 'date', 'dateFormat' => 'MY', 'empty' => true,
            'minYear' => date('Y'), 'maxYear' => date('Y') + 10,
            'orderYear' => 'asc', 'separator' => '&nbsp;', 'monthNames' => false));
?>

Модель:

'cc_expdate' => array(
            'date' => array(
                'rule' => array('date'),
                'message' => 'Invalid date',
                //'allowEmpty' => false,
                //'required' => false,
                //'last' => false, // Stop validation after this rule
                //'on' => 'create', // Limit validation to 'create' or 'update' operations
            ),
        ),
0 голосов
/ 25 марта 2012

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

Вместо .... 'column_name' для ваших правил используйтеcolumn_name.month и column_name.year.

0 голосов
/ 10 октября 2010

Недавно у меня была такая же проблема в методе контроллера, когда я пытался сохранить значение месяца / года в поле даты MySQL, и проверка продолжала давать сбой. Я использовал мой / MY в модели / представлении для настроек даты, и он передавал год и месяц, как и ожидалось, $ this-> data, когда я проверял его в контроллере.

Что я сделал, так это установил ключ дня на «1» в массиве дат, переданном из формы перед проверкой в ​​контроллере, и затем проверка работала. Это привело к тому, что все даты моего месяца / года были сохранены как 1-е число месяца, что было хорошо для моего приложения.

Я все еще новичок в CakePHP, так что это можно считать хаком, я не уверен. Мое поле даты в базе данных было полем даты MySQL, поэтому мне было интересно, может быть, по какой-то причине он не прошел проверку из-за отсутствия дня (возможно, использование varchar сохранит месяц / год как строку?).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...