より冴えた(?)方法を書きました。
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