2011-11-05 12 views
8

私の目標:私はデフォルトのCakePHPのFormHelperの日付ピッカーは、要素を選択を嫌いと私が代わりにjQueryのUI DatePickerのウィジェットを使用したいデフォルトケーキ日付ピッカー

を交換してください。正常に機能を低下させるために、私は日付フィールド(ウィジェットで有効)とタイムピッカーの選択ボックスを15分単位で制限したいと思っています。CakePHPで複雑なデータ型を処理する最良の方法は何ですか?

私が悪い、ここではそれがどのように見えるかであることを説明した場合には

:繰り返しを最小限に抑えるために

date-picker sample

私の理想のソリューション

、私はレイアウト要素とプロセスでHTMLを入れたいですこれはBehavior関数を使用します。時間それによって、

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)コールバックに到達すると、datepicker & timepickerフィールドは、モデルのdeconstruct関数によって破棄されました。 deconstructは、FormHelperがそれらを作成する方法を報告するために、&回の日付を探しているようです。要するに

は、それが探している:

[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); 

そう...............

これを行うための最善の方法は何ですか

beforeSaveまたはbeforeValidateに入れると「ケーキウェイ」のように見えますが、deconstructが私を殺します。 AppModelを拡張してdeconstructを上書きする必要がありますか?それはあまりにも醜いようです。

+0

あなたは 'beforeValidate'にフッキングを試みましたか? – deceze

+0

@decezeはい。 'Model :: save()'は 'before 'コールバックのどれかを呼び出す前に' $ this-> set() 'を呼び出します。 'set'は' deconstruct'を使います。結果は、モデル、オーバーライドされたアプリケーションモデル、またはビヘイビアで '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を返すことを忘れないでください)

これは、データベース内の適切なdatetimeデータ型で動作しますあなたがしようとしているもののように聞こえます。

+0

あなたは良いdatetimepickerを知っていますか?私は、1つの入力フィールドに入力するjQueryのdatepicker/timepickerの組み合わせを使用することに満足したいと思いますが、私が見た統合プラグインは[スライダを使用します](http://trentrichardson.com/examples/timepicker/)です。ひどく好きです。 [There](http://fgelinas.com/code/timepicker/)[are](http://haineault.com/media/jquery/ui-timepickr/page/)[その他](http://コード。 google.com/p/jquery-timepicker/)でも、慎重な時間フィールドに依存しているように見えます。これは、2つのフィールドを持つという私の元の問題に戻ります。 – Farray

+0

最も簡単な解決策は1フィールドの日付ピッカーですが、2つのフィールドを持つ必要がある場合は、日付フィールドを非表示にして、日付と時刻フィールドを作成し、終了時に結果を日付フィールドに連結させてください。すべてのことがjavascriptで起こり、あなたはまだ1つの日付フィールドがCakeに送られてしまいます。 –

関連する問題