通過源代碼的旅程,特別是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
,所以我可以在整個過程中使用它。幹。