Symfony 2此表单不应包含额外字段

时间:2013-10-06 14:03:22

标签: forms symfony symfony1 formbuilder

我在Symfony中使用formBuilder创建了一个表单。我使用外部样式表并引用标记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输出(表格输出并正确处理

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>

5 个答案:

答案 0 :(得分: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);

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

我在同一页面上有多个表单时收到相同的消息。事实证明,symfony默认为所有这些名称的“形式”。您可以使用

更改表单名称以避免冲突,而不是使用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

答案 3 :(得分:0)

创建多步骤表单时遇到此错误。

提交第1步表单时,$ request-&gt;请求包含acme_mybundle_myform数组。这会创建一个验证错误,并停止正确填充的后退,前进和表单字段。更不用说&#34;这个形式应该不包含额外的字段&#34;

我发现这要归功于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));

    }
....
}

答案 4 :(得分:0)

我遇到了同样的错误。

这是因为我有一个错误的名称有一个名称。

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

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

就这么简单。

可能不是每个人的情况,但值得检查。