2013-10-06 15 views
7

Ho creato un modulo utilizzando formBuilder in Symfony. Aggiungo alcuni stili di base agli input del modulo usando un foglio di stile esterno e facendo riferimento all'ID del tag. Il modulo esegue correttamente il rendering e elabora correttamente le informazioni.Symfony 2 Questo modulo non dovrebbe contenere campi aggiuntivi

Tuttavia, emette una lista non ordinata indesiderato con una voce di elenco contenente il testo seguente: This form should not contain extra fields.

Sto avendo un momento davvero difficile sbarazzarsi del presente avviso. Mi stavo chiedendo se qualcuno può aiutarmi a capire perché viene reso con il mio modulo e come rimuoverlo?

Molte grazie in anticipo!

controller

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

$form->handleRequest($request); 

Twig Output (modulo viene emesso e elaborato correttamente

This form should not contain extra fields. 

rendering 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

possibile duplicato di [Symfony2: sbarazzarsi di "Questo modulo non deve contenere campi aggiuntivi"] (http://stackoverflow.com/questions/8475999/symfony2-get-rid-of-this-form-should-not -contain-extra-fields) – falinsky

risposta

9

Mi sembra di avere il problema a causa del token Se è così, prova ad aggiungere opzioni a createFormBuilder():

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

Per scoprire l'uso sul campo in più di questo codice nel controllore, dove si ottiene la richiesta:

$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

Grazie per la risposta, farò un tentativo. Perché il campo token è generato in primo luogo e perché è un problema? – AnchovyLegend

+0

Non so quale campo è extra nel tuo caso, puoi trovarlo molto semplicemente. I campi aggiuntivi indicano che, in base alla richiesta, alcuni campi non sono presenti nel generatore di moduli. E così il binding di form fa questo errore. Il campo token predefinito potrebbe non essere aggiunto nel generatore di moduli, quindi è possibile specificarlo in modo esplicito aggiungendo opzioni al generatore di moduli come ho scritto nella risposta. – nni6

+0

Il campo token è generato come protezione CSRF (vedi http://symfony.com/doc/current/book/forms.html#csrf-protection) Questo è incorporato in Sf2 e non è quasi certamente la causa dell'errore. È più probabile che tu abbia codificato un campo nascosto nel tuo modello di modulo e quel campo non fa parte dell'oggetto a cui sei vincolante. – Acyra

4

Questo messaggio è anche possibile se si è aggiunto/campi cambiato nella tua createFormBuilder() e premere il tasto di aggiornamento nel tuo browser ...

in questo caso è ok dopo l'invio del modulo ;-) nuovo

+1

Il mio caso esattamente .. Dopo aver cambiato il builder, ho continuato a inviare AJAX senza aggiornare l'intero schermo. Tnx, +1. – userfuser

0

mi sono imbattuto in questo errore quando si crea un modulo multi-step.

Quando il modulo del passaggio 1 viene inviato, $ request-> request contiene l'array acme_mybundle_myform. Questo ha creato un errore di convalida e ha impedito il compilare correttamente i campi back, forward e form. Per non parlare di "questo modulo-non-non-contenere-campi-extra"

Ho scoperto questo grazie al codice di nni6.

La soluzione nel mio caso era all'interno del controller:

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

Ho avuto lo stesso errore.

Era perché avevo un modulo che, per errore, aveva un nome NULL.

In HTML, l'attributo name sarebbe simile a questa:

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

Più semplice di così.

Potrebbe non essere il caso per tutti, ma vale la pena di verificare.

1

Ho ricevuto lo stesso messaggio con più moduli sulla stessa pagina. Risulta, symfony ha come valore predefinito il nome 'form' per tutti loro.Invece di usare createFormBuilder, è possibile modificare il nome del modulo per evitare conflitti con

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

Vedere https://stackoverflow.com/a/13366086/1025437 per un esempio.

Problemi correlati