IT女子のお気に入りフォルダ

管理人の備忘録と実践を兼ねた(出来るだけ)役に立つ情報を配信するブログです。

[fuelPHP]requiredのエラーメッセージでセレクト項目は「◯◯を選択してください」にする

同じrequiredのバリデーションでも、
テキストフォームの場合は「◯◯を入力してください。」とし、
セレクトボックスやチェックボックスでは「◯◯を選択してください。」としたいことがあります。

これは、add_ruleにクロージャを設定する方法で解決できます。
ただし、セレクトボックスやチェックボックスで繰り返し同じメッセージを出すことになりそうなら、独自バリデーションクラスを作成した方が良いと思います。
というわけで、それぞれの方法をメモ。

その1)add_ruleにクロージャを設定する方法

Modelクラスのvalidateでクロージャを設定し、フィールドごとにメッセージをセットします。

public static function validate($factory)
{
	$val = Validation::forge($factory);

	// クロージャを設定
	// Validation の _validation_required メソッドを利用する
	$required_rule = function ($v) use ($val) { return $val->_validation_required($v); };

	// テキストフォーム
	$val->add('name', 'お名前')
    	    ->add_rule(['required_name' => $required_rule]);
	$val->set_message('required_name', 'お名前を入力してください。');

	// セレクトボックス
	$val->add('pref', '都道府県')
	    ->add_rule(['required_pref' => $required_rule]);
	$val->set_message('required_pref', '都道府県を選択してください。');
}

その2)独自バリデーションクラスを作成する方法

fuel/app/classes/myvalidationrules.php
(なければファイルを作成)

class MyValidationRules
{
	/**
	 * Required(セレクトボックス・チェックボックス用)
	 * requiredでエラーメッセージを「◯◯を選択してください。」にするための拡張クラス
	 */
	public static function _validation_required_select($val)
	{
		return ! ($val === false or $val === null or $val === '' or $val === array());
	}
}

Modelクラスのvalidateでadd_callableで独自バリデーションクラスを呼び出し、対象のフィールドでは「required」ではなく、追加した「required_select」を指定します。

public static function validate($factory)
{
	$val = Validation::forge($factory);
	$val->add_callable('MyValidationRules'); //独自バリデーションクラスを追加

	$val->add_field('name', 'お名前', 'required');
	$val->add_field('pref', '都道府県', 'required_select');

	return $val;
}

汎用的なバリデーションは独自クラスとして追加すると便利。