Logicky Blog

Logickyの開発ブログです

fuelphp1.8 - Formとバリデーション

fieldsetを使うと、入力した内容を保持できるし、バリデーションチェックも簡単に行える。エラーも自動で表示できる。core/config/form.phpにformを表示する際のHTMLの設定が書いてあるので、これをシンプルにすることで、多様なデザインにもデザイナがviewの設定のみで大体対応できるようになるかなと思った。

form.phpの設定項目

引用:FuelPHPのFieldsetクラスをまとめてみた。1

項目名 説明
form_method formのmethod属性の値
form_template formを作る際のテンプレートです。{open}がformの開始、{fields}がフィールド部分、{close}がformの終了です。こちらはFormクラスで使用されます。
fieldset_template ↑のfieldset版。
field_template fieldのテンプレート。そのままですね。
multi_field_template fieldが複数だった時のテンプレート。{fields}から{fields}までが項目のループ部分。セレクトボックスはどうやってるのかは不明
error_template エラーのテンプレート。$user_form->validation()->error()メソッドで使われている模様。
required_mark {required}に対応する値を指定。
inline_errors エラーを表示するかどうか。
error_class エラー表示に使うクラス名。デフォルトではtdに指定しているのでこのクラスに対してエラーだった時のbackground-color等を指定することになる。

バリデーションエラーメッセージの日本語化

・core/lang/en/validation.phpを、app/lang/ja/にコピーして編集する。 ・app/config/config.phpの「language」を「ja」に設定する。

モデルの例

/**
 * フィールドセット
 */
public static function fieldset()
{
    $fset = Fieldset::forge();
    $fset->add('name', '名前')
        ->add_rule('required')
        ->add_rule('max_length', 30);
    $fset->add('order_no', '並び順')
        ->add_rule('required')
        ->add_rule('numeric_between', 1,100);
    return $fset;
}

app/config/form.phpのfield_templateの例

'field_template' => "<div class='form-group'>{label}{required}{field}<p class='err_msg'>{error_msg}</p></div>",

コントローラの例

/**
 * 管理 - 大カテゴリー登録
 */
public function action_add_big()
{
    //フィールドセットの取得
    $fset = Model_Category::fieldset();

    if (Input::post())
    {
        // バリデーションチェック
        $val = $fset->validation();
        if ($val->run())
        {
            //カテゴリ登録
            if(Model_Category::add_big(Input::post('name'), Input::post('order_no')))
            {
                Session::set_flash('msg', '大カテゴリーを登録しました。');
                return Response::redirect('admin/categories/');
            }
        }
        $fset->repopulate();
        Session::set_flash('msg', '大カテゴリーが登録できませんでした。恐れ入りますが、再度お試しください。');
    }

    //set view
    $data['menu_tab'] = View::forge('elements/admin/categories/menu_tab', array('active' => 'big'));
    $this->template->content = View::forge('admin/categories/add_big', $data);
    $this->template->content->set_safe('fset', $fset);
}