Forms 如何在symfony 1.4中正确设置条件验证器?

Forms 如何在symfony 1.4中正确设置条件验证器?,forms,symfony1,conditional,validation,Forms,Symfony1,Conditional,Validation,由于某些原因,我表单中的字段未被验证。也许有人可以指出我代码中的任何错误或缺失项。我在这里试着效仿这个例子: 感谢您的帮助 我有以下表格: <?php /** * dnc_btns form. * * @package NMPlus * @subpackage form * @author Your name here * @version SVN: $Id: sfDoctrineFormTemplate.php 23810 2009-11-12

由于某些原因,我表单中的字段未被验证。也许有人可以指出我代码中的任何错误或缺失项。我在这里试着效仿这个例子:

感谢您的帮助

我有以下表格:

    <?php

/**
 * dnc_btns form.
 *
 * @package    NMPlus
 * @subpackage form
 * @author     Your name here
 * @version    SVN: $Id: sfDoctrineFormTemplate.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class dnc_btnsForm extends Basednc_btnsForm
{
    public function configure()
  {
    $this->useFields(array('btn', 'btn_low', 'btn_high', 'company', 'source'));


    $this->setValidator('company', new sfValidatorPass());
    $this->setValidator('source', new sfValidatorPass());
    $this->validatorSchema->setPostValidator(
          new sfValidatorCallback(array('callback' => array($this, 'checkBtnType')))
        );

  }

    public function checkBtnType($validator, $values)
        {
                if (!empty($values['btn']))
                    {
                        $this->setValidator('btn', new sfValidatorBtn());
                        $this->setValidator('btn_low', new sfValidatorPass());
                        $this->setValidator('btn_high', new sfValidatorPass());
                    }

                if(empty($values['btn']))
                    {
                        $this->setValidator('btn_low', new sfValidatorBtn());
                        $this->setValidator('btn_high', new sfValidatorBtn());
                        $this->mergePostValidator(
                                    new sfValidatorSchemaCompare('btn_low', sfValidatorSchemaCompare::LESS_THAN, 'btn_high', array(),
                                    array('invalid' => 'The first BTN must be lower than the second.')));

                    }

                    return $values;
        }

}
方法应该执行验证,而不是添加新的验证器

如果一切正常,您的方法应该返回值,否则将抛出sfValidatorError异常

您似乎没有按照粘贴的链接中的教程进行操作。

我没有测试过(可能是我错了),但我认为您可以通过手动创建验证对象在
checkBtnType
中执行整个验证:

$validator = new sfValidatorBtn();
$validator->doClean($values['btn']);

希望这能有所帮助。

我将本教程作为起点。为了达到我的目的,我偏离了它。如果checkBtnType()方法应该执行验证,那么将该部分代码放在自定义验证器中不是更好吗?还有没有一种方法可以实现现有的验证器,这样我就不用重写它们了?谢谢你的反馈。当然最好实现自定义验证器。什么阻止了你?您可以通过扩展现有的验证器来重用它们(创建一个扩展另一个验证器类的类)。
$validator = new sfValidatorBtn();
$validator->doClean($values['btn']);