CakePHP2 でバリデーションやってみたんだけど・・・
へいほー。
CakePHP の学習中な私。郵便番号データを画面に出力するところまでは何とかなった。あとページングも。
でも検索フォーム作成中、罠にハマッたのでメモしておく。
まず、MVC の順にソースコードを載せておく。(自分のために)
モデル
<?php class Postal extends AppModel { public $validate = array( 'prefecture' => array( 'rule' => array('notEmpty'), 'message' => '空にしないでくださいっ!!' ) ); } ?>
:概要
1.データベースの Postals テーブルを使用
2.バリデーションの記述(ここでは prefecture - 都道府県名)
:学んだこと
1.' name ' 部分(ここでは prefecture)はDBテーブルのフィールド名
2.' rule ' で入力チェックのルールを決める(ここでは notEmpty - 空文字禁止)
3.' message ' で出力するメッセージを記述
ビュー
<h1>郵便番号データ</h1> <?php echo $this->Form->create("Postal", array('type' => 'post')); echo $this->Form->input('Postal.prefecture', array("label" => "都道府県名(半角カナ or 漢字)")); echo $this->Form->end("検索"); ?> <div class="paging"> <?php echo $this->Paginator->prev('< 前へ', array(), null, array('class' => 'prev disabled')); echo $this->Paginator->numbers(array('separator' => '')); echo $this->Paginator->next('次へ >', array(), null, array('class' => 'next disabled')); ?> </div> <table> <tr> <th>郵便番号</th> <th>都道府県名(半角カナ)</th> <th>市区町村名(半角カナ)</th> <th>町域名(半角カナ)</th> <th>都道府県名(漢字)</th> <th>市区町村名(漢字)</th> <th>町域名(漢字)</th> </tr> <?php foreach ($postal_data as $postal): ?> <tr> <td><?php echo $postal['Postal']['zip_code']; ?></td> <td><?php echo $postal['Postal']['prefecture_ruby']; ?></td> <td><?php echo $postal['Postal']['city_ruby']; ?></td> <td><?php echo $postal['Postal']['town_ruby']; ?></td> <td><?php echo $postal['Postal']['prefecture']; ?></td> <td><?php echo $postal['Postal']['city']; ?></td> <td><?php echo $postal['Postal']['town']; ?></td> </tr> <?php endforeach; ?> <?php unset($postal); ?> </table>
:概要
1.FormHelper を利用して検索フォームを作成(とりあえず検索項目を1つだけ・・・)
2.DBテーブルから取得したデータを出力
:学んだこと
1.Form->create と Form->end はセットで使う
2.unset でリソース破棄?をしておく
コントローラ
<?php App::uses('AppController', 'Controller'); class PagesController extends AppController { public $name = 'Pages'; public $uses = array("Postal"); public function index() { $this->paginate = array('maxLimit' => 10); $this->set("postal_data", $this->paginate()); if ($this->request->isPost()) { $this->Postal->set($this->request->data); if(!$this->Postal->validates()){ return; } } } } ?>
:概要
1.' Postal ' モデルを使用することを宣言
2.アクション index の定義
:学んだこと
1.$name にコントローラの名前を入れる(ここで入れた名前のフォルダを View 配下に作成すれば良い?)
2.' maxLimit ' の値で1ページに出力する件数(取得結果)を指定できる
3.$this->request->isPost() でポストされたのか確認できる
上記のような雰囲気でコーディングを行い、ブラウザで確認すると以下のように表示されまして・・・
未入力で検索ボタンを「ポチッ!」ってクリックすると・・・
あれ?出力されるメッセージが違う・・・。
そこでググってみたところ、
CakePHP2.3からinputタグにhtml5のrequired属性がつくようになった - cakephperの日記(CakePHP, MongoDB)
なるほどねー、required 属性がつくようになったのかぁー・・・、知らんがな!w
で、修正してもう一度!
おっ、出来たw
考えてみたんだけど、HTML5 でもバリデーションできるんなら CakePHP 側って必要か?
でも任意のメッセージを表示するって考えると必要かな?
(悩ましい・・・ orz)
次は検索機能を実装する予定。しかしフレームワークはルールを覚えるのが大変だ。
以上です。