【问题标题】:CakePHP Date Validation using date array format使用日期数组格式的 CakePHP 日期验证
【发布时间】:2010-10-10 07:13:00
【问题描述】:

您好,

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

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 没有内置的“日期”表单元素验证?

干杯,
-布里

【问题讨论】:

  • Model 类有一个deconstruct() method,其工作是将Form 助手创建的日期数组重新组合成一个标量值。以我的经验,这种“重构”(IMO,方法名称的语义是违反直觉的)发生在值被传入以进行验证之前。我在你的 sn-p 中没有看到任何看起来有问题的地方。
  • @Rob 感谢您指出这一点。我将查看Model 类,看看我是否可以追踪 foobar 发生的位置。现在我已经向我的控制器添加了代码,将日期数组标量化为一个新键 ($this->data['Model']['cc_expdate2']),并向我的模型添加了一个自定义验证规则来验证该值。 (Cake 的各个方面及其预期的数据格式使我无法仅在控制器或模型中执行此操作)
  • 几周前我提出了一个类似的问题。我很惊讶日期验证需要执行任何额外的代码。也许他们会针对 cake 2.0 进行微调。

标签: validation cakephp


【解决方案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
            ),
        ),

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我尝试了这个建议,但验证仍然失败。我继续遍历validation.phpmodel.php 中的代码,发现日期值以数组开头,并在model.php 中转换为mysql 安全字符串。当然,这种格式是 YYYY-MM-DD,在传递给“我的”验证规则时会失败。将验证规则更改为“ymd”可以正确验证。这似乎很愚蠢;就像“ymd”以外的任何日期规则仅适用于字符串,除非您自己转换日期数组或使用自定义规则。
    • 感谢您的提示,它使我不必将 db 字段转换为 varchar。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 2015-07-22
      • 1970-01-01
      • 2016-03-27
      • 2021-01-17
      • 1970-01-01
      相关资源
      最近更新 更多