Поездка по исходному коду, в частности Model::deconstruct()
, сказала мне, что родной интеллект Cake не работает так глубоко. Он ожидает полную детализацию компонентов, предоставляемую собственным входом даты и времени (то есть отдельными компонентами datetime для месяца, дня, года, часа, минуты и меридиана). Я хотел улучшить работу пользователей, поэтому я хотел использовать средство выбора даты, которое хранит всю дату как один компонент. Для этого мне пришлось проявить творческий подход.
Что я решил сделать, это переопределить метод 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);
}
Для ясности, я исключила яваскрипт кода, который создает сам сборщик. Это просто поведение пользовательского интерфейса jQuery, применяемое к полю data[Event][start_time][date]
и не подходит для решения. Достаточно сказать, что когда текстовое поле date
получает фокус, появляется очень красивый календарь.
В моем случае у меня также есть несколько моделей, обладающих свойствами datetime, поэтому я переместил deconstruct()
на мой AppModel
, поэтому я могу использовать его повсюду. DRY.