Symfony 1.4动态验证可能吗?

时间:2010-08-31 17:10:45

标签: symfony1 symfony-1.4 symfony-forms

我正在尝试根据html表单字段中的select选项创建一个更改字段验证的表单。

例如:如果用户从下拉字段“options”中选择选项1,我希望字段“metric”验证为sfValidatorInteger。如果用户从字段“options”中选择选项2,我希望字段“metric”可以验证为sfValidatorEmail等。

所以在public函数configure(){我有switch语句来捕获“options”的值,并根据“options”返回的值创建验证器。

1.。)如何捕获“选项”的值?我试过了:

$this->getObject()->options
$this->getTaintedValues()

目前唯一适用于我的是但它并不是真正的MVC:

$params = sfcontext::getInstance()->getRequest()->getParameter('options');

2.。)一旦我捕获了这些信息,我怎样才能将“metric”的值分配给不同的字段? (“metric”不是db中的真实列)。所以我需要将“metric”的值分配给不同的字段,例如“email”,“age”......目前我正在这样的post验证器处理这个,只是想知道我是否可以在configure中分配值( ):

$this->validatorSchema->setPostValidator(new sfValidatorCallback(array('callback' => array($this, 'checkMetric'))));

public function checkMetric($validator, $values) {

}

谢谢!

3 个答案:

答案 0 :(得分:6)

您想使用帖子验证器。尝试在表单中执行以下操作:

public function configure()
{
  $choices = array('email', 'integer');
  $this->setWidget('option', new sfWidgetFormChoice(array('choices' => $choices))); //option determines how field "dynamic_validation" is validated
  $this->setValidator('option', new sfValidatorChoice(array('choices' => array_keys($choices)));
  $this->setValidator('dynamic_validation', new sfValidatorPass()); //we're doing validation in the post validator
  $this->mergePostValidator(new sfValidatorCallback(array(
    'callback' => array($this, 'postValidatorCallback')
  )));
}

public function postValidatorCallback($validator, $values, $arguments)
{
   if ($values['option'] == 'email')
   {
     $validator = new sfValidatorEmail();
   }
   else //we know it's one of email or integer at this point because it was already validated
   {
     $validator = new sfValidatorInteger();
   }
   $values['dynamic_validation'] = $validator->clean($values['dynamic_validation']); //clean will throw exception if not valid
   return $values;
}

答案 1 :(得分:0)

1)在帖子验证器中,using the $values parameter可以访问值。只需使用$ values ['options']它应该没问题......或者你想从代码的另一部分访问这些值?一旦你的表单绑定到一个对象,$ this-> getObject() - > widgetSchema ['options']也应该工作。

2)在表单构造函数的末尾调用configure()方法,因此值不受约束也不可访问,除非您使用db中的对象初始化表单(不需要任何验证)。但是如果你想从$ _POST初始化你的表单,那么post post validator肯定是去IMHO的方式。

答案 2 :(得分:0)

我通过抛出sfValidatorErrorSchema而不是sfValidatorError来确认错误显示在字段旁边。

$values['dynamic_validation'] = $validator->clean($values['dynamic_validation']);

... ...变为

try
{
    $values['dynamic_validation'] = $validator->clean($values['dynamic_validation']);
}
catch(sfValidatorError $e)
{
    $this->getErrorSchema()->addError($e, 'dynamic_validation');
    throw $this->getErrorSchema();
}

不确定这是否是获得此结果的最佳方法,但目前似乎对我有用。