フォームで2つの入力値が同じ入力値か判定したい場面って結構あると思います。例えば確認用パスワードでの再入力や、メールアドレスの再入力など。
せっかくフレームワークを使っているので、SymfonyのsfFormで利用できるバリデート機能でチェックしたほうが良いと思います。
sfValidatorSchemaCompareクラスの利用
今回はsfValidatorSchemaCompareというクラスを用います。こちらのバリデーションクラスでは2つのフィールドにまたがって値の比較を柔軟に行えます。例えば入力項目Aより入力項目Bの値のほうが小さいかなどというチェックもできます。
サンプルコードと解説
class RegisterForm extends sfForm
{
public function configure()
{
$this->setWidgets(
array(
'password' => new sfWidgetFormInputPassword(
array('label' => 'パスワード')
),
'again_password' => new sfWidgetFormInputPassword(
array('label' => '確認用パスワード')
)
)
);
$this->setValidators(
array(
'password' => new sfValidatorString(
array('required' => true)
),
'again_password' => new sfValidatorString(
array('required' => true)
)
)
);
$this->validatorSchema->setPostValidator(
new sfValidatorSchemaCompare(
'again_password',
'==',
'password',
array('throw_global_error'=> false),
array('invalid'=> '確認用パスワードが一致していません')
)
);
}
}
passwordフィールドとagain_passwordフィールドが同一かどうかをチェックしています。
比較したい二つのフィールド名の引数の間に比較演算子となっており、普段の式のように直感的に書ける引数構成だと思います。
again_password == password
sfValidatorSchemaCompareコンストラクタの引数の仕様
symfony Forms in Action | 付録 B – バリデータ | symfony | Web PHP Framework
sfValidatorSchemaCompare($left_field, $operator, $right_field, $throw_global_error)
第二引数$operatorについての詳細について以下引用です。
利用可能な演算子の一覧は次のとおりです。
sfValidatorSchemaCompare::EQUALもしくは==sfValidatorSchemaCompare::IDENTICALもしくは===sfValidatorSchemaCompare::NOT_EQUALもしくは!=sfValidatorSchemaCompare::NOT_IDENTICALもしくは!==sfValidatorSchemaCompare::LESS_THANもしくは<sfValidatorSchemaCompare::LESS_THAN_EQUALもしくは<=sfValidatorSchemaCompare::GREATER_THANもしくは>sfValidatorSchemaCompare::GREATER_THAN_EQUALもしくは>=
throw_global_error引数をtrueとするとGlobal errorとして投げられます。
falseとするとnamed errorが左側のフィールドにNamed errorが投げられます(デフォルトの挙動)
- Named error – 単一フィールドに対するエラー
- Global error – 複数フィールドにまたがる、フォーム共通のエラー
しばらくはSymfonyの開発実践をしながら勉強の日々が続きそうです。
さーがんばろう。