用文本框输入日期

时间:2012-08-24 11:56:59

标签: php cakephp cakephp-2.2

摆脱三个<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',
    )
);

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

3 个答案:

答案 0 :(得分:2)

以下是我的发现摘要。似乎适当的机制是使用Model Callback Methods在两种日期格式之间切换:

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

步骤:

  1. AppModel添加两个实用程序方法,以在我的自定义格式(又名“显示格式”)和MySQL的默认格式(又名“DB格式”)之间进行转换。
  2. 向我的模型添加afterFind()过滤器,从DB读取时转换为显示格式。
  3. 将表单控件呈现为'type' => 'text'
  4. 'rule' => array('date', 'dmy')验证规则添加到模型内的字段中。
  5. 在我的模型中添加beforeSave()过滤器,在保存之前转换为DB格式。
  6. 这些步骤可以使用behaviour进行封装,该{{3}}可以实现afterFind()beforeSave()回调,也可能包含beforeFind()之类的其他回调。该行为可以直接应用于AppModel,并将负责遍历数据数组以在两种格式之间转换日期(如果模型具有附加表)。代码不是微不足道的,但可以完成并且使它全部透明。

    缺点:

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

如果您使用帮助程序编写输入字段, type的{​​{1}}方法有input个选项。 试试这个,例如:

formhelper

编辑:(阅读评论后)

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