我正在尝试根据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) {
}
谢谢!
答案 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();
}
不确定这是否是获得此结果的最佳方法,但目前似乎对我有用。