10.1.10 データのバリデーション
Cakeはフォームの入力バリデーションの退屈さを取り除くのに大いに役立ちます。みんな、延々と続くフォームとそのバリデーションルーチンのコーディングを好きではないでしょう。CakePHPを使うと、その作業を簡単、高速に片付けることができます。
バリデーションの機能を活用するためには、ビューの中でCakeのFormHelperを使う必要があります。FormHelperはデフォルトで、すべてのビューの中で$formとしてアクセスできるようになっています。
addのビューは次のようなものになります。
/app/views/posts/add.ctp
<h1>Add Post</h1>
<?php
echo $form->create('Post');
echo $form->input('title');
echo $form->input('body', array('rows' => '3'));
echo $form->end('Save Post');
?> /app/views/posts/add.ctp<h1>Add Post</h1><?phpecho $form->create('Post');echo $form->input('title');echo $form->input('body', array('rows' => '3'));echo $form->end('Save Post');?>
ここで、FormHelperを使って、HTMLフォームの開始タグを生成しています。 $form->create()が生成したHTMLは次のようになります。
<form id="PostAddForm" method="post" action="/posts/add">
<form id="PostAddForm" method="post" action="/posts/add">
create()にパラメータを渡さないで呼ぶと、現在のコントローラのadd()アクションをPOSTで作成した、と解釈されます。
$form->input()メソッドは、同名のフォーム要素を作成するのに使われています。最初のパラメータは、どのフィールドに対応しているのかをCakePHPに教えます。2番目のパラメータは、様々なオプションの配列を指定することができます。&mdash この例では、textareaの列の数を指定しています。ここには少しばかりの内観的な手法とオートマジックが使われています。input()は、指定されたモデルのフィールドに基づいて、異なるフォーム要素を出力します。
$form->end()の呼び出しで、submitボタンとフォームの最後が出力されます。
end()の最初のパラメータとして文字列が指定してある場合、FormHelperは、それに合わせてsubmitボタンに名前をつけ、終了フォームタグも出力します。
ヘルパーの詳細に関しては、
"組み込みヘルパー"の章
を参照してください。
望むなら、
/app/views/posts/index.ctpのビューが、www.example.com/posts/addを指す、新しい
"Add Post"というリンクを表示するように編集できます。
バリデーション要件について、どうやってCakePHPに指示するのだろう、と思ったかもしれません。バリデーションのルールは、モデルの中で定義することができます。Postモデルを見直して、幾つか修正してみましょう。
<?php
class Post extends AppModel
{
var $name = 'Post';
var $validate = array(
'title' => array(
'rule' => array('minLength', 1)
),
'body' => array(
'rule' => array('minLength', 1)
)
);
}
?> <?phpclass Post extends AppModel{var $name = 'Post';var $validate = array('title' => array('rule' => array('minLength', 1)),'body' => array('rule' => array('minLength', 1)));}?>
$validate配列を使って、save()メソッドが呼ばれた時に、どうやってバリデートするかをCakePHPに教えます。
ここでは、本文とタイトルのフィールドが、空ではいけない、ということを設定しています。
CakePHPのバリデーションエンジンは強力で、組み込みのルールがいろいろあります。(クレジットカード番号、Emailアドレス、などなど。)また柔軟に、独自ルールを作って設定することもできます。
この設定に関する詳細は、データバリデーションの章を参照してください。
バリデーションルールを書き込んだので、アプリケーションを動作させて、タイトルと本文を空にしたまま、記事を投稿してみてください。FormHelperのinput()メソッドを使ってフォーム要素を作成したので、バリデーションエラーのメッセージが自動的に表示されます。

