CakePHP

CakePHP2.x Formヘルパーの日付プルダウンを日本ご対応にする

2014年4月17日

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ヘルパーと同じものが指定できます。

これで年月日表示ができるようになりました。

関連記事

Comment

  1. 初心者です。本当にありがとうございます!!
    私はヘルパーを作れないので本当助かりました、しかし、上のソースでは、beforeRender()でエラーが発生するようです。

    エラーメッセージはこれです。
    Strict (2048): Declaration of JpFormHelper::beforeRender() should be compatible with Helper::beforeRender($viewFile) [APP\View\Helper\JpFormHelper.php, line 88]

    CakePHP 2.5.5です。
    とりあえず、beforeRenderをコメントアウトして使います。
    ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。

リズムファクトリーはホームページの制作会社です。
ホームページ制作に関するご要望・ご相談はこちらからどうぞ。