2010-10-06 1 views
0

У меня есть значение datetime в моей модели Event. Не будучи большим поклонником эстетики по умолчанию для автоматизированного ввода Cake, я собираюсь создать свою собственную. Мое понимание, хотя и только от чтения, заключается в том, что Cake предоставляет некоторую информацию о конкатенации значений даты и времени при сохранении. В частности, он будет обнаруживать месяцы, день, год, час, минуту и ​​меридианные части значения даты и времени и автоматически комбинировать их при сохранении.Интеллект при сегментировании значения даты и времени

Что меня больше интересует, но не может найти никаких доказательств, это более простая разбивка. Я бы хотел использовать средство выбора даты для части даты и времени ввода по умолчанию, как вы догадались, время. Может ли Торт сделать это? Я пробовал это, и он не работает, но я не уверен, что это результат того, что я делаю неправильную вещь или что-то не доступное.

Я могу сделать это самостоятельно без особых усилий, но некоторые усилия больше, чем никаких усилий, если у Cake уже есть этот встроенный модуль, и я просто не отпираю его должным образом.

Спасибо.

ответ

0

Поездка по исходному коду, в частности 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.

 Смежные вопросы

  • Нет связанных вопросов^_^