0

摆脱这三个<select>元素并允许用户在常规<input type="text">控件中键入日期的标准方法是什么?

要求包括:

  • 日期格式必须是 D/M/Y
  • 必须正确打印现有日期
  • 无法中断日期验证

我找不到任何合理的文档,只是在像我一样无知的用户编写的论坛线程中进行黑客攻击 xD

澄清:请注意CakePHP标签。我已经知道如何在常规 PHP 中处理日期。我需要关于精确的 CakePHP 机制的帮助,我可以使用它来调整框架的默认功能(我的意思是调整而不是覆盖)。

到目前为止,我已将其添加到模型中:

public $validate = array(
    'fecha' => array(
        array(
            'rule' => 'notEmpty',
            'required' => true,
        ),
        array(
            'rule' => array('date', 'dmy'),
        ),
    )
);

...我在视图中组成了这样的字段:

echo $this->Form->input(
    'Foo.fecha',
    array(
        'type' => 'text',
    )
);

...但我能做的就是读取和验证用户输入:它不会正确打印以前的日期,也不会正确存储新日期。

4

3 回答 3

2

这是我的发现的摘要。似乎适当的机制是使用模型回调方法在两种日期格式之间切换:

  • 数据库格式,例如:2012-08-28
  • 显示格式,例如:28/08/2012

脚步:

  1. 添加两个实用方法来AppModel在我的自定义格式(又名“显示格式”)和 MySQL 的默认格式(又名“DB 格式”)之间进行转换。
  2. 向我的模型添加一个afterFind()过滤器,从数据库读取时转换为显示格式。
  3. 将表单控件呈现为'type' => 'text'.
  4. 向模型内的字段添加'rule' => array('date', 'dmy')验证规则。
  5. 在我的模型中添加一个beforeSave()过滤器,在保存之前转换为 DB 格式。

这些步骤可以用实现和回调的行为以及可能的其他一些行为来封装,例如. 该行为可以直接应用于并将负责遍历数据数组以在两种格式之间转换日期(如果模型具有附加表)。代码不是微不足道的,而是可以完成的,它使一切变得透明。afterFind()beforeSave()beforeFind()AppModel

缺点:

  • 使代码仅限 MySQL(但是,它不是已经仅限 MySQL 了吗?
  • 使其难以本地化。
  • 如果你需要做日期数学,你会发现自己有人类可读的字符串。

能够使用三种格式会更加坚如磐石:

  • 数据库格式,例如:2012-08-28
  • 显示格式,例如:28/08/2012
  • PHP 内部格式,例如 Unix 时间戳或DateTime对象

遗憾的是,CakePHP 核心并不是为此而设计的,如果您尝试以这种方式实现它,一切都会变得过于复杂。

于 2012-08-27T06:55:18.527 回答
1

唯一可能的方法是让用户输入他想做的任何事情,然后在他想要提交表单或其他内容时检查其有效性。或者更好的是,选择 jQuery datepicker。

于 2012-08-24T12:05:34.290 回答
0

如果您将使用帮助程序编写输入字段,则可以type选择input. formhelper试试这个,例如:

<?php
echo $this->Form->input('birth_dt', array(
    'type'  => 'text',
    'label' => 'Date of birth',
));

编辑:(阅读您的评论后)

如果是这样的解决方案,可以是在表单提交后验证输入值或使用ajax vaildation。

于 2012-08-24T12:07:33.113 回答