为什么sfValidatorDoctrineChoice不会验证?

时间:2012-03-29 16:16:55

标签: symfony1 symfony-1.4

我正在尝试将下拉设置为“必需”,但表单仍然存在。我做错了什么?

以下是代码:

this->exportForm = new sfForm();
$widgets['sheet_type'] = new sfWidgetFormDoctrineChoice(array('model' => 'ExportSheet', 'add_empty' => true));
$this->exportForm->setWidgets($widgets);
$this->exportForm->setValidators(array('sheet_type' => new sfValidatorDoctrineChoice(array('model' => 'ExportSheet', 'required' => true), array('required' => 'Please select a sheet type to export.') )));

更新:

我已经提出了修改建议。

的actions.class.php:

$this->exportForm      = new sfForm();
$this->exportForm->getWidgetSchema()->setNameFormat('exportForm[%s]');
$widgets['sheet_type'] = new sfWidgetFormDoctrineChoice(array('model' => 'ExportSheet', 'add_empty' => true));

$this->exportForm->setWidgets($widgets);
$this->exportForm->setValidators(array('sheet_type' => new sfValidatorDoctrineChoice(array('model' => 'ExportSheet', 'required' => true), array('required' => 'Please select a sheet type to export.') )));


if ($request->isMethod('post'))
{
    $this->exportForm->bind($request->getParameter('exportForm'));

        if ($this->exportForm->isValid())
        {
                        ...
                    }
}

模板:

<form method="post" action="<?php echo url_for('@export'); ?>">
<div id="export" style="display: block"> 
<?php echo $exportForm['sheet_type']->renderRow(); ?>
</form>

我可以看到,当我提交回显$ request-&gt; getParameter('sheet_type')确实返回一个值时。如果是这种情况,为什么验证仍然失败?

1 个答案:

答案 0 :(得分:0)

验证表单有两个部分......第一部分是添加验证器,第二部分是检查它是否有效......

举个例子:

public function executeSomeaction(sfWebRequest $request)
{
   // Define the form
   this->exportForm = new sfForm();
   $widgets['sheet_type'] = new sfWidgetFormDoctrineChoice(array('model' => 'ExportSheet', 'add_empty' => true));
   $this->exportForm->setWidgets($widgets);
   $this->exportForm->setValidators(array('sheet_type' => new sfValidatorDoctrineChoice(array('model' => 'ExportSheet', 'required' => true), array('required' => 'Please select a sheet type to export.') )));

  // Deal with the request
  if ($request->isMethod('post'))
  {
    $this->exportForm->bind($request->getParameter(<your form>));
    if ($this->exporForm->isValid())
    {
      // Handle the form submission
      // ...

      $this->redirect('foo/bar');
    }
  }
}

if ($request->isMethod('post'))中的第二部分应用您的验证并检查用户提交的数据。关于使用验证处理表单的See here in the symfony docs

如果您使用以下内容为表单输出添加命名方案,那么获取所有结果很容易....

$this->exportForm->getWidgetSchema()->setNameFormat('exportForm[%s]');

然后你可以使用:

$this->exportForm->bind($request->getParameter('exportForm'));
然后,这将获得包含所有字段值的数组并将其绑定到表单 - 准备好检查它是否有效。

更新

您需要指定

$this->exportForm->getWidgetSchema()->setNameFormat('exportForm[%s]');

$this->exportForm->setWidgets($widgets);

因为setWidgets方法重置命名格式