複数フィールドのバリデーションについて
From、To共に値が入っていた時のみ処理を流すようにするためには
http://okyuu.com/ja/question/7806
どのようにしたら良いのでしょうか
<?php class HogeFormFilter extends sfFormFilterDoctrine { public function configure() { // ... $this->validatorSchema['from'] = new sfValidatorInteger(array('required' => false)); $this->validatorSchema['to'] = new sfValidatorInteger(array('required' => false)); $this->validatorSchema->setPostValidator(new sfValidatorCallback( array( 'callback' => array($this, 'validateFromTo'), ), array( 'invalid' => 'fromとtoを正しく入力してください', ) )); } public function validateFromTo(sfValidatorBase $validator, $values) { if (strlen($values['from']) && strlen($values['to'])) { if ($values['from'] > $values['to']) { throw new sfValidatorError($validator, 'invalid'); } } return $values; } }
※$this->setPostValidator()となっていたのを$this->validatorSchema->setPostValidator()に修正しました。id:innx_hidenoriさんご指摘ありがとうございました。
こんな感じでsfValidatorCallback使うのが手っ取り早いと思います。
各フィールドごとに設定するバリデータ(上記でいえばfromとtoのsfValidatorIntegerなど)は単一のフィールドのみのバリデーションになりますので、複数フィールドにまたがるバリデーションは基本的にpostValidatorを利用します。
postValidatorに設定したバリデータには、個別フィールドに対するバリデーションが行われた値の配列が渡されますので、複数フィールドのバリデーションが可能になります。
sfValidatorCallbackはその名の通りコールバックを指定してバリデーションするものですが、postValidatorに指定した場合は第2引数に値が配列で渡されますので、それを好きなように処理します。
sfValidatorCallbackを利用する場合、validな場合は値をreturnし、invalidな場合はsfValidatorErrorをthrowします。これを覚えておけば、大抵のバリデーション処理は記述可能かなと思います。
また、validなときは基本的に値をそのまま返しますが、このときに値を変更・追加して返すことも可能です。たとえば $values['hoge'] = 'fuga'; としてからreturnすると、全体のバリデーションが全て通っていれば $form->getValue('hoge') として値を取り出すことが可能です。
これは例えばログイン用のフォームで、IDとパスワードに一致するユーザがいた場合に、該当ユーザのオブジェクトを$values['user']にセットして返す、といったことが可能です。