読者です 読者をやめる 読者になる 読者になる

Asterisk - アスタリスク -

説明するほどでもないブログ

CakePHP2 でバリデーションやってみたんだけど・・・

PC関係 プログラム PHP

へいほー。

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() でポストされたのか確認できる


上記のような雰囲気でコーディングを行い、ブラウザで確認すると以下のように表示されまして・・・

f:id:binder:20130324215817j:plain

未入力で検索ボタンを「ポチッ!」ってクリックすると・・・

f:id:binder:20130324215939j:plain

あれ?出力されるメッセージが違う・・・。

そこでググってみたところ、

CakePHP2.3からinputタグにhtml5のrequired属性がつくようになった - cakephperの日記(CakePHP, MongoDB)

なるほどねー、required 属性がつくようになったのかぁー・・・、知らんがな!w
で、修正してもう一度!

f:id:binder:20130324220628j:plain

おっ、出来たw


考えてみたんだけど、HTML5 でもバリデーションできるんなら CakePHP 側って必要か?
でも任意のメッセージを表示するって考えると必要かな?
(悩ましい・・・ orz)

次は検索機能を実装する予定。しかしフレームワークはルールを覚えるのが大変だ。


以上です。