$form->inputで日時選択フォームのカスタマイズ

Formヘルパーで、日時選択フォームの出力をカスタマイズする方法。
以下の参考サイト:dateTime()による指定方法をベースに、

  1. input()による指定方法

 および

  1. 月を英語以外で表示する方法
  2. プルダウンの最初を空欄にする/しない方法

参考サイト
CakePHP1.2 Form ヘルパーで日付のフォームを作る | Sun Limited Mt.


$form->input('disp_date')の出力

以下の$options設定および追加CSSでカスタマイズした出力

echo $form->input('disp_date', array(
	'label' => __('Date', true),
	'default' => date('Y-m-d H:i', strtotime($this->data['Model']['disp_date'])),
	'timeFormat' => '24',
	'dateFormat' => 'YMD',
	'monthNames' => false,
	'empty' => false,
	'separator' => '/',
	'maxYear' => date('Y'),
));

select {
	font-size: 100%;
	margin: 0 3px;
}

input()で$optionsの主な設定

  1. label, default, timeFormat, dateFormat, separator, maxYear

 以上それぞれの設定内容は、CookBookに記載があります。
http://book.cakephp.org/ja/view/189/Automagic-Form-Elements#options-interval-757

 ポイントはdefault。初期値はMySQLのdatetime(Y-m-d H:i:s)形式の値を受け付けないのでstrtotimeでタイムスタンプに変換が必要です。


 なお、「2010年04月〜」のような表示は、年・月・日…個々のプルダウンを1つずつ出力するか、独自に拡張ヘルパーつくらないと、無理です。

月を英語以外で表示する方法

 $options['monthNames'] を falseに指定すると、数字で表示されるようになります。

 dateTime()でも、第4引数 (参考サイトの$attr) に、$attr['monthNames'] => false で、同様に数字になります。


 また、formヘルパーのソースを見ると、月名は多言語化対応可能になっているので、翻訳ファイル等を設定すれば、「1月、2月…」や「卯月、如月…」という表示も、おそらく可能です。


cake/libs/view/helpers/form.php

case 'month':
	if ($options['monthNames']) {
		$data['01'] = __('January', true);
		$data['02'] = __('February', true);
		$data['03'] = __('March', true);
(中略)
	} else {
		for ($m = 1; $m <= 12; $m++) {
			$data[sprintf("%02s", $m)] = strftime("%m", mktime(1, 1, 1, $m, 1, 1999));
		}
	}
break;

プルダウンの最初を空欄にする/しない方法

 dateTime()ではデフォルトでプルダウンの最初が空白選択になりますが、input()ではデフォルトで空選択はありません。

 $options['empty']に、上記の例ではfalseを指定していますが、trueを指定するとinput()でも空選択が表示されるようになります。


 なおdateTime()だと、第5引数にfalse指定で空選択なしになります。