4

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

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

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

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

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

目前唯一对我有用的是,但它并不是真正的 MVC:

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

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

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

public function checkMetric($validator, $values) {

}

谢谢!

4

3 回答 3

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;
}
于 2010-08-31T20:57:30.230 回答
0

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

2) configure() 方法在表单构造函数的末尾调用,因此值尚未绑定或访问,除非您使用数据库中的对象初始化表单(不需要任何验证)。但是如果你想从 $_POST 初始化你的表单,一个帖子验证器绝对是去恕我直言的方法。

于 2010-08-31T20:14:19.430 回答
0

sfValidatorErrorSchema通过抛出 a而不是 a ,我得到验证错误出现在字段旁边sfValidatorError

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

……变成……</p>

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

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

于 2012-05-08T05:00:49.793 回答