2011-11-05 142 views
8

我的目標:替換默認的蛋糕日期選擇器

討厭默認CakePHP的表單助手日期選擇器中選擇元素,我想使用jQuery UI日期選擇器窗口小部件來代替。爲了優雅地降級,我希望有一個日期字段(使用小部件啓用)和一個時間選擇器選擇框約束爲15分鐘的增量。在CakePHP中處理複雜數據類型的最佳方法是什麼?

萬一我解釋說不好,這裏是什麼樣子:

date-picker sample

我的理想解決方案

爲了減少重複,我想提出的HTML佈局中的要素和過程它使用行爲功能。這樣我可以做類似如下:

view.ctp

echo $this->element('datepicker', array('data' => $data)); 

model.php

$actsAs = array('Datepicker'); 

function beforeSave($options){ 
    $this->parseDatepickers(); //behavior function would alter $this->data 
    return true; 
} 

的問題

不幸的是,在一次獲取到beforeSave(或beforeValidate)回調,在日期選擇器& timepicker領域已經由模型的deconstruct功能破壞。 deconstruct似乎在尋找日期&次報告表單助手創建它們的方式。

總之,它在尋找:

[date_field] => Array 
(
    [year] => 2011 
    [month] => 11 
    [day] => 11 
    [hour] => 8 
    [min] => 00 
    [meridian] => pm 
) 

,而是它的發現:

[date_field] => Array 
(
    [datepicker] => 11/11/2011 
    [timepicker] => 8:00 pm 
) 

而且因爲它沒有找到,預計結構,我結束了這一點:

[date_field] => 

我知道我可以有適當命名的jQuery領域更新隱藏的輸入,但這不會退化。

目前的解決方法

我在做什麼,就目前而言,是節約之前通過我的行爲函數的數據清洗 - 但這並不覺得這樣做的正確方法:

$this->request->data = $this->Event->fixDates($this->data); 
$this->Event->save($this->data); 

所以...............

什麼是做到這一點的最好方法是什麼?把它beforeSavebeforeValidate好像「蛋糕的方式」,但deconstruct殺死我。我是否需要擴展AppModel並覆蓋deconstruct?這看起來也很醜陋。

+0

你有沒有嘗試過鉤入'beforeValidate'? – deceze

+0

@deceze是的。 'Model :: save()'在調用任何'before'回調之前調用'$ this-> set()'。 'set'使用'deconstruct'。在模型,重寫的appmodel或行爲中使用'beforeValidate'或'beforeSave'的結果是一樣的 – Farray

回答

2

我通常讓我的日期字段可以在視圖文本字段覆蓋默認的表單輔助輸出,然後使用jQuery日期選擇器(或任何你選擇的選擇器會)設定日期:

echo $this->Form->input('date', array('type' => 'text', 'class' => 'datepicker')); 

這會輸出一個典型的標籤,而不是所有的下拉菜單。

然後,在我的模型的beforeSave功能,我改變格式到MySQL格式的日期:

$this->data['Model']['date'] = date('Y-m-d G:i:s', strtotime($this->data['Model']['date'])); 

(記得在beforeSave返回true)

這一方法在適當的日期時間數據類型的數據庫這聽起來像你正在嘗試做的事情。

+0

那麼你知道一個好的datetimepicker嗎?我會滿足於使用jQuery datepicker/timepicker組合填充1個輸入字段,但是我見過的唯一集成插件[使用滑塊](http://trentrichardson.com/examples/timepicker/),而我不是非常喜歡它。 [有](http://fgelinas.com/code/timepicker/)[是](http://haineault.com/media/jquery/ui-timepickr/page/)[others](http:// code。 google.com/p/jquery-timepicker/),但他們似乎依賴於謹慎的時間領域,這使我回到了有兩個領域的原始問題。 – Farray

+0

最簡單的解決方案是1字段日期選擇器,但是如果必須有兩個字段,那麼爲什麼不隱藏日期字段,然後創建日期和時間字段,並在完成日期字段時將它們的結果連接在一起。所有這些都會在javascript中發生,並且您最終還是會將一個日期字段發送給Cake。 –

相關問題