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の第二引数に入れるパラメータの初期値を設定可能です。
いかがだったでしょうか?
ちょっと苦労するだけでコーディング量を大幅に減らすことができます。
管理画面とか、フォームが大量にある案件の場合、記述が大変ですが、このように一工夫すれば大幅に記述量を減らすことができます。
ぜひ検討してみてください。