2013-10-06 35 views
7

Ich habe ein Formular mit formBuilder in Symfony erstellt. Ich füge den Formulareingaben einige grundlegende Stile hinzu, indem ich ein externes Stylesheet verwende und die Tag-ID referenziere. Das Formular wird korrekt gerendert und verarbeitet Informationen korrekt.Symfony 2 Dieses Formular sollte keine zusätzlichen Felder enthalten

Aber es gibt eine unerwünschte ungeordnete Liste mit einem Listenelement mit dem folgenden Text: This form should not contain extra fields.

ich eine wirklich harte Zeit habe diese Mitteilung loszuwerden. Ich habe mich gefragt, ob jemand mir helfen kann, zu verstehen, warum es mit meiner Form gerendert wurde und wie man es entfernen kann?

Vielen Dank im Voraus!

-Controller

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

$form->handleRequest($request); 

Zweig Ausgang (Form ausgegeben und verarbeitet korrekt

This form should not contain extra fields. 

Rendered 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

mögliches Duplikat von [Symfony2: loswerden "Dieses Formular sollte keine zusätzlichen Felder enthalten"] (http://stackoverflow.com/questions/8475999/symfony2-get-rid-of-this-form-should-not -contain-extra-fields) – falinsky

Antwort

9

Es scheint mir, dass Sie wegen des Tokens, das Problem haben Wenn dies der Fall ist, versuchen Sie, Optionen zu createFormBuilder() hinzuzufügen:

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

Um das zusätzliche Feld Verwendung dieser Code in der Steuerung herausfinden, wo Sie die Anfrage bekommen:

$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

Danke für die Antwort, ich werde es versuchen. Warum wird das Tokenfeld an erster Stelle generiert und warum ist es ein Problem? – AnchovyLegend

+0

Ich weiß nicht, welches Feld in Ihrem Fall extra ist, Sie können das sehr einfach herausfinden. Zusätzliche Felder bedeuten, dass es in der Anfrage einige Felder gibt, die es im Formular-Generator nicht gibt. Und so bildet die Formbindung diesen Fehler. Möglicherweise ist das Token-Feld standardmäßig nicht im Formular-Generator angehängt. Sie können dies also explizit angeben, indem Sie Optionen zum Formular-Generator hinzufügen, wie ich es in der Antwort geschrieben habe. – nni6

+0

Das Token-Feld wird als CSRF-Schutz generiert (siehe http://symfony.com/doc/current/book/forms.html#csrf-protection) Dies ist in Sf2 integriert und ist mit ziemlicher Sicherheit nicht die Ursache des Fehlers. Wahrscheinlich haben Sie ein verstecktes Feld in Ihrer Formularvorlage fest codiert, und dieses Feld ist nicht Teil des Objekts, an das Sie binden. – Acyra

4

Diese Nachricht ist auch möglich, wenn Sie hinzugefügt/geändert Felder in Ihrer createFormBuilder() und drücken Sie refresh in Ihrem Browser ...

in diesem Fall ok es ist nach der Form noch einmal zu senden ;-)

+1

Mein Fall genau ... Nachdem ich den Builder geändert hatte, habe ich die AJAX-Übertragung durchgeführt, ohne den gesamten Bildschirm zu aktualisieren. Tnx, +1. – userfuser

0

ich in diesen Fehler lief, als eine mehrstufiges Form zu schaffen.

Wenn das Formular für Schritt 1 übergeben wird, enthält $ request-> request das Array acme_mybundle_myform. Dies führte zu einem Überprüfungsfehler und verhinderte, dass die Felder Zurück, Weiterleiten und Formular korrekt ausgefüllt wurden. Ganz zu schweigen von "dieses Formular, das keine Zusatzfelder enthalten soll"

Ich habe das dank dem Code von nni6 entdeckt.

Die Lösung in meinem Fall in der Steuerung war:

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

ich den gleichen Fehler hatte.

Es war, weil ich ein Formular hatte, das aus Versehen einen NULL-Namen hatte.

Im HTML würde das Namensattribut wie folgt aussehen:

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

So einfach ist das.

Könnte nicht für alle der Fall sein, aber es lohnt sich zu überprüfen.

1

Ich habe die gleiche Nachricht, während mehrere Formulare auf der gleichen Seite haben. Es stellte sich heraus, dass Symfony für alle von ihnen standardmäßig den Namen "form" hat.Statt createFormBuilder zu verwenden, können Sie den Namen des Formulars ändern, Konflikte zu vermeiden

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

https://stackoverflow.com/a/13366086/1025437 für ein Beispiel siehe verwenden.