0

我对表单有以下操作。在 MyForm 定义中,我添加了 post 验证器,因此我可以通过特定条件一次验证两个字段。问题来了,在通过验证后,symfony 向我发送一个错误,并将空值存储在数据库的新记录中。我在这里发布我的代码......我的表单只有两个字段,用户最多从两个列表中选择每个字段来创建新记录。受模式限制,这两个字段的组合是唯一的。此外,我需要验证这些字段的某些组合不允许创建新记录。

动作.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,在第 150 行的 /path/to/symfony/lib/plugins/sfDoctrinePlugin/lib/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 开发分支并得到相同的结果。阿帕奇 2.2、PHP 5.2.6

4

1 回答 1

3

验证器需要返回清理后的值 - 与后验证器相同。return $values;在函数末尾添加一个。

您的问题来自于缺少这个,因此稍后将 null 传递给 foreach() 调用,从而导致您的第一个错误。其他人也是一样的原因。

存储空值是因为您通过缺少此返回有效地将传递给表单的每个值归零。

于 2011-02-16T22:43:08.217 回答