Form->inputで出力されるラベルの名称をオプションではなく別ファイルで定義する

勉強がてらcakePHPのFormヘルパーのinputを使ってみたんだけど、ラベルの定義('label'=>'ほげほげ')をいちいちオプションで与えるのが面倒。

また複数人で開発している場合は、気を付けないと同じ項目でも別名になってしまう可能性があるかなぁと。

SAStrutsみたいにpropertiesファイルに(labels.フィールド名)みたいに一箇所で定数を切ることで、項目の日本語名を置換できるようにしたい。

ということで、Formヘルパーを変更してみた。

ちなみにCakePHPの経験はあまりない(PHP自体きちんとやっていない)ので、もっと一般的なやり方があるのかもしれないが、とりあえず勉強ということで。

※もし他に良い方法があるなら教えて欲しいです…


変更は、以下の手順。

  1. labels.phpを作成し、そのファイルに「labels.フィールド名」の形で定数を定義する。
  2. bootstrap.phpでlabels.phpを読み込むようにする。
  3. Formヘルパーで、(labels.フィールド名)の定義があればその文言でラベルの文言を置換するように修正する。
  4. 定数定義したフィールド名でviewを作成する。

みたいな流れです。

具体的な修正は、以降のサンプルを参照。

1. labels.phpを作成し、ファイル内で「labels.フィールド名」の形で定義をする。

app/configフォルダに、labels.phpファイルを作成する。

<?php 
define('labels.login_id', 'ログインID');
define('labels.password', 'パスワード');

2. bootstrap.phpでlabels.phpを読み込むようにする。

app/bootstrap.phpの適当な箇所に、以下の一文を追加。

require 'labels.php';

3. Formヘルパーで、(labels.フィールド名)の定義があればその文言でラベルの文言を置換する。

cake/libs/view/helpers/form.phpをapp/views/helpersにform.phpをコピーする。

そんでlabelメソッドを以下みたいな感じで修正

function label($fieldName = null, $text = null, $options = array()) {
	if (empty($fieldName)) {
		$view = ClassRegistry::getObject('view');
		$fieldName = implode('.', $view->entity());
	}
	if ($text === null) {
		// labelから定義を読み込む
		if(defined('labels.'.$fieldName)){
			$text = constant('labels.'.$fieldName);
		}
		if($text === null) {
			if (strpos($fieldName, '.') !== false) {
				$text = array_pop(explode('.', $fieldName));
			} else {
				$text = $fieldName;
			}
			if (substr($text, -3) == '_id') {
				$text = substr($text, 0, strlen($text) - 3);
			}
			$text = __(Inflector::humanize(Inflector::underscore($text)), true);
		}
	}

	if (is_string($options)) {
		$options = array('class' => $options);
	}

	if (isset($options['for'])) {
		$labelFor = $options['for'];
		unset($options['for']);
	} else {
		$labelFor = $this->domId($fieldName);
	}

	return sprintf(
		$this->Html->tags['label'],
		$labelFor,
		$this->_parseAttributes($options), $text
	);
}

4. 定数定義したフィールド名でviewを作成する。

以下のような感じで、Formヘルパーを使用する。

<?php
	echo $this->Form->input('login_id', array('type'=>'text'));
	echo $this->Form->input('password');
?>

すると出力結果が、labels.phpで定義した定数になる。

当然だけど定数定義をしていても、Formヘルパーで別名を指定すれば、その名前が出力される。

<?php
	echo $this->Form->input('login_id', array('type'=>'text', 'label'=>'ログインIDだよー'));
	echo $this->Form->input('password');
?>

ざっと修正しただけなので、あんまテストしてないけど、なんとなく動くことは確認したよっと。