最新の記事や関連記事をお探しの方は下の「サイト内検索」で検索してみてください。
FuelPHP の Fieldset クラスを使って入力フィールドを作っているときに、第2引数に Fieldset_Field::validated() を使ってデフォルトの値を表示していたのですが、もしバリデーションエラーになっていたときはこの validated() が返す値が空白になります。そこで、もしバリデーションエラーが起きていたら元々の入力値を返せるようにしてみました。
以下のソースコードには今回の Fieldset_Field クラスとは関係ないところも入ってますが、気にしないでください。
ex1. Fieldset クラスを使って入力フィールドを表示する例
fuel/app/classes/controller/index.php
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78  | 
						<?php class Controller_Index exnteds Controller_Template {   public function action_index()   {     $fieldset = Fieldset::forge('input');     $fieldset       ->add(         'email',         'メールアドレス',         array('type' => 'text')       )       ->add_rule('required')       ->add_rule('max_length', 255)       ->add_rule('valid_email')     ;     $this->template->title = 'index';     $this->template->content = Response::forge(ViewModel::forge('index'));   }   public function action_send()   {     $fieldset = Fieldset::forge('input');     $fieldset       ->add(         'email',         'メールアドレス',         array('type' => 'text')       )       ->add_rule('required')       ->add_rule('max_length', 255)       ->add_rule('valid_email')     ;     $fieldset->repopulate();     $validation = $fieldset->validation();     if ($validation->run())     {       // valid       \Package::load('email');       $email = Email::forge();       $email->to($fieldset->field('email')->validated());       $email->subject('メールの件名');       // メールの本文は view を使って整形する       $mail_body = View::forge('email');       $mail_body->email = $fieldset->field('email')->validated();       $email->body = $mail_body->render());       try       {         $email->send();       }       catch (\EmailValidationFailedException $e)       {         die('メールを送信出来ませんでした。');       }       catch (\EmailSendingFailedException $e)       {         die('メールを送信出来ませんでした。');       }       Session::set_flash('success', 'メールを送信しました');       $this->template->title = 'send';       $this->template->content = Response::forge(ViewModel::forge('send'));     }     else     {       // invalid       Session::set_flash('error', 'invalid');       $fieldset->populate($fields->validated());       $this->template->title = 'index';       $this->template->content = Response::forge(ViewModel::forge('index'));     }   } }  | 
					
fuel/app/classes/view/index.php
| 
					 1 2 3 4 5 6 7 8  | 
						<?php class View_Index extends ViewModel {   public function view()   {   } }  | 
					
fuel/app/views/index.php
| 
					 1 2 3 4 5 6 7 8 9 10 11 12  | 
						<?php   $fieldset = Fieldset::instance('input');   $email_field = $fieldset->field('email');   echo Form::open(array('action' => '/send')); ?> <label><?php echo e($email_field->label); ?></label> <?php echo Form::input($email_field->name, $email_field->validated()); ?> <?php if ($email_field->error()): ?> <p class="error"><?php echo e($email->field->error()); ?></p> <?php endif ?> <?php echo Form::submit('submit', '送信する'); ?> <?php echo Form::close(); ?>  | 
					
fuel/app/views/email.php
| 
					 1  | 
						<?php echo $email; ?> さん、ご応募ありがとうございました。  | 
					
「test@example.jp」と入力したつもりが「testpexample.jp」と「@」を隣の「p」と入力された場合、valid_email のバリデーションルールでエラーが発生します。
エラーが発生したときに元の入力画面に戻ると入力フィールドのところにはエラーメッセージが表示されますが、その入力した値が消えてしまっていると思います。エンドユーザー的には「入力した内容のどこが悪かったのか」が知りたいとおもいますので、
| 
					 1  | 
						<?php echo Form::input($email_field->name, $email_field->validated()); ?>  | 
					
この行を
| 
					 1  | 
						<?php echo Form::input($email_field->name, ($email_field->error() ? $email_field->input() : $email_field->validated())); ?>  | 
					
とするとバリデーションエラー時には入力した値がデフォルトで入ります。
このようにフィールドが少ない場合ならいいのですが、フィールド数が多くなると面倒じゃないですか?
そこで、バリデーションエラーが発生したときは validated() で入力した値を返すようにしました。
方法としては Fieldset_Field クラスを拡張します。
fuel/app/classes/fieldset/field.php
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16  | 
						<?php class Fieldset_Field extends Fuel\Core\Fieldset_Field {   public function validated()   {     $value = $this->fieldset()->validation()->validated($this->name);     if ($this->error())     {       $value = $this->input();     }     return $value;   } }  | 
					
拡張したクラスを bootstrap.php の Autoloader::add_classes に追加します。
fuel/app/bootstrap.php
| 
					 1 2 3 4 5  | 
						Autoloader::add_classes(array(     // Add classes you want to override here     // Example: 'View' => APPPATH.'classes/view.php',     'Fieldset_Field' => APPPATH.'classes/fieldset/field.php', // この行を追加します。 ));  | 
					
これで、view では下記のような表示のままでバリデーションエラー時には入力した値がデフォルトの値になります。
| 
					 1  | 
						<?php echo Form::input($email_field->name, $email_field->validated()); ?>  |