CakePHP2.xのFormヘルパーは日付プルダウンが日本語に対応していないため、年月日をつけて下記のような表現ができません。
年 月 日
そこで、下記サイトを参考にFormヘルパーの日本語対応版を作成してみました。
http://d.hatena.ne.jp/hiromi2424/20100210/1265782505
ただ、最新のバージョンに対応していないようなので、一部修正しました。
app/View/Helper ディレクトリに JpFormHelper.php を作成します。
内容は下記の通りです。
<?php
class JpFormHelper extends FormHelper{
function beforeRender(){
$this->options['month'] = array_combine(range(1,12),range(1,12));
}
function dateTime($fieldName, $dateFormat='YMD', $timeFormat = 24, $attributes = array()) {
if(empty($attributes))
$attributes['separator'] = array();
$attributes += array('empty' => false);
$separator = '-';
if( isset($attributes['separator']) ){
$separator = $attributes['separator'];
$attributes['separator'] = '-';
}
if(!isset($attributes['monthNames']))
$attributes['monthNames'] = false;
$date = parent::dateTime($fieldName, $dateFormat, null, $attributes);
$time = parent::dateTime($fieldName, null, $timeFormat, $attributes);
if( is_array($separator) ){
$defaults = array(
'year' => '年',
'month' => '月',
'day' => '日',
'hour' => '時',
'minute' => '分',
'second' => '秒'
);
$separator = array_merge($defaults,$separator);
$format = array();
if( $dateFormat != 'NONE' && !empty($dateFormat) ){
foreach ( preg_split('//', $dateFormat, -1, PREG_SPLIT_NO_EMPTY) as $char ) {
switch ( $char ) {
case 'Y':
$format[] = $separator['year'];
break;
case 'M':
$format[] = $separator['month'];
break;
case 'D':
$format[] = $separator['day'];
break;
}
}
}
preg_match_all( '|<select.*?>.+?</select>|ms', $date, $matches );
$date = "";
for( $i = 0; $i < count($matches[0]); $i++ ){
$date .= $matches[0][$i] . $format[$i];
}
$format = array();
if($timeFormat != 'NONE' && !empty($timeFormat)){
switch($timeFormat){
case 12:
$format[] = $separator['hour'];
$format[] = $separator['minute'];
$format[] = '';
case 24:
$format[] = $separator['hour'];
$format[] = $separator['minute'];
break;
default:
break;
}
}
preg_match_all('|<select.*?>.+?</select>|ms', $time, $matches);
$time = "";
for( $i = 0; $i < count($matches[0]); $i++ ){
$time .= $matches[0][$i] . $format[$i];
}
} elseif( is_string($separator) ){
$date = str_replace('</select>-', '</select>' . $separator, $date);
}
return $date . $time;
}
}
?>
ヘルパーは自動で読み込まれるので、Viewからは次のように呼び出すだけで使えます。
<?php echo $this->JpForm->datetime('UserProfile.birthday', 'YMD', null, array('separator' => array('年', '月', '日'), 'minYear' => "1910", 'maxYear'=>date('Y'))) ?>
第1引数にはフィールド名、第2引数には出力フォーマット、第3引数には各種オプションを指定します。オプションはFormヘルパーと同じものが指定できます。
これで年月日表示ができるようになりました。