ボム君.com

Masa's blog

今まで学んできたITスキルを主に。

FeulPHP: FieldSetでラジオを作る

FuelPHPではValidationクラスという、FormやInput向けの検査がライブラリーにあるが、FeildSetが使いやすいと思い、ここでは主にFieldSetを中心に書く。

 

Fieldsetを使うためのControllerを作る。

<?php
Class Controller_Validation extends Controller{
    public function action_index()
    {
      $form = Fieldset::forge("survey");
    }
}
?>

ネットで探した例を参考に:

<?php
// ラジオボタンの例
$ops = array('male', 'female');
$form->add(
    'gender', '',
    array('options' => $ops, 'type' => 'radio', 'value' => 'true')
);

// チェックボックスの例
$ops = array('male', 'female');
$form->add(
    'gender', '',
    array('options' => $ops, 'type' => 'checkbox', 'value' => 'true')
);

// 検証ルール付きの Email 入力の例
$form->add(
    'email', 'E-mail',
    array('type' => 'email', 'class' => 'pretty_input'),
    array('required', 'valid_email')
);

// 検証ルールを配列で記述した text 入力の例
$form->add(
    'name', 'Full name',
    array('type' => 'name', 'class' => 'pretty_input'),
    array(array('required'), array('valid_string', array('alpha-numeric', 'dots', 'spaces')))
);

?>

ここからは上を元に、アンケート形式のViewとControllerを作る。

Controllerでは、

<?php
Class Controller_Validation extends Controller{
    public function forge_validation()
    {
        $form = Fieldset::forge("survey");
        
        // radio
        $ops = array('Extremely sarfistied', 
            'Sarfistied',
            'Somewhat satisfied',
            'Dissatisfied',
            'Totally dissatisfied');
        $form->add(
            'q1', 
            'Question 1',
            array('options' => $ops, 
                'type' => 'radio', 
                'value' => 'false'),
            array('required')
        );
        
        return $form->validation();
    }
}

?>

opsはラジオタイプに必要の回答リストを記入する。
そのあとにFieldsetのAddメソッドを使って下記のパラメーターを入れる。

  • $name 必須 HTML name 属性、 Fieldset でフィールドを参照するのにも使用する
  • $label フィールドラベル
  • $rules array()タイプ  このフィールドに適用する検証ルール


Viewではこうなる:

<?php echo Form::open(array('action' => 'controller_name/validation', 'method' => 'POST')); ?>
  <p>
                        <?php   
                            echo Form::radio('q1', 'es', false, array('style' => 'display:inline-block;'));
                            echo Form::label('Extremely sarfistied','q1',array('style' => 'display:inline-block;')).'<br>';
                            
                            echo Form::radio('q1', 's', false, array('style' => 'display:inline-block;')); 
                            echo Form::label('Satisfied', 'q1',array('style' => 'display:inline-block;')).'<br>';
                            
                            echo Form::radio('q1', 'ss', false, array('style' => 'display:inline-block;')); 
                            echo Form::label('Somewhat satisfied', 'q1',array('style' => 'display:inline-block;')).'<br>';
                            
                            echo Form::radio('q1', 'd', false, array('style' => 'display:inline-block;'));
                            echo Form::label('Dissatisfied ', 'q1',array('style' => 'display:inline-block;')).'<br>';
                             
                            echo Form::radio('q1', 'td', false, array('style' => 'display:inline-block;')); 
                            echo Form::label('Totally dissatisfied ', 'q1',array('style' => 'display:inline-block;')).'<br>';
                            
                        ?>
        </p>
<?php echo Form::input('submit', 'Sign In', array('type'=>'submit'));  ?>
<?php echo Form::close(); ?> 

注意点はViewのラジオの名前とControllerのラジオの名前は一緒。じゃなきゃ検査のしようもない。
それとViewのFormの中の数とControllerのVlaidationの数は一緒。じゃなきゃずうっとエラーがリターンされる。

これでOK。

あとはIndex.phpをつくてブラウザーに表示させる。

<?php

Class Controller_Validation extends Controller{
    public function forge_validation()
    {
        $form = Fieldset::forge("survey");
        
        // radio
        $ops = array('Extremely sarfistied', 
            'Sarfistied',
            'Somewhat satisfied',
            'Dissatisfied',
            'Totally dissatisfied');
        $form->add(
            'q1', 
            'Question 1',
            array('options' => $ops, 
                'type' => 'radio', 
                'value' => 'false'),
            array('required')
        );
        
        return $form->validation();
    }
    
    public function action_index(){
        $val = $this->forge_validation();
        
        if($val->run()){
            $data['input'] = $val->validated();
            
            print_r($data['input']);
            die();
        }
        else
        {
            die($val->show_errors());
        }
    }
}


?>

forge_validation は Validationクラスのインスタンスをリターンしている。
詳しいくは、現在の Fieldset の Validation インスタンスを取得する。存在しなければ、Validation インスタンスを作成する。

問題なければ、ユーザーが何を選択したのかがわかる。ユーザーの入力ミスがあれば、エラーが表示される。

おしまい