I'm attending CakeFest 2010!

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');
?>
  1. /app/views/posts/add.ctp
  2. <h1>Add Post</h1>
  3. <?php
  4. echo $form->create('Post');
  5. echo $form->input('title');
  6. echo $form->input('body', array('rows' => '3'));
  7. echo $form->end('Save Post');
  8. ?>

ここで、FormHelperを使って、HTMLフォームの開始タグを生成しています。 $form->create()が生成したHTMLは次のようになります。

<form id="PostAddForm" method="post" action="/posts/add">
  1. <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)
		)
	);
}
?>
  1. <?php
  2. class Post extends AppModel
  3. {
  4. var $name = 'Post';
  5. var $validate = array(
  6. 'title' => array(
  7. 'rule' => array('minLength', 1)
  8. ),
  9. 'body' => array(
  10. 'rule' => array('minLength', 1)
  11. )
  12. );
  13. }
  14. ?>

$validate配列を使って、save()メソッドが呼ばれた時に、どうやってバリデートするかをCakePHPに教えます。    ここでは、本文とタイトルのフィールドが、空ではいけない、ということを設定しています。 CakePHPのバリデーションエンジンは強力で、組み込みのルールがいろいろあります。(クレジットカード番号、Emailアドレス、などなど。)また柔軟に、独自ルールを作って設定することもできます。 この設定に関する詳細は、データバリデーションの章を参照してください。

バリデーションルールを書き込んだので、アプリケーションを動作させて、タイトルと本文を空にしたまま、記事を投稿してみてください。FormHelperのinput()メソッドを使ってフォーム要素を作成したので、バリデーションエラーのメッセージが自動的に表示されます。