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をコメントアウトして使います。
    ありがとうございます。

コメントを残す

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

関連記事

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