バリデート時、同じルールでもエラーメッセージが異なる場合について

363 views
Skip to first unread message

ninomiya kazunori

unread,
Jul 3, 2012, 11:39:18 PM7/3/12
to fuelp...@googlegroups.com
はじめまして
Ninomiya と申します。

さっそく本題ですが、
Validation でのエラーメッセージが同じルールでもフィールド毎で異なった場合、
皆さんはどの様に対処されてるでしょうか。

例えば、required のエラーメッセージがフィールドによって異なった場合など。
具体的には、入力系と選択系で異なるかと思います。

入力系「:labelを入力してください」
選択系「:labelを選択してください」

(共通で「:labelは必須です」でもいけそうですが)

いざ二つのメッセージを設定しようと思っても、validation.php では一つしか設定出来ません。

一応、自分では幾つか方法を考えて、それで対処しています。


もし「もっとシンプルな方法がある」とか「自分はこうやってる」などあれば、
その方法をお聞かせ頂けると助かります。

宜しくお願いします。

mamor

unread,
Jul 4, 2012, 4:55:30 AM7/4/12
to fuelp...@googlegroups.com
mamorです。

以下の方法も考えられます。

CoreのValidationをApp側で同名で拡張。
以下のメソッドを用意。
--
public function _validation_required_select($val)
{
return $this->_validation_required($val);
}
--
app/lang/xx/validation.phpに
'required_select'
のメッセージを設定。


2012年7月4日水曜日 12時39分18秒 UTC+9 ninomiya kazunori:

ninomiya kazunori

unread,
Jul 4, 2012, 6:31:04 AM7/4/12
to fuelp...@googlegroups.com
mamor さん

ありがとうございます!
そうですね。ルールを追加というやり方もありますね。


やり方は違いますが、自分も最初ルールを追加する方向で考えていました。
ただ、同じルールでエラー文言が異なるフィールドが増える度に拡張なので、
やや面倒かなと感じて止めた経緯があります。


バリデーションとは違う話ですが、required_select だと、Fieldset からフォームを作成する際に問題が生じます。
要素に対してルール名が required と等価でないと required 属性が付かないって言う程度ですけど。

COREPATH/classes/fieldset/field.php
-
public function add_rule($callback)
{
$args = array_slice(func_get_args(), 1);
$this->rules[] = array($callback, $args);

// Set required setting for forms when rule was applied
if ($callback === 'required')
{
$this->set_attribute('required', 'required');
}

return $this;
}
-


2012年7月4日水曜日 17時55分30秒 UTC+9 mamor:

mika kane

unread,
Jul 30, 2012, 5:07:54 AM7/30/12
to fuelp...@googlegroups.com
いっその事,エラーメッセージの部分をValidationクラスから分離してしまうっていう方法もありかと思います。

set_messageの内容をコードにしてしまって,
$message[label][code]にメッセージを記述していく。
多言語対応考えだすとこうするしかない感じかなぁって思ったりとか。

ご参考になれば幸いです。


2012年7月4日水曜日 12時39分18秒 UTC+9 ninomiya kazunori:
はじめまして

tk kk

unread,
May 8, 2015, 8:55:27 AM5/8/15
to fuelp...@googlegroups.com
はじめまして、tkと申します。

条件指定で add_rule を付け加えたかったんですが、
中々うまくできずこちらにたどり着きました。
自分の場合はこんな感じでクロージャで名前を付けてやってます。

$fix_id = $_POST['fix_discounts'];
$result = DB::select('name')->from('discounts')->where('id', $fix_id)->execute();
$fix_name = $result[0]['name'];
unset($result);
$eb_start = $this->mycf['eb_start'];
$eb_end = $this->mycf['eb_end'];
$val->add('fix_discounts', $fix_name)
    ->add_rule('valid_string', 'numeric')
    ->add_rule(
        array(
            'fix_discount_course' => function () use ($course, $fix_id, $grp) {
                if (!preg_match('/[2-4]/', $fix_id)) {
                    return true;
                }
                $result = DB::select('min')->from('services')
                    ->where('sid', $course)->execute();
                return $result[0]['min'] >= 60;
            }
        )
    )->add_rule(
        array(
            'fix_discount_eb' => function () use ($sh, $fix_id, $eb_start, $eb_end, $holiday) {
                if (!preg_match('/[3-4]/', $fix_id)) return true;
                return ($eb_start <= $sh and $sh < $eb_end and !$holiday);
            }
        )
    )->add_rule(
        array(
            'fix_discount_free' => function() use ($fix_id, $desg) {
                if ($fix_id == 3) return ($desg == 4);
            }
        )
    )->add_rule(
        array(
            'fix_discount_pic' => function() use ($fix_id, $desg) {
                if ($fix_id == 4) return ($desg == 5);
            }
        )
    );

* fuel/app/lang/ja/validation.php
    'fix_discount_course'    => ':label は ...',
    'fix_discount_eb'    => ':label は...
    'fix_discount_free'    => ':label は
    'fix_discount_pic'    => ':label は ...


2012年7月4日水曜日 12時39分18秒 UTC+9 ninomiya kazunori:
はじめまして
Reply all
Reply to author
Forward
0 new messages