sfFormの複数項目バリデータ

  • sfFormのバリデータ指定はフィールド単体に対するものが基本となっています。
  • では、“検索条件等のフォームでは年齢の範囲指定をしたい”のように、FROM・TOと2つの項目を合わせてチェックしたい場合、どのように指定するのでしょうか。
  • setPostValidatorを使用して、下記のように記述することで実現できます。
class hogeForm extends BaseForm
{
    public function configure()
    {
        $this->setWidgets(array(
            'age_from'              => new sfWidgetFormInputText(),
            'age_to'                => new sfWidgetFormInputText(),
        ));

        $this->getValidatorSchema()->setPostValidator(
           // '<='等の比較演算子文字列は、sfValidatorSchemaCompareクラス内に定数宣言もありますが、このほうが分かりやすいように思います。
           new sfValidatorSchemaCompare('age_from', '<=', 'age_to')
        );

        $this->getWidgetSchema()->setNameFormat('hogeinput[%s]');
        $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
    }
}

postValidator内に複数のバリデータを設定するには

  • 上記で複数項目のチェックはできました。では、上記に加えて、勤続年数範囲条件も追加する場合。
  • 下記のように sfValidatorAnd を使用して実現できます。
class hogeForm extends BaseForm
{
    public function configure()
    {
        $this->setWidgets(array(
            'age_from'              => new sfWidgetFormInputText(),
            'age_to'                => new sfWidgetFormInputText(),
            'work_length_from'      => new sfWidgetFormInputText(),
            'work_length_to'        => new sfWidgetFormInputText(),
        ));

        $this->setValidators(array(
            'age_from'              => new sfValidatorInteger(),
            'age_to'                => new sfValidatorInteger(),
            'work_length_from'      => new sfValidatorInteger(),
            'work_length_to'        => new sfValidatorInteger(),
        ));

        $this->getValidatorSchema()->setPostValidator(new sfValidatorAnd(array(
            new sfValidatorSchemaCompare('age_from', '<=', 'age_to'),
            new sfValidatorSchemaCompare('work_length_from', '<=', 'work_length_to'),
        )));

        $this->getWidgetSchema()->setNameFormat('hogeinput[%s]');
        $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
    }
}

facebook slideshare rubygems github qiita