[質問]複数の同じフォームのバリデーションの効率化方法

263 views
Skip to first unread message

you ya

unread,
Jun 3, 2018, 8:56:44 PM6/3/18
to codeigniter_jp
同じDBデータの複数フォームのバリデーションの効率化方法を探しています。

今は同じバリデーションルール一つをループで十個にするなどで対処しています。
結果生成するバリデーションは下記のようになっています。
            $rules = array(
                array
(
                   
'field' => 'email[0]',
                   
'label' => '会員ID(メールアドレス)の一部 - その1',
                   
'rules' => ['max_length[255]'],
               
),
                array(
                   
'field' => 'email
[1]',
                   
'label' => '会員ID(メールアドレス)の一部
- その2',
                   
'rules' => ['max_length[255]'],
               
),

                array(
                   
'field' => 'email
[2]',
                   
'label' => '会員ID(メールアドレス)の一部
- その3',
                   
'rules' => ['max_length[255]'],
               
),

           
);

            $this->form_validation->set_rules($rules);



基本的には同じDBフィールドのデータを複数保存するフォームでは、その個数分のバリデーションを作成するしかないのでしょうか。



こんな感じで対処できたらいいなと思っているのは下記のような形です。
こんな感じで書けたらいいなという程度ですが。

コントローラー
$rules = array(
                array
(
                   
'field' => 'email',
                   
'label' => '会員ID(メールアドレス)の一部',
                   
'rules' => ['max_length[255]'],
               
),
           
);
            $this
->form_validation->set_rules($rules);

ビュー
echo form_input('email[0]' , set_value('email',$post[email][0] ,FALSE) );


吉川徹郎

unread,
Jun 4, 2018, 12:24:36 AM6/4/18
to you ya, codeigniter_jp
you ya様

株式会社 音生の吉川でございます。

上記、配列の入力値に対してバリデーションの設定は可能かと思われます。

```php
<?php
$rules = [
    'field' => 'email[]',
    'label' => '会員ID(メールアドレス)の一部',
    'rules' => 'max_length[255]'
];

$this->form_validation->set_rules($rules);
```

以下のDocumentをご参照ください。


何卒よろしくお願い申し上げます。

2018年6月4日 9:56 you ya <shona...@gmail.com>:

--
このメールは Google グループのグループ「codeigniter_jp」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには codeigniter_jp+unsubscribe@googlegroups.com にメールを送信してください。
このグループに投稿するには codeigniter_jp@googlegroups.com にメールを送信してください。
このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/codeigniter_jp/b876b81f-19f4-4baa-871e-76ec98111a7d%40googlegroups.com にアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

Message has been deleted

you ya

unread,
Jun 4, 2018, 1:52:56 AM6/4/18
to codeigniter_jp
先程の投稿はバリデーションの部分で抜けがあったので再投稿します。

コントローラー
$rules = array(
                array
(
                   
'field' => 'email[]',
                   
'label' => '会員ID(メールアドレス)の一部',
                   
'rules' => ['max_length[255]'],
               
),
           
);
            $this
->form_validation->set_rules($rules);

ビュー
echo form_input('email[0]' , set_value('email',$post[email][0] ,FALSE) );  //バリデーションの対象にならない
//または
echo form_input('email[]' , set_value('email',$post[email][0] ,FALSE) );  //複数あると一つがバリデーションラーになると、全てにエラーが表示される。









望んだような、
同一カラムの複数データを別々にバリデーションするような動作は再現できませんでした・・。

Toshinori Endo

unread,
Jun 4, 2018, 4:40:42 AM6/4/18
to you ya, codeigniter_jp
こんにちは。

これ、バグだったようです。

https://stackoverflow.com/questions/8436146/codeigniter-displaying-individual-error-message-for-array-fields

そしてfixが公開されているようです。

https://github.com/bcit-ci/CodeIgniter/issues/5202

確認はしていませんが、ご参考まで。

