altere5's blog

I thought what I'd do was, I'd pretend I was one of those deaf-mutes. ( or shou'd i ? )

CakePHPのお勉強 3回目 入力内容のチェック

前回の作業でお問い合わせ内容の保存ができた。

但し、登録時に何もチェックをしていないのでメールアドレス欄に何を入れても登録する事ができてしまう。
そこで今回は入力内容をチェックし不正な入力は受け付けないようにする。

(1) チェックルールの設定

入力チェックのチェックルールはモデルに記入する。

<?php

class Contact extends AppModel{

    public $validate = array(
        'username' => array(
            'rule' => 'notEmpty', 
            'required' => true, 
            'message' => '「お名前」は必ず入力して下さい',
        ),
        'email' => array(
            'rule'=> 'email', 
            'required' => true, 
            'message' => '「メールアドレス」は正しく入力して下さい',
        ),
        'comment' => array(
            'rule' => 'notEmpty', 
            'required' => true, 
            'message' => '「コメント」は必ず入力して下さい',
        ),
    );

}
 

5行目から21行目に追加した部分がチェックルール。
例えば、5行目から10行目の部分では「username」つまり「お名前」欄についてのルールを設定。
この場合は「notEmpty」なので空は禁止、「required」が「true」なので入力は必須となる。
「message」の部分はこのルールを満たさない場合、つまりエラーとなった場合に利用するエラーメッセージとなる。
11行目から15行目の部分は「email」つまり「メールアドレス」欄のチェックルール。
この「email」はあらかじめ組み込まれたルールでこのほかにもいくつかのあらかじめ組み込まれたルールがあるので必要に応じて使う事ができる。
但し、ルールの一部は多少国による違い等で利用しづらいものもあるので注意。

メールアドレスのルールも少し問題があるが今回は気にしない

(2) 入力チェックの実行

次にルールを実際に適用する為の設定をコントローラに追加する。

<?php

class ContactsController extends AppController {

    // indexアクション
    public function index() {}

    // thanksアクション
    public function thanks() {

        if($this->request->is('post')) {

            $this->Contact->set($this->request->data);

            if($this->Contact->validates()) {

                $this->Contact->create();
                $this->Contact->save($this->request->data);

                //POSTデータを受け取った場合の処理を記述
                $this->set('username', $this->request->data['username']);

            } else {

                $this->render('index');

            }

        } else {

            $this->redirect('index');

        }

    }

}
 

13行目では入力チェックを実行する為にフォームから受け取ったデータをモデルにセット。
そして、15行目で実際に入力チェックを実行している。
ここでは入力チェックを通過した場合のみデータの保存処理を実行している。
23行目から27行目は入力チェックに違反した場合の処理。
入力チェックに違反した場合は入力画面となる「index」ビューを表示している。

(3) ビューの修正

最後にビューの修正を行う。 このまま実行した場合、エラーが発生した場合のメッセージが表示されない。
そこでエラーメッセージが表示されるように「index.ctp」を修正する。

<form action="/contacts/thanks" method="POST">
    <div class="input text">
        <label for="username">お名前</label>
        <input type="text" name="username" id="username" />
    </div>
    <b><?php echo $this->Form->error('contact.username'); ?></b>
    <div class="input text">
        <label for="email">メールアドレス</label>
        <input type="text" name="email" id="email" />
    </div>
    <b><?php echo $this->Form->error('contact.email'); ?></b>
    <div class="input text">
        <label for="comment">コメント</label>
        <input type="text" name="comment" id="comment" />
    </div>
    <b><?php echo $this->Form->error('contact.comment'); ?></b>
    <div class="submit">
        <input type="submit" value="確認" />
    </div>
</form>
 

6行目、11行目、16行目が追加箇所。 この記述を追加する事でモデルであらかじめ設定したエラーメッセージが表示される。

(4) 実行してみる

それでは実際に実行してみる。

f:id:altere5:20131116191639p:plain

未入力やメールアドレスを適当に入れた場合にちゃんとエラーメッセージが表示されて登録が行われなくなった。