Validation 使用日期数组格式进行CakePHP日期验证

Validation 使用日期数组格式进行CakePHP日期验证,validation,cakephp,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', strtoti

您好

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

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的字符串。我找遍了蛋糕,检查了文件,但找不到任何关于这个的东西。这似乎应该是一个简单的任务来处理,我是否缺少一些简单的东西,或者蛋糕没有内置的“日期”表单元素验证

干杯,
-Bri

最近,我在一个控制器方法中遇到了同样的问题,我试图将月/年值保存到MySQL日期字段中,但验证一直失败。我在模型/视图中使用my/my进行日期设置,当我在控制器中检查它时,它按预期将年和月传递到$this->data

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


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

最近,我在一个控制器方法中遇到了相同的问题,我试图将月/年值保存到MySQL日期字段中,验证一直失败。我在模型/视图中使用my/my进行日期设置,当我在控制器中检查它时,它按预期将年和月传递到$this->data

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


我对CakePHP还是新手,所以这可能被认为是一种黑客行为,我不确定。数据库中我的日期字段是MySQL日期字段,因此我想知道是否由于缺少日期而导致验证失败,也许使用varchar会将月/年保存为字符串?

如果您使用的是Cake的月和年表单字段,以便验证正常工作,必须使用以下符号:


而不是……”column\u name“对于您的规则,请使用“column\u name.month”和column\u name.year.

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


而不是……”column\u name“对于您的规则,请使用“column\u name.month”和“column\u name.year”。

最佳解决方案/技巧是添加一个表示日期的额外隐藏字段。在本例中,您将按照Cake预期的方式发送表单:数组'day'=>1,'month'=>12,'year'=>1980,现在您的模型中有了正常的日期验证,并且在数据库中保存损坏的日期值没有问题

例如:

视图:


最好的解决方案是添加一个额外的隐藏字段来表示当天。在本例中,您将按照Cake预期的方式发送表单:数组'day'=>1,'month'=>12,'year'=>1980,现在您的模型中有了正常的日期验证,并且在数据库中保存损坏的日期值没有问题

例如:

视图:


该模型类有一个数组,其任务是将表单帮助器创建的日期数组重新组合到一起,形成一个标量值。根据我的经验,在将值传递给验证之前,方法名称的语义是违反直觉的。我在你的代码片段中没有看到任何错误。@Rob谢谢你指出这一点。我将查看Model类,看看是否可以跟踪foobar发生的位置。现在,我已经向控制器添加了代码,将日期数组标量化为一个新键$this->data['Model']['cc_expdate2'],并向模型添加了一个自定义验证规则来验证该值。Cake的各个方面及其预期的数据格式使我无法仅在控制器或模型中这样做。几周前,我提出了一个类似的问题。我很惊讶日期验证需要执行任何额外的代码。也许他们会为cake 2.0对此进行微调。模型类有一个函数,其任务是将表单帮助器创建的日期数组重新组合到一个标量值中。根据我的经验,在将值传递给验证之前,方法名称的语义是违反直觉的。我在你的代码片段中没有看到任何错误。@Rob谢谢你指出这一点。我将查看Model类,看看是否可以跟踪foobar发生的位置。现在我有一个补充
将数据数组标量化为一个新键$this->data['Model']['cc_expdate2']并将自定义验证规则添加到我的模型中,以验证该值。Cake的各个方面及其预期的数据格式使我无法仅在控制器或模型中这样做。几周前,我提出了一个类似的问题。我很惊讶日期验证需要执行任何额外的代码。也许他们会对cake 2.0进行微调。我尝试过这个建议,但验证还是失败了。我继续阅读validation.php和model.php中的代码,发现日期值以数组形式开始,并在model.php中转换为mysql安全字符串。当然,此格式是YYYY-MM-DD,当传递到my validation规则时失败。将验证规则更改为ymd将正确验证。这似乎相当愚蠢;这就像ymd以外的日期规则只适用于字符串,除非您自己转换日期数组或使用自定义规则。感谢您的提示,它使我不必将db字段转换为varchar。我尝试了这个建议,但验证仍将失败。我继续阅读validation.php和model.php中的代码,发现日期值以数组形式开始,并在model.php中转换为mysql安全字符串。当然,此格式是YYYY-MM-DD,当传递到my validation规则时失败。将验证规则更改为ymd将正确验证。这似乎相当愚蠢;这就像使用ymd以外的任何东西的日期规则只适用于字符串,除非您自己转换日期数组或使用自定义规则。感谢您的提示,它使我不必将db字段转换为varchar。
<?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
            ),
        ),