Symfony1.4にて、PostValidatorで個別のフィールドにバリデーションエラーを設定する方法を調べたのでメモ。
・参考:postValidatorから個別のフィールドにエラーを設定 - ゆっくり*ゆっくり
最初は、単純に sfValidatorError を使って、バリデーションエラーメッセージを表示させていたのですが、この書き方だとGlobalErrorになります。
// ログインIDの重複チェックをするバリデータ
class ValidatorSameLoginId extends sfValidatorBase{
protected function doClean($value){
// DBから同じログインIDのレコードを取得
$user = UserTable::getInstance()->getOneByLoginId($value['login_id']);
// 同じログインIDのレコードが既に存在する場合、バリデーションエラー
if($user != false){
throw new sfValidatorError($this, '同じログインIDが既に登録されています', array('value' => $value));
}
return $value;
}
}
これを単一のフィールドに対するエラーであるNamedErrorにするには、
if($user != false){
throw new sfValidatorError($this, '同じログインIDが既に登録されています', array('value' => $value));
}
の部分を、sfValidatorErrorSchema を使って以下のように書き換えると、個別のフィールドにバリデーションエラーを表示させることができます。
・symfony API » sfValidatorErrorSchema Class | symfony | Web PHP Framework
class ValidatorSameLoginId extends sfValidatorBase{
protected function doClean($value){
// DBから同じログインIDのレコードを取得
$user = UserTable::getInstance()->getOneByLoginId($value['login_id']);
// 同じログインIDのレコードが既に存在する場合、バリデーションエラー
if($user != false){
throw new sfValidatorErrorSchema($this, array(
'login_id' => new sfValidatorError($this, '同じログインIDが既に登録されています'),
));
}
return $value;
}
}
以上です。