【问题标题】:Input dates with text box用文本框输入日期
【发布时间】:2012-08-24 11:56:59
【问题描述】:

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

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

【问题讨论】:

  • 您可以自己创建表单,而不是使用 cakephp '自动表单生成器'
  • 这违背了使用框架的概念,不是吗?
  • 框架不“灵活”,我责怪框架:)
  • @OfirBaruch - 该框架非常灵活,但您需要知道如何使用它。他可能获得多个选择框的原因是由于数据库中的表设置为 DATETIME。要获得常规文本框 - $this->Form->input('my_field_name', array('type'=>'text')); 结合 jquery datepicker 的 @Cupidvogel 建议和 cakephp's builtin field validator 他应该覆盖他的基础。 J/K - 看到你的评论已经过时了。

标签: php cakephp cakephp-2.2


【解决方案1】:

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

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

步骤:

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

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

缺点:

  • 只编写 MySQL 代码(但是,它不是已经只有 MySQL 了吗?
  • 使其难以本地化。
  • 如果您需要进行日期数学运算,您会发现自己使用人类可读的字符串。

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 是的,jQuery datepicker 在这种情况下会非常方便
    • 想解释一下如何做第一部分? (jQuery UI Datepicker 只是 GUI 糖果,您仍然需要一个带有适当格式日期的表单控件)。
    • 这会有点复杂。首先,您可以使用\d{2}\/\d{2}\/\d{4} 之类的正则表达式来查找语法检查,如果通过,则进行一系列if-elseif-else 检查。如果年份是闰年,那么如果月份是02,则日部分不得大于 29,等等等等。
    • datePicker 有dateformat 处理它
    • 当然有。他问我如何通过文本输入法来做,所以我解释了。
    【解决方案3】:

    如果您将使用帮助程序编写输入字段, formhelperinput 方法有一个 type 选项。 试试这个,例如:

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

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

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

    【讨论】:

    • 遗憾的是,dateFormattext 类型忽略。
    猜你喜欢
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 2016-10-10
    • 2018-08-15
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多