Cake は、単調なフォーム入力のバリデーションのコーディングを取り除くことに成功しています。えんえんと続くフォームとそのバリデーションのコーディングはほとんどの人にとって嫌なものですが、 Cake はより簡単に、より素早くそれを実現します。
バリデーション機能を活用するためには、ビューの中で Cake の HtmlHelper を使用する必要があります。 HtmlHelper はデフォルトで、 $html によってすべてのビューで利用できます。
add のビューは次のようになります:
例 A.8. /app/views/posts/add.thtml
<h1>投稿の追加</h1>
<form method="post" action="<?php echo $html->url('/posts/add')?>">
<p>
タイトル:
<?php echo $html->input('Post/title', array('size' => '40'))?>
<?php echo $html->tagErrorMsg('Post/title', 'タイトルは必ず入力してください。') ?>
</p>
<p>
本文:
<?php echo $html->textarea('Post/body', array('rows'=>'10')) ?>
<?php echo $html->tagErrorMsg('Post/body', '本文は必ず入力してください。') ?>
</p>
<p>
<?php echo $html->submit('保存') ?>
</p>
</form>
$html->link()
と同様に、
$html->url() は、指定したコントローラとアクションから、適切な
URL を生成します。デフォルトでは、 POST フォームタグを出力しますが、2番目のパラメータによって変えることができます。
$html->input()
と
$html->textarea() 関数は、その名前のフォーム要素を出力します。最初のパラメータは、対応するモデル/フィールドを
Cake に知らせ、2番目のパラメータは、HTML の追加属性(input フィールドのサイズなど。)を指定するためのものです。ヘルパーに関する詳細は、
"ヘルパー"の章
を参照してください。
tagErrorMsg()
関数は、バリデーションに関する問題があった場合、エラーメッセージを表示します。
望むなら、
/app/views/posts/index.thtml
ビューの中に、新しい "投稿の追加(Add Post)" リンクを含めて、
www.example.com/posts/add を指すようにすることもできます。
なかなかいいですね。でも、どんなバリデーションをしてほしいのかを Cake に使えるにはどうしたらよいでしょうか。モデルのほうに戻ってみましょう。
Example A.9. /app/models/post.php (バリデーション配列の追加)
<?php
class Post extends AppModel
{
var $name = 'Post';
var $validate = array(
'title' => VALID_NOT_EMPTY,
'body' => VALID_NOT_EMPTY
);
}
?>
$validate
配列を使って、 save()
メソッドが呼ばれた時にデータをどのようにバリデートするかを
Cake に教えます。これらの keys に対する値は、Cake によって設定された単なる定数で、これは正規表現に翻訳されます。(
/cake/libs/validators.php
を参照。)現在の Cake のバリデーションは正規表現ベースになっていますが、
Model::invalidate() を使用して、自分のバリデーションを動的に設定することもできます。
バリデーションが設定できました。アプリケーションを使用して、タイトルや本文なしで投稿を追加しようとするなどして、その動作を確認してみてください。