Vapor Trail

明るく楽しく元気よく

FuelPHPのvalidationでそれぞれ個別にメッセージを出したい

FuelPHPのvalidationのadd_ruleでそれぞれ個別にメッセージを出したい。

/lang/jp/validation.php
<?php
return array(
        'required'         => '『:label』は必須です',
        'min_length'       => '『:label』は:param:1文字以上で入力してください',
        'max_length'       => '『:label』は:param:1文字以内で入力してください',
        'exact_length'     => '『:label』は:param:1文字で入力してください',
        'match_value'      => '『:label』は『:param:1』と一致していません',
        'match_pattern'    => '『:label』は『英数字と記号(@+-.)のみ』で入力する必要があります',
        'match_field'      => '『:label』は『:param:1』と一致していません',
        'valid_email'      => '『:label』が不正です',
        'valid_emails'     => '『:label』に不正なメールアドレスが含まれてます',
        'valid_url'        => '『:label』は不正なURLです',
        'valid_ip'         => '『:label』は不正なIPアドレスです',
        'numeric_min'      => '『:label』は:param:1以上で入力してください',
        'numeric_max'      => '『:label』は:param:1以内で入力してください',
        'valid_string'     => '『:label』は『英数字と記号(@+-.)のみ』で入力する必要があります',
        'checkbox_require' => '『:label』は:param:1つ以上選択する必要があります',
        'unique' => '『:label』はすでに登録してあります。',
        'uniquemail' => '『:label』はすでに登録してあります。',
        'phone_number' => '『:label』は『数字とハイフン』で入力する必要があります'
);        

valid_stringのルールのエラーメッセージを一応設定はできる。

<?php
        $form->add('zip_code', '郵便番号', ['type' => 'text', 'class' => 'form-control'])
            ->add_rule('required')
            ->add_rule('valid_string','numeric');

例えばこの場合、郵便番号のフォームで数字のみのルールにしても、valid_stringのルールのエラーメッセージの設定値として '『郵便番号』は『英数字と記号(@+-.)のみ』で入力する必要があります'と表示されてしまう。

しかし、入力フォームが複数あって、それぞれのフォームに細かなルールを設定して別々のエラーメッセージを表示したい場合に困る。

<?php
        // 郵便番号は数字のみ
        $form->add('zip_code', '郵便番号', ['type' => 'text', 'class' => 'form-control'])
            ->add_rule('required')
            ->add_rule('valid_string','numeric');
        // アクセスキーは英数字のみ
        $form->add('access_key', 'アクセスキー', ['type' => 'text', 'class' => 'form-control'])
            ->add_rule('required')
            ->add_rule('valid_string','alphanumeric');
$form->validation()->set_message('valid_string', '数字のみで入力する必要があります');

とすることもできるが、valid_stringのルールに対して1つしかメッセージを設定できない。
この場合、アクセスキーのフォームのエラーメッセージは'英数字のみで入力する必要があります'と表示したいが'数字のみで入力する必要があります'となる。

qiita.com

<?php
        $form->add('zip_code', '郵便番号', ['type' => 'text', 'class' => 'form-control'])
            ->add_rule('required')
            ->add_rule(['zip_code' => function ($zip) {
                return (bool)preg_match('/^[0-9]+$/', $zip);
            }]);
$form->validation()->set_message('zip_code', '郵便番号は数字のみで入力する必要があります');

個別にルールをクロージャで設定すると、細かなバリデーションエラーのメッセージを表示することができる。