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

以上