2016-02-25 17 views
5

Sto inviando un modulo e gestendolo in Sylius ResourceController che invia il modulo e lo convalida.Errore modulo Symfony 2 "Questo modulo non dovrebbe contenere campi aggiuntivi." all'atto dell'invio di un modulo

questa è la forma in situ:

<tr> 
    <form method="post" action="{{ path('backend_course_row_update', { 
'courseeId' : course.id, 'id' : row.id }) }}" novalidate> 
    {{ form_widget(form.channel) }} 
    {{ form_widget(form.name) }} 
    {% for size in form.sizes %} 
     {{ form_row(size) }} 
    {% endfor %} 
    {{ form_row(form._token) }} 
    <td align="right" style="width: 140px;"> 
     <button class="btn btn-primary" type="submit"> 
      <i class="glyphicon glyphicon-save"></i>Save 
     </button> 
    </td> 
    </form> 
</tr> 

la "forma" qui è un CourseGuideRowType, che assomiglia a questo:

/** 
* {@inheritdoc} 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('channel', 'channel_choice', array(
      'required' => false 
     )) 
     ->add('name', 'text') 
     ->add('sizes', 'course_guide_row_sizes', array('numColumns' => $options['numColumns'])) 
    ; 
} 

CourseGuideRowSizesType sembra poi così:

/** 
* {@inheritdoc} 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    for ($i = 0; $i < $options['numColumns']; $i++) { 
     $builder->add($i, 'text', array('required' => 'false')); 
    } 
    $builder->addEventListener(
     FormEvents::PRE_SUBMIT, 
     function (FormEvent $event) use ($options) { 
      $form = $event->getForm(); 
      for ($i = 0; $i < $options['numColumns']; $i++) { 
       if (empty($form->get($i)->getData())) { 
        $form->remove($i, 'text'); 
       } 
      } 
     } 
    ); 
} 

Tuttavia, quando invio il modulo e scarico gli errori in questo modo:

$form->submit($request, !$request->isMethod('PATCH'))->getErrors()

ottengo:

"This form should not contain extra fields." 
     #messageParameters: array:1 [▼ 
     "{{ extra_fields }}" => "0", "1", "2", "3", "4", "5" 
     ] 
     -extraData: array:6 [▼ 
      0 => "36" 
      1 => "38" 
      2 => "40" 
      3 => "42" 
      4 => "44" 
      5 => "46" 
     ] 

I "dati extra" è i campi "taglie".

Sto facendo qualcosa di evidentemente sbagliato qui?

EDIT Giugno 2017: ora è possibile utilizzare "allow_extra_fields" per sopprimere questo errore. http://symfony.com/doc/current/reference/forms/types/form.html#allow-extra-fields

+0

Generalmente l'errore viene generato quando i dati inviati dall'utente hanno più input di quelli definiti nel modulo. Symfony ha un tipo built-in che fa già ciò che stai cercando di fare manualmente: http://symfony.com/doc/current/reference/forms/types/collection.html. – Karolis

+1

Inoltre non è la soluzione migliore, ma puoi anche consentire campi extra impostando ''allow_extra_fields' => true' sul risolutore opzioni. – nakashu

+1

Nota: l'opzione allow_extra_fields è stata aggiunta in Symfony v2.6 – Munir

risposta

8

L'errore viene generato perché si sta definendo ogni size come form_row, ad es. :

{% for size in form.sizes %} 
    {{ form_row(size) }} // Extra field defined here 
{% endfor %} 

Come indicato nei commenti, si dovrebbe usare il CollectionType o creare e usare il FormType personalizzato nello stesso modo di esso.

Ciò eviterà la necessità di definire manualmente campi aggiuntivi nel modulo e di rimuovere l'errore.

EDIT

@nakashu ha ricordato una soluzione da utilizzare in questo momento.

Basta evitare l'errore aggiungendo il seguente nella vostra CourseGuideRowType:

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'allow_extra_fields' => true, 
    )); 
} 

Ma non ti fa privo di effetti collaterali durante la manipolazione/passaggi vincolanti.

Problemi correlati