Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony1 Symonfy 1.4是否可能进行动态验证?_Symfony1_Symfony 1.4_Symfony Forms - Fatal编程技术网

Symfony1 Symonfy 1.4是否可能进行动态验证?

Symfony1 Symonfy 1.4是否可能进行动态验证?,symfony1,symfony-1.4,symfony-forms,Symfony1,Symfony 1.4,Symfony Forms,我正在尝试创建一个表单,该表单基于html表单字段中的选择选项更改字段的验证 例如:如果用户从下拉字段“选项”中选择选项1,我希望字段“度量”验证为sfValidatorInteger。如果用户从字段“选项”中选择选项2,我希望字段“度量”验证为sfValidatorEmail等 因此,在公共函数configure()中,我有一个switch语句来捕获“options”的值,并根据“options”返回的值创建验证器 1.)如何获取“选项”的价值?我尝试过: $this->getObjec

我正在尝试创建一个表单,该表单基于html表单字段中的选择选项更改字段的验证

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

因此,在公共函数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()中赋值:

谢谢!

1)在后验证器中,值可以通过访问。只需使用$values['options']就可以了……或者您想从代码的另一部分访问这些值吗?$this->getObject()->widgetSchema['options']我认为,一旦表单绑定到对象,也应该可以使用


2) configure()方法在表单构造函数的末尾被调用,因此值不会被绑定或访问,除非您使用db中的对象初始化表单(不需要任何验证)。但是,如果您想从$\u POST初始化表单,POST validator肯定是一种方法。

您想使用POST validator。请尝试在表单中执行类似操作:

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;
}

我通过抛出一个
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();
}

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

谢谢您的帮助!我是这样得到它的。我不知道mergePostValidator和$validator->clean()。您知道一种将字段名附加到$validator->clean()抛出的错误消息的方法吗?在这种情况下,它将是“选项”字段。感谢您的回答。这非常有帮助,我决定将代码移动到后验证器,并按照您的建议捕获$value。谢谢。
try
{
    $values['dynamic_validation'] = $validator->clean($values['dynamic_validation']);
}
catch(sfValidatorError $e)
{
    $this->getErrorSchema()->addError($e, 'dynamic_validation');
    throw $this->getErrorSchema();
}