遠藤


2018年6月4日 14:52 you ya <shona...@gmail.com>:
> --
> このメールは Google グループのグループ「codeigniter_jp」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには codeigniter_j...@googlegroups.com
> にメールを送信してください。
> このグループに投稿するには codeign...@googlegroups.com にメールを送信してください。
> このディスカッションをウェブ上で閲覧するには
> https://groups.google.com/d/msgid/codeigniter_jp/331ee43f-e284-4f3b-b980-03d243ed2918%40googlegroups.com

吉川徹郎

unread,
Jun 4, 2018, 5:57:00 AM6/4/18
to Toshinori Endo, you ya, codeigniter_jp
遠藤さん

お世話になっております。
株式会社 音生の吉川でございます。

おそらく、現在質問していただいてる実装はバグではないです。

添付いただいたissueとstackoverflowの内容は全くの別件かと思われます。


you yaさん

以下、エラーが発生すると全てエラーになるとはどう言うことでしょうか?

>> echo form_input('email[]' , set_value('email',$post[email][0] ,FALSE) );  //複数あると一つがバリデーションラーになると、全てにエラーが表示される。

form_inputはエラー文字列などを出力しないと思われますが。。。
もし、これが、form_error関数の謝りである場合は一つの配列のルールとして登録した値に対して、
キー毎のエラーメッセージを取得することはCI_Form_validationクラスの仕様上不可能です。

そのため、以下の方法をご検討いただいた方が良いかと思います。

* あきらめる。
* ほかのValidationライブラリを利用する。
* ループで回してインデックスを変更する。

また、CI_Form_validationクラスでは不可能な理由は以下です。

Form_validationのset_rulesメソッドはfield名に対して`error`というキーや入力情報を持つ配列を持ち、
その中の`error`というキーには、バリデーションエラーメッセージの配列が格納される構造になります。

つまり`email[]` に対して`error`キーはArray<string>となっており、
email配列のどのキーのエラーメッセージであるという情報を持たないです。

そのため、もしエラーメッセージも分けたいという要件ですと、CI_Form_validationの制約としてはルールも分ける必要があります。


221〜239行目参照



2018年6月4日 17:40 Toshinori Endo <en...@ist.hokudai.ac.jp>:
> このグループから退会し、グループからのメールの配信を停止するには codeigniter_jp+unsubscribe@googlegroups.com
> にメールを送信してください。
> このグループに投稿するには codeigniter_jp@googlegroups.com にメールを送信してください。

> このディスカッションをウェブ上で閲覧するには
> https://groups.google.com/d/msgid/codeigniter_jp/331ee43f-e284-4f3b-b980-03d243ed2918%40googlegroups.com
> にアクセスしてください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

--
このメールは Google グループのグループ「codeigniter_jp」の登録者に送られています。

このグループから退会し、グループからのメールの配信を停止するには codeigniter_jp+unsubscribe@googlegroups.com にメールを送信してください。
このグループに投稿するには、codeigniter_jp@googlegroups.com にメールを送信してください。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msgid/codeigniter_jp/CAM1S83Xrd3W6pj-HQYCgi%2BgDpC0QfBakpec7c7Fk303Y2V%2BFrQ%40mail.gmail.com にアクセスしてください。
その他のオプションについては、https://groups.google.com/d/optout にアクセスしてください。

you ya

unread,
Jun 4, 2018, 7:31:46 AM6/4/18
to codeigniter_jp
吉川さん、ご回答頂きありがとうございます。
ご推察頂いたことで悩んでいました。

エラー表示を簡単に分ける方法が知りたかったので助かりました。

無理ということで、まずはループで回してバリデーションをコピーするという状況なのでひとまずこれを正解として使用してみます。
ほかのValidationライブラリも探してみようと思います。
もしおすすめなどある方がいたら教えてくださると嬉しいです。

Reply all
Reply to author
Forward
0 new messages