我的目标:替换默认的蛋糕日期选择器

我讨厌默认的CakePHP FormHelper日期选择器选择元素,而我想使用jQuery UI Datepicker小部件。为了正常降级,我希望有一个日期字段(已启用该小部件)和一个限制为15分钟的时间选择器选择框。

以防我不好地解释了,这是它的样子:

我理想的解决方案

为了最大程度地减少重复,我想将HTML放入布局元素中,并使用Behavior函数对其进行处理。这样,我可以执行以下操作:

view.ctp

echo $this->element( 'datepicker', array( 'data' => $data ) );

model.php
$actsAs = array( 'Datepicker' );

function beforeSave( $options ){
    $this->parseDatepickers();  //behavior function would alter $this->data
    return true;
}

问题

不幸的是,当它到达beforeSave(或beforeValidate)回调时,datepicker和timepicker字段已被模型的deconstruct函数破坏。 deconstruct似乎正在寻找使用FormHelper创建日期和时间的方式来报告日期和时间。

简而言之,它正在寻找:
[date_field] => Array
(
    [year] => 2011
    [month] => 11
    [day] => 11
    [hour] => 8
    [min] => 00
    [meridian] => pm
)

但相反,它发现:
[date_field] => Array
(
    [datepicker] => 11/11/2011
    [timepicker] => 8:00 pm
)

而且由于找不到所需的结构,因此我得出以下结论:
[date_field] =>

我知道我可以让jQuery用适当命名的字段更新隐藏的输入,但这不会很好地降级。

当前解决方法

目前,我正在做的事情是在保存之前通过行为函数清洗数据-但这似乎不是正确的方法:
$this->request->data = $this->Event->fixDates( $this->data );
$this->Event->save( $this->data );

所以...............

做这个的最好方式是什么?将其放在beforeSavebeforeValidate中似乎像“蛋糕的方式”,但是deconstruct杀死了我。我需要扩展AppModel并重写deconstruct吗?这看起来也很丑。

最佳答案

我通常将日期字段作为 View 中的文本字段覆盖默认的Form Helper输出,然后使用jQuery日期选择器(或任何其他选择器)来设置日期:

echo $this->Form->input('date', array('type' => 'text', 'class' => 'datepicker'));

这将输出一个典型的标签,而不是所有的下拉菜单。

然后,在模型的beforeSave函数中,将格式更改为MySQL格式的日期:
$this->data['Model']['date'] = date('Y-m-d G:i:s', strtotime($this->data['Model']['date']));

(请记住在beforeSave中返回true)

这可以在数据库中使用正确的datetime数据类型,这听起来像您正在尝试执行的操作。

关于cakephp - 在CakePHP中处理复杂数据类型的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8018166/

10-09 18:13