CakePHPでdatetime型のフォームを日付と時間の二つのテキストフィールドにする
jQueryのDatePickerとかTimePickerを使うために、datetime型のフィールドを下のような状態のフォームで出力したかった。
結論
あまりスマートな方法は見つからなかった。
ただしそれほど汚いことはしなくていい
手順
- フォームヘルパを編集
- モデルのデータ受取り部分を編集
フォームヘルパを編集
<?php echo $form->dateText($fieldName, $options); echo $form->timeText($fieldName, $options); ?>
という感じで使えるようにするために、フォームヘルパに以下のようなコードを追加する
<?php function dateText($fieldName, $options = array()){ $options = $this->_initInputField($fieldName, array_merge( array('type' => 'text'), $options )); if($options['value'] && $options['value'] > '0000-00-00 00:00:00'){ $options['value'] = date('Y/m/d',strtotime($options['value'])); }else{ $options['value'] = ''; } return $this->input($fieldName, $options); } function timeText($fieldName, $options = array()){ $options = $this->_initInputField($fieldName, array_merge( array('type' => 'text'), $options )); if($options['value'] && $options['value'] > '0000-00-00 00:00:00'){ $options['value'] = date('H:i',strtotime($options['value'])); }else{ $options['value'] = ''; } return $this->input($fieldName, $options); }
モデルのデータ受取り部分を編集
date[Post][date][year],date[Post][date][month],date[Post][date][day]などの配列をまとめてdate[Post][date]という形にするのは、Modelのdeconstructという関数がやっているのでそれをAppModelなどで上書きしてやる
<?php /* * フォームから送られてきたデータを加工する関数 */ function deconstruct($field, $data) { if(isset($data['date']) && isset($data['time'])){ $time = strtotime($data['date']." ".$data['time']); $data['year'] = date('Y',$time); $data['month'] = date('m',$time); $data['day'] = date('d',$time); $data['hour'] = date('H',$time); $data['min'] = date('i',$time); } return parent::deconstruct($field, $data); }
以上