2010-10-06 38 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,所以我可以在整個過程中使用它。幹。

相關問題