より冴えた(?)方法を書きました。
http://madroom-project.blogspot.jp/2013/05/fuelphp_26.html
--
例えばユーザのアカウント名は、対応するカラムの制約がUNIQUEになりますが、これを事前にバリデーションでエラーとする方法です。
FuelPHPのValidationクラスのadd_ruleメソッドにはクロージャを登録出来ます。
http://fuelphp.jp/docs/1.6/classes/validation/errors.html#/naming_rules
クロージャに自身のレコードのidを渡せば、自身を除いた一意性チェックが出来るわけですが、以下の方法で渡せました。尚、細かく作りこんでいませんので、穴があったらごめんなさいm(_ _)m
$v = Validation::forge();
$v->add('uname', 'uname')
->add_rule(array('already_taken' => function($val, $self_id) {
if (empty($self_id))
{
$my_uname = null;
}
else
{
$self = Model_Xxx::find($self_id);
$my_uname = ! empty($self->uname) ? $self->uname : null;
}
if ($my_uname !== null and $my_uname === $val)
{
return true;
}
$ret = Model_Xxx::find_by_uname($val);
return empty($ret);
}), $self_id);
* $self_idが、自身のidです。* 'already_taken'は、バリデーション用メッセージファイルの"lang/xx/validation.php"のキーに対応します。
* 別途、requiredチェックとかはして下さい。
これで、クロージャの中でInputクラスとかSessionクラスとか使わなくて済みます。
No comments:
Post a Comment