FuelPHPでフォーム作成2(Fieldset) - Validation

Fieldsetでのバリデーション

前回作成したフォームに対し、入力チェックを付けてみる。

基本的には、addで作成したフォームに対しadd_ruleで、入力チェックルールを追加していく形。

$form->add('name', 'お名前', array('maxlength' => 8));
     ->add_rule('required')
     ->add_rule('max_length', 8);


Validationを見ると、以下のルール以外にも、PHPの関数やコールバックが使える模様

required  match_value  match_pattern  match_field  min_length  max_length  exact_length  valid_email  valid_emails  valid_url  valid_ip  numeric_min  numeric_max  valid_string


上記を踏まえ、前回作成したフォームに入力チェックを付けてみた。

Controller

<?php

class Controller_Myform extends Controller
{
    public function action_index()
    {
        $view = View::forge('myform/index');

        $form = Fieldset::forge();

        // input
        $form->add('name', 'お名前', array('maxlength' => 8))
             ->add_rule('required')
             ->add_rule('valid_string', array('alpha', 'numeric', 'utf8'));

        // password
        $form->add('password', 'パスワード', array('type' => 'password'))
             ->add_rule('required')
             ->add_rule('valid_string', array('alpha', 'numeric', 'utf8'));

        // selectbox
        $select_list = array(
                           1 => 'タイプ1',
                           2 => 'タイプ2'
                       );
        $form->add('type', 'タイプ', array('type' => 'select', 'options' => $select_list))
             ->add_rule('required')
             ->add_rule('array_key_exists', $select_list);

        // radio
        $radio_list = array(
                          1 => '男性',
                          2 => '女性'
                      );
        $form->add('gender', '性別', array('type' => 'radio', 'options' => $radio_list))
             ->add_rule('required')
             ->add_rule('array_key_exists', $radio_list);

        // checkbox
        $check_list = array(
                          1 => '映画鑑賞',
                          2 => '散歩',
                          3 => 'その他'
                      );
        $form->add('hobby', '趣味', array('type' => 'checkbox', 'options' => $check_list));

        $form->add('submit', '', array('type' => 'submit', 'value' => '送信'));

        // 値保持
        $form->repopulate();

        if ($form->validation()->run()) {
            // バリデーションOK時の処理
        } else {
            // エラー時
            $view->set('errors', $form->validation()->error());
        }

        $view->set_safe('form', $form->build(Uri::create('myform')));

        return $view;
    }
}

selectboxやradioの存在確認は、array_key_existsを使用。

checkboxの入力チェックが上手くいかない

一点、checkboxの入力チェックがarray_key_existsだとうまくいかない。
checkboxのバリデーションはこちら

Template

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>

<?php if (isset($errors)): ?>
<ul>
<?php foreach ($errors as $error): ?>
<li><?php echo $error ?></li>
<?php endforeach ?>
</ul>
<?php endif ?>

<?php echo $form ?>

</body>
</html>

テンプレート側は入力チェックにひっかかった場合のエラー表示部分を追加。

生成されるテンプレート

入力チェックが無いテンプレートと違うのは、バリデーションに必須入力(required)を入れた項目のラベルに、『*』が付いている点。
f:id:BTT:20120614100955p:plain

必須入力(required)を設定した項目には、required属性が付く為、HTML5対応のブラウザでは以下のようなエラーが表示される。(画像はFirefox ver12)
f:id:BTT:20120614102228p:plain

エラー発生時
f:id:BTT:20120614104447p:plain

エラー文言が英語なので、日本語化対応を行う必要あり。