FuelPHPをやってみる (4) - Model_Crudでバリデーション -

2012-11-07T00:00:00+00:00 FuelPHP PHP

タイトル通り。フォームからの入力を検証してエラーの場合はフォームにリダイレクト後にエラーメッセージを表示する。セッション管理機能を使うのでfuel/app/config/session.phpの設定が必要

fuel/app/classes/model/items.php

<?php

class Model_Items extends Model_Crud {

    protected static $_table_name = "items";

    // バリデーションルールを定義
    protected static $_rules = array(
        "item_name" => "required|max_length[50]|match_pattern[/w+/]",
        "price" => "required|valid_string[numeric]"
    );

    // カラムに対する項目ラベルを設定
    protected static $_labels = array(
        "item_name" => "アイテム名",
        "price" => "値段"
    );
}

ルールを定義するだけ。詳しいバリデーションルールの定義方法に関しては http://docs.fuelphp.com/classes/validation/validation.html を参照。今回はitemnameにrequired、max_length、match_patternの検証制約を設定、priceにrequired、validstring[numeric](値が数値であるかのチェック)を設定する

でエラーメッセージをカスタマイズしたいのでfuel/app/lang/ja/validation.phpを作る

fuel/app/lang/ja/validation.php

<?php

return array(
    "required" => ":labelを入力してください",
    "max_length" => ":labelの値は:param:1以内で指定してください",
    "match_pattern" => ":labelが条件に一致しません"
);

fuel/core/lang/en/validation.phpをコピってからいじった方がいいかと。んな感じで定義出来て、メッセージ変数として http://docs.fuelphp.com/classes/validation/errors.html のEror Messagesセクションを参照

fuel/app/classes/controller/home.php

<?php

class Controller_Home extends Controller {
    public function action_index() {
        $entries = Model_Items::find_all();
        is_null($entries) and $entries = array();

        $data["entries"] = $entries;

        // register側から来たエラーメッセージをViewにバインド
        $data["errors"] = Session::get_flash(
            "validator_errors",
             array()
        );

        return View::forge("home/index", $data);
    }

    public function action_register() {
        if (Input::method() === "POST") {
            // フォームからの値を参照してモデルインスタンスを作る
            $item = Model_Items::forge(
                array(
                    "item_name" => Input::post("item_name"),
                    "price" => Input::post("price")
                )
            );

            // 検証開始。オッケーなら挿入処理を続行する
            // validationメソッドを使うとバリデーションオブジェクト(恐らくはFuelCoreValidation)を取得出来る模様
            if ($item->validates()) {
                try {
                    DB::start_transaction();

                    $item->save();

                    DB::commit_transaction();
                } catch (Database_Exception $e) {
                    DB::rollback_transaction();
                }
            } else {
                // 検証に失敗した場合はそのエラーメッセージをセッションに格納する。その際、永続性を持たせる必要は無いのでflashオブジェクトを利用する

                $save_errors = array();

                $errors = $item->validation()->error();

                foreach ($errors as $err) {
                    array_push($save_errors, $err->get_message());
                }

                Session::set_flash("validator_errors", $save_errors);
            }
        }

        return Response::redirect("/");
    }
}

フォームから送信されたデータが検証でエラーが出た場合にそのエラーメッセージをセッションのflashオブジェクトに格納して、リダイレクト先であるindexでそれを参照してビューにバインドする

FuelPHPをやってみる (3) - Model_Crudを使う -