FuelPHPでフォーム作成 - Formクラス

Fieldsetは、デザイン的な部分で融通が利かない可能性があるので、Formクラスでの実装を試してみる。

以下のサイトを参考にさせて頂いた。

Controller

ControllerでFieldsetの場合と違うのは以下の点。

  1. 『Fieldset::forge()』 が 『Validation::forge()』 に
  2. 『type』や『options』の設定が不要
<?php
class Controller_Myform extends Controller
{
    public function action_index()
    {
        $view = View::forge('myform/index');

        $validation = Validation::forge();

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

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

        // selectbox
        $select_list = array(
                           1 => 'タイプ1',
                           2 => 'タイプ2'
                       );
        $view->set('select_list', $select_list);
        $validation->add('type', 'タイプ')
                   ->add_rule('required')
                   ->add_rule('array_key_exists', $select_list);

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

        // checkbox
        $check_list = array(
                          1 => '映画鑑賞',
                          2 => '散歩',
                          3 => 'その他'
                      );
        $view->set('check_list', $check_list);
        $validation->add_callable(new MyValidation());
        $validation->add('hobby', '趣味')
                   ->add_rule('checkbox_val', $check_list)
                   ->add_rule('checkbox_require', 2);

        if (Input::post()) {
            if ($validation->run() && Security::check_token()) {
                // バリデーションOK時の処理
            } else {
                $view->set('errors', $validation->error());
            }
        }

        return $view;
    }
}

View

<!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::open() ?>

<?php echo Form::hidden(Config::get('security.csrf_token_key'), Security::fetch_token()) ?>

お名前:<?php echo Form::input('name', Input::post('name'), array('required' => 'required')) ?><br />

パスワード:<?php echo Form::input('password', Input::post('password'), array('type' => 'password', 'required' => 'required')) ?><br />

タイプ:<?php echo Form::select('type', Input::post('type'), $select_list) ?><br />

性別:
<?php foreach ($radio_list as $key => $val): ?>
<?php echo Form::radio('gender', $key, Input::post('gender') == $key) ?>
<?php echo Form::label($val, 'gender') ?>
<?php endforeach ?>
<br />

趣味:
<?php foreach ($check_list as $key => $val): ?>
<?php echo Form::checkbox('hobby[]', $key, Input::post('hobby') && in_array($key, Input::post('hobby'))) ?>
<?php echo Form::label($val, 'hobby') ?><br />
<?php endforeach ?>

<?php echo Form::submit('submit_btn', '送信') ?>
<?php echo Form::close() ?>

</body>
</html>

Form関数は主なものを以下に抜粋

Form::input('名前', '値', '属性');
Form::select('名前', '選択値', 'options配列');
Form::radio('名前', '値', 'checkedフラグ');
Form::check('名前', '値', 'checkedフラグ');

Form Classにて詳細とサンプルが確認可能です。