我对表单有以下操作。在MyForm定义中,我添加了post验证器,因此我可以按特定条件一次验证两个字段。通过验证后,symfony向我发送错误,并将空值存储在数据库中的新记录中。我在这里发布我的代码...我的表单只有两个字段,用户大多从两个列表中选择它们来创建一个新记录。通过模式限制,两个字段的组合是唯一的。另外,我需要验证这些字段的某些组合是否不允许创建新记录。
的actions.class.php:
public function executeNew(sfWebRequest $request)
{
$this->form = new MyForm();
}
public function executeCreate(sfWebRequest $request)
{
$this->forward404Unless($request->isMethod(sfRequest::POST));
$this->form = new MyForm();
$this->processForm($request, $this->form, true);
$this->setTemplate('new');
}
protected function processForm(sfWebRequest $request, sfForm $form, $new = false)
{
$form->bind($request->getParameter($form->getName()),
$request->getFiles($form->getName()));
if ($form->isValid())
{
$post = $form->save();
$this->redirect('post/' . $post->getId());
}
}
MyForm.class.php
class MyForm extends BaseMyForm
{
public function configure()
{
$this->widgetSchema['field1'] = new sfWidgetFormChoice(array('choices' => MyUtil::$field1_vaues));
$this->widgetSchema['field2'] = new sfWidgetFormChoice(array('choices' => MyUtil::$field2_values));
$this->mergePostValidator(new sfValidatorCallback(array('callback' => array($this, 'validateBothFields'))));
}
public function validateBothFields($validator, $values, $arguments)
{
if (MyUtil::fields_relation($values['field1'], $values['field2']))
{
throw new sfValidatorError($validator, "Fields relation invalid!");
}
}
}
当我注释掉mergePostValidator行时,一切正常,但是我无法验证不接受我的两个字段的某些组合的条件。
当按原样使用此代码时:如果组合无效,一切正常,表单会再次显示“字段关系无效!”信息。但如果组合有效,symfony会抛出以下错误:
警告: 在第169行的/path/to/symfony/lib/plugins/sfDoctrinePlugin/lib/form/sfFormDoctrine.class.php中为foreach()提供的参数无效
可捕获的致命错误: *传递给Doctrine_Record :: fromArray()的参数1必须是一个数组,给定null,在/ path / to / symfony / lib / plugins / sfDoctrinePlugin / lib /中调用第150行的form / sfFormDoctrine.class.php,并在第1970行的/ṕath/to/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php中定义*
警告: 在1973行的/path/to/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php中为foreach()提供的参数无效
然后是一些关于无法修改标头以响应的警告/错误(但我不是自己修改任何内容,也许只是动作Create方法中的$ this-> setTemplate('new')。 ..
我正在使用Symfony 1.4.9,但也尝试使用SVN服务器(rev 32070)的1.4开发分支并获得相同的结果。 Apache 2.2,PHP 5.2.6
答案 0 :(得分:3)
验证器需要返回已清理的值 - 对于后验证器也是如此。在函数末尾添加return $values;
。
你的问题来自于遗漏这个问题,因此稍后会将null传递给foreach()调用,从而导致第一个错误。其他人的原因相同。
存储空值,因为您通过错过此返回来有效地将传递给表单的每个值清零。