8

formBuilder我在 Symfony 中使用创建了一个表单。我使用外部样式表并引用标签 ID 为表单输入添加了一些基本样式。表单正确呈现并正确处理信息。

但是,它会输出一个不需要的无序列表,其中包含以下文本的列表项:This form should not contain extra fields.

我很难摆脱这个通知。我想知道是否有人可以帮助我理解为什么它会用我的表单呈现以及如何删除它?

提前谢谢了!

控制器

$form = $this->createFormBuilder($search)
        ->add('searchinput', 'text', array('label'=>false, 'required' =>false))
        ->add('search', 'submit')
        ->getForm();

$form->handleRequest($request);

Twig Output(表单输出处理正确

This form should not contain extra fields.

呈现的 HTML

<form method="post" action="">
    <div id="form">
       <ul>
           <li>This form should not contain extra fields.</li>
       </ul>
       <div>
          <input type="text" id="form_searchinput" name="form[searchinput]" />
       </div>
       <div>
          <button type="submit" id="form_search" name="form[search]">Search</button>
       </div>
       <input type="hidden" id="form__token" name="form[_token]" value="bb342d7ef928e984713d8cf3eda9a63440f973f2" />
    </div>
 </form>
4

5 回答 5

9

在我看来,由于令牌字段,您遇到了问题。如果是这样,请尝试向 createFormBuilder() 添加选项:

$this->createFormBuilder($search, array(
        'csrf_protection' => true,
        'csrf_field_name' => '_token',
    ))
    ->add('searchinput', 'text', array('label'=>false, 'required' =>false))
    ->add('search', 'submit')
    ->getForm();

要找出额外的字段,请在控制器中使用此代码,您可以在其中获取请求:

$data = $request->request->all();

print("REQUEST DATA<br/>");
foreach ($data as $k => $d) {
    print("$k: <pre>"); print_r($d); print("</pre>");
}

$children = $form->all();

print("<br/>FORM CHILDREN<br/>");
foreach ($children as $ch) {
    print($ch->getName() . "<br/>");
}

$data = array_diff_key($data, $children);
//$data contains now extra fields

print("<br/>DIFF DATA<br/>");
foreach ($data as $k => $d) {
    print("$k: <pre>"); print_r($d); print("</pre>");
}

$form->bind($data);
于 2013-10-06T15:46:33.740 回答
4

如果您在 createFormBuilder() 中添加/更改了字段并在浏览器中按刷新,也可能出现此消息...

在这种情况下,再次发送表格后就可以了;-)

于 2014-02-27T19:28:10.003 回答
1

我在同一页面上有多个表单时收到了相同的消息。事实证明,symfony 对它们的默认名称是 'form'。除了使用createFormBuilder,您可以更改表单的名称以避免使用冲突

public FormBuilderInterface createNamedBuilder(string $name, string|FormTypeInterface $type = 'form', mixed $data = null, array $options = array(), FormBuilderInterface $parent = null)

有关示例,请参见https://stackoverflow.com/a/13366086/1025437 。

于 2015-08-04T19:14:05.707 回答
0

我有同样的错误。

这是因为我有一个表单,错误地有一个 NULL 名称。

在 HTML 中,name 属性如下所示:

<form name href="..." action"..."></form>

就如此容易。

可能不是每个人都这样,但值得检查。

于 2014-08-26T17:38:17.797 回答
0

我在创建多步骤表单时遇到了这个错误。

当第 1 步表单提交时,$request->request 包含 acme_mybundle_myform 数组。这产生了一个验证错误,并阻止了后退、前进和表单字段的正确填充。更不用说“这种形式应该不包含额外字段”

由于 nni6 的代码,我发现了这一点。

我的解决方案在控制器内部:

if ($form->isValid())
{
    if($form->has('nextStep') && $form->get('nextStep')->isClicked())
    {
        $session->getFlashBag()->set('notice', 'Next clicked');

        $registerType->incrementStep();

        $request->request->remove('acme_mybundle_myform');

        return $this->forward("AcmeMyBundle:Default:register", array($request));

    }
....
}
于 2014-05-16T21:51:29.597 回答