最新の記事や関連記事をお探しの方は下の「サイト内検索」で検索してみてください。
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()); ?> |