我的目标:替换默认的 Cake Datepicker
我讨厌默认的 CakePHP FormHelper 日期选择器选择元素,我想改用 jQuery UI Datepicker 小部件。为了优雅地降级,我想要一个日期字段(使用小部件启用)和一个时间选择器选择框,限制为 15 分钟增量。
如果我解释得不好,这就是它的样子:
我的理想解决方案
为了尽量减少重复,我想将 HTML 放在布局元素中并使用 Behavior 函数对其进行处理。这样我可以执行以下操作:
视图.ctp
echo $this->element( 'datepicker', array( 'data' => $data ) );
模型.php
$actsAs = array( 'Datepicker' );
function beforeSave( $options ){
$this->parseDatepickers(); //behavior function would alter $this->data
return true;
}
问题
不幸的是,当它到达beforeSave
(或beforeValidate
)回调时,日期选择器和时间选择器字段已被模型的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 );
所以...............
做这个的最好方式是什么?把它放进去beforeSave
或者beforeValidate
看起来像“蛋糕方式”,但会deconstruct
杀了我。我需要扩展 AppModel 并覆盖deconstruct
吗?这也显得丑陋。