A.10. データバリデーション

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() を使用して、自分のバリデーションを動的に設定することもできます。

バリデーションが設定できました。アプリケーションを使用して、タイトルや本文なしで投稿を追加しようとするなどして、その動作を確認してみてください。