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 フィールドラベル
- $attributes array()タイプ HTML 属性の連想配列
- $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。
<?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 インスタンスを作成する。
問題なければ、ユーザーが何を選択したのかがわかる。ユーザーの入力ミスがあれば、エラーが表示される。
おしまい