2010-10-06 33 views
0

我在我的Event模型中有日期时间值。不是Cake的自动输入默认美学的忠实粉丝,我将创建自己的。我的理解,尽管只是从阅读中可以看出,Cake提供了一些关于在保存时连接日期时间值的智能。具体来说,它将检测日期时间值的月,日,年,小时,分钟和子午线子部分,并自动将它们组合在一起保存。分割日期时间值时的智能

我更感兴趣的是,但没有找到证据,是一个更简单的细分。我想为日期部分和默认时间输入使用日期选择器,您猜对了时间。蛋糕可以这样做吗?我已经尝试过了,但它不起作用,但我不确定这是我做错事还是错误的结果。

我当然可以自己做这件事,没有太多的努力,但是如果Cake已经有了这个内置功能,而且我只是没有正确地解锁它,那么一些努力就会比毫不费力。

谢谢。

回答

0

通过源代码的旅程,特别是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,所以我可以在整个过程中使用它。干。

相关问题