对源代码的遍历,特别是
Model::deconstruct()
告诉我蛋糕天生的智慧没有这么深。它期望由自己的datetime输入提供完整的组件粒度(即,月、日、年、小时、分钟和子午线的单独datetime组件)。我想要更好的用户体验,所以我想使用一个日期选择器,将整个日期存储为单个组件。要做到这一点,我必须要有创造力。
我选择做的是推翻
方法将日期分解为其组件。下面是一些代码,有助于可视化我希望部署的解决方案:
#
# 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 );
}
data[Event][start_time][date]
与溶液无关。可以说,当
date
文本框接收焦点一个非常漂亮的日历出现。
在我的例子中,我还有几个具有datetime属性的模型,因此我最终将
deconstruct()
AppModel