CakePHP日期验证使用日期数组格式

时间:2010-10-10 07:13:01

标签: validation cakephp

问候,

在我看来,我有一个日期输入,设置如下:

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没有对'date'表单元素进行内置验证?

欢呼声,
-Bri

3 个答案:

答案 0 :(得分:1)

最佳解决方案/黑客是添加一个代表当天的额外隐藏字段。在这种情况下,您将发送您的表单,如Cake所期望的那样:数组(' 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
            ),
        ),

答案 1 :(得分:0)

我最近在控制器方法中遇到了同样的问题,我试图将月/年值保存到MySQL日期字段中并且验证仍然失败。我在模型/视图中使用my / MY进行日期设置,并且当我在控制器中检查时,它按预期将年份和月份传递给$ this-&gt;数据。

我所做的是在控制器中验证之前从表单传递的日期数组中将日期键设置为“1”,然后验证工作。这导致我的所有月/年日期都存储为本月的第1天,这对我的应用程序来说很好。

我还是CakePHP的新手,所以这可能被视为黑客,我不确定。我在数据库中的日期字段是一个MySQL日期字段,所以我想知道是否由于某些原因而失败验证由于缺少这一天(可能使用varchar会将月/年保存为字符串?)。

答案 2 :(得分:-1)

如果您使用Cake的月份和年份表单字段,为了使验证正常工作,您必须使用以下表示法:

使用'column_name.month'和column_name.year代替....'column_name'作为规则。