2013-10-06 75 views
7

我在Symfony中使用formBuilder創建了一個表單。我使用外部樣式表和引用標籤ID爲表單輸入添加一些基本樣式。表單呈現正確並正確處理信息。Symfony 2此表格不應包含額外字段

然而,它輸出不必要的無序列表包含以下文本列表項: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); 

嫩枝輸出(形式輸出和正確處理

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> 
+1

可能的重複[Symfony2:擺脫「這種形式不應該包含額外的領域」](http://stackoverflow.com/questions/8475999/symfony2-get-rid-of-this-form-should-not -contain-extra-fields) – falinsky

回答

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); 
+0

感謝您的回覆,我會試試看。爲什麼首先生成令牌字段,爲什麼它是一個問題? – AnchovyLegend

+0

我不知道你的情況是什麼字段,你可以很簡單地找到它。額外的字段意味着在請求中有一些沒有在表單構建器中的字段。所以表單綁定會導致這個錯誤。默認情況下,令牌字段不會附加在表單構建器中,因此,您可以通過向表單構建器添加選項來明確指定,因爲我在答案中編寫了您。 – nni6

+0

令牌字段生成爲CSRF保護(請參閱http://symfony.com/doc/current/book/forms.html#csrf-protection)它內置於Sf2中,幾乎肯定不是錯誤的原因。更有可能的是,您已經將一些隱藏字段硬編碼到您的表單模板中,並且該字段不是要綁定到的對象的一部分。 – Acyra

4

此消息也是可能的,如果您添加/在你createFormBuilder改變字段(),然後按刷新在瀏覽器中......

在這種情況下,它的確定發送表格後再次;-)

+1

我的情況正是如此。更改構建器後,我一直在不刷新整個屏幕的情況下執行AJAX提交。 Tnx,+1。 – userfuser

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)); 

    } 
.... 
} 
0

我有同樣的錯誤。

這是因爲我有一個錯誤的名稱爲空的表單。

在HTML中,name屬性應該是這樣的:

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

就這麼簡單。

可能不是每個人的情況,但值得去檢查。

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的一個例子。