スポンサーリンク

[CakePHP]ヴァリデーションエラーメッセージを華麗に修飾してみる方法のいくつか

CakePHPでは、モデルにヴァリデーションメッセージを設定しておくと、エラー時に勝手にそのメッセージを表示してくれます。
しかし、テキストだけでは味気ない…。
かといって、毎回いろいろ書くのは面倒です。
どうしたらエレガントでスタイリッシュに書けるのか考察します。

スポンサーリンク

表示場所の制御

さて、デフォルトではエラーメッセージはフォーム部品の直下ですが、上とか横とかに出したい場合はどうしたらよいでしょうか?
もちろんCSSで制御することもできますが、表示をキャンセルして手動で位置を指定する方法があります。

echo $this->Form->error('Model.email');
echo $this->Form->input('Model.email', array('error' => false));

これでフォーム部品の前に表示することが可能です。

修飾したい

たとえば、エラーメッセージを赤字で出したいとかいう場合、タグでくくってクラス名を付ける必要があります。
もちろんデフォルトでもついてますが、デザイナーから渡されたフォーマットとちげーよ!という場合こんな方法があります。

echo $this->Form->input('Model.email', array('error'=>array('attributes'=>array('wrap'=>'div','class'=>'error-message')));

こうすることで、こんな感じでタグとクラス名をつけて出力してくれます。

<div class="error-message">エラーメッセージ</div>

いやいや、もっと複雑なんだよ!
という場合。最終手段として、modelのヴァリデーションのエラーメッセージをHTMLで書いてしまうという手もあります。
ただし、デフォルトではエスケープされてしまいタグが無効なので

echo $this->Form->input('Model.email', array('error' => array('escape'=>false) ));

として、エスケープを解除しましょう。
ただ、ヴァリデーションメッセージをHTMLで書くというのはいささか抵抗があります。
HTML出力以外で使う可能性も無きにしも非ずですので・・。

そのほかの手段としては、ヘルパーを新たに作るか、AppHelper.phpに補助関数を追加するかという手段もあります。
ヘルパーに関してはほかの記事で扱うとして、今回はAppHelper.phpで対応する方法を紹介します。


スポンサーリンク

AppHelperに補助関数を追加する

/app/View/Helper/AppHelper.php に例えば以下のようなメソッドを追加します。

class AppHelper extends Helper {
	function customError($key){
		return FormHelper::error($key);
	}
}

で、viewで

echo $this->Form->customError('Post.email');

として、わざとエラーを発生させてみましょう。
どうでしょうか?エラーメッセージが表示できたと思います。

ということは、この関数内でいろいろ追記すれば何でも出せるということです。
たとえば、エラーメッセージによって色を変えるとか、エラーの場合にクラスを追加するとか、そういうこともできるはずですね。

あまりエレガントな方法ではないですが、小規模、少人数な案件であれば、これでいいと思います。

ちなみに、いちいちinputに設定するのが面倒という場合は、下記のように書けば初期値を変更できます。

echo $this->Form->create('Post',
 array(
  'inputDefaults' => array(
  'label'=>false,
  'div' => false,
  'wrapInput' => false,
  'error'=>array(ここにパラメータをかく)
 ),
)
);

inputDefaultsでinputの第二引数に入れるパラメータの初期値を設定可能です。

いかがだったでしょうか?
ちょっと苦労するだけでコーディング量を大幅に減らすことができます。
管理画面とか、フォームが大量にある案件の場合、記述が大変ですが、このように一工夫すれば大幅に記述量を減らすことができます。

ぜひ検討してみてください。