2010-10-10 85 views
2

问候,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附近寻找并检查了文档,但没有发现任何内容。看起来这应该是一个简单的任务来处理,我是否错过了一些简单的事情,或者Cake没有内置'日期'表单元素的验证?

欢呼声,
-Bri

+0

的'Model'类有一个['解构()'方法](HTTP://api13.cakephp .org/view_source/model /#line-849),他们的工作是将'Form'助手创建的日期数组重新组合为一个标量值。根据我的经验,这个“重建”(IMO,方法名称的语义是违反直觉的)在值传入进行验证之前发生。我没有看到您的代码段中有任何看起来不正确的内容。 – 2010-10-10 13:08:16

+0

@Rob谢谢你指出。我会看一下'Model'类,看看我是否可以跟踪foobar发生的地方。现在我已经将代码添加到我的控制器中,将日期数组标量化为新的键('$ this-> data ['Model'] ['cc_expdate2']'),并向我的模型添加了自定义验证规则,验证价值。 (Cake的各个方面及其预期的数据格式阻止我仅在控制器或模型中执行此操作) – Soulriser 2010-10-10 17:46:19

+0

几周前我提出了类似的问题。我很惊讶日期验证需要任何额外的代码来执行。也许他们会对这个蛋糕2.0进行微调。 – the0ther 2010-10-18 19:10:08

回答

0

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

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

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

+0

我试过这个建议,但验证会失败。我继续介绍'validation.php'和'model.php'中的代码,发现日期值以数组开头,并在'model.php'中转换为mysql安全字符串。当然,这种格式是YYYY-MM-DD,当传递给“我的”验证规则时失败。将验证规则更改为“ymd”可以正确验证。这似乎相当愚蠢;它就像日期规则中除“ymd”之外的任何内容仅用于字符串,除非您自己转换日期数组或使用自定义规则。 – Soulriser 2010-10-11 22:47:12

+0

感谢您的提示,它使我无需将我的db字段转换为varchar。 – Soulriser 2010-10-11 22:49:56

-1

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

相反......“列名”,为您的规则,使用“ column_name.month'和column_name.year。

1

最好的解决方案/黑客是添加一个额外的隐藏字段代表一天。在这种情况下,你会发送你的表格,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 
      ), 
     ),