通过源代码的旅程,特别是Model::deconstruct()
告诉我,Cake的本地智能不会运行这么深。它期望由其自己的日期时间输入提供完整的组件粒度(即单独的日期时间组件,用于月,日,年,小时,分钟和子午线)。我想要更好的用户体验,所以我想用日期选择器将整个日期存储为单个组件。要做到这一点,我必须要有创意。
我选择做的是重写Model::deconstruct()
方法将日期细分为其组件。下面是一些代码,以帮助形象化我希望部署解决方案:
#
# In my form (views/events/_form.ctp)
# When rendered, the input names resolve to data[Event][start_time][date],
# data[Event][start_time][hour], data[Event][start_time][minute],
# data[Event][start_time][meridian]
#
<div class="input datetime required">
<?php echo $this->Form->input('Event.start_time.date', array('type' => 'text', 'label' => 'Start Time', 'div' => false, 'class' => 'date')) ?>
<?php echo $this->Form->input('Event.start_time', array('type' => 'time', 'label' => false, 'div' => false, 'class' => 'time', 'empty' => true)) ?>
</div>
#
# In my model (/models/event.php)
#
function deconstruct($field, $data) {
$type = $this->getColumnType($field);
if(in_array($type, array('datetime', 'timestamp'))) {
if(isset($data['date']) && !empty($data['date'])) {
$date = date('U', strtotime($data['date']));
if($date) {
$data['month'] = date('m', $date);
$data['day'] = date('d', $date);
$data['year'] = date('Y', $date);
}
}
}
# Now the date is broken down into components that the
# well-vetted parent method expects. Let it do the heavy
# lifting.
return parent::deconstruct($field, $data);
}
为清楚起见,我已经排除了创建选择器本身的JavaScript代码。这是一个简单的jQuery UI行为,适用于data[Event][start_time][date]
字段,与解决方案没有密切关系。可以这么说,当date
文本框收到焦点时,会出现一个非常漂亮的日历。
在我的情况下,我也有几个具有日期时间属性的模型,所以我最终将deconstruct()
覆盖移到了我的AppModel
,所以我可以在整个过程中使用它。干。