Far*_*ray 8 cakephp date cakephp-2.0
我讨厌默认的CakePHP FormHelper日期选择器选择元素,我想使用jQuery UI Datepicker小部件.为了优雅地降级,我希望有一个日期字段(使用小部件启用)和时间选择器选择框约束为15分钟增量.
如果我解释得很差,这就是它的样子:

为了减少重复,我想将HTML放在布局元素中并使用Behavior函数处理它.这样我可以做类似以下的事情:
view.ctp
echo $this->element( 'datepicker', array( 'data' => $data ) );
Run Code Online (Sandbox Code Playgroud)
model.php
$actsAs = array( 'Datepicker' );
function beforeSave( $options ){
$this->parseDatepickers(); //behavior function would alter $this->data
return true;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,当它到达beforeSave(或beforeValidate)回调时,datepicker和timepicker字段已被模型的deconstruct函数破坏. deconstruct似乎正在寻找以FormHelper创建它们的方式报告的日期和时间.
简而言之,它正在寻找:
[date_field] => Array
(
[year] => 2011
[month] => 11
[day] => 11
[hour] => 8
[min] => 00
[meridian] => pm
)
Run Code Online (Sandbox Code Playgroud)
但相反,它发现:
[date_field] => Array
(
[datepicker] => 11/11/2011
[timepicker] => 8:00 pm
)
Run Code Online (Sandbox Code Playgroud)
因为它没有找到它所期望的结构,我最终得到了这个:
[date_field] =>
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用具有适当命名字段的jQuery更新隐藏输入,但这不会很好地降级.
我目前正在做的是在保存之前通过我的行为功能清洗数据 - 但这不是正确的方法:
$this->request->data = $this->Event->fixDates( $this->data );
$this->Event->save( $this->data );
Run Code Online (Sandbox Code Playgroud)
做这个的最好方式是什么?把它放进beforeSave或beforeValidate看起来像"蛋糕的方式",但deconstruct杀了我.我是否需要扩展AppModel并覆盖deconstruct?这看起来也很难看.
我通常将日期字段设置为视图中的文本字段,以覆盖默认的表单助手输出,然后使用 jQuery 日期选择器(或任何替代选择器)来设置日期:
echo $this->Form->input('date', array('type' => 'text', 'class' => 'datepicker'));
Run Code Online (Sandbox Code Playgroud)
这将输出一个典型的标签而不是所有的下拉列表。
然后,在模型的 beforeSave 函数中,我将格式更改为 MySQL 格式的日期:
$this->data['Model']['date'] = date('Y-m-d G:i:s', strtotime($this->data['Model']['date']));
Run Code Online (Sandbox Code Playgroud)
(记得在beforeSave中返回true)
这适用于数据库中正确的日期时间数据类型,这听起来像是您想要做的。