2016-02-25 6 views
5

Ich sende ein Formular und handhabe es in der Sylius ResourceController, die das Formular einreicht und validiert. Symfony 2 Formularfehler "Dieses Formular sollte keine zusätzlichen Felder enthalten." Beim Absenden eines Formulars

Dies ist die Form 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> 

Die "Form" ist hier ein CourseGuideRowType, die wie folgt aussieht:

/** 
* {@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 dann wie folgt aussieht:

/** 
* {@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'); 
       } 
      } 
     } 
    ); 
} 

Allerdings, wenn ich das Formular abschicken und die Fehler wie folgt auswerfen:

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

ich:

"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" 
     ] 

Die "zusätzliche Daten" ist die "Größen" ein.

Mache ich hier etwas eklatant falsch?

EDIT Juni 2017: Sie können jetzt 'allow_extra_fields' verwenden, um diesen Fehler zu unterdrücken. http://symfony.com/doc/current/reference/forms/types/form.html#allow-extra-fields

+0

Normalerweise wird der Fehler ausgelöst, wenn vom Benutzer übermittelte Daten mehr Eingaben enthalten, als im Formular definiert sind. Symfony hat einen eingebauten Typ, der bereits das tut, was Sie manuell tun wollen: http://symfony.com/doc/current/reference/forms/types/collection.html. – Karolis

+1

Auch nicht die beste Lösung, aber Sie können auch zusätzliche Felder erlauben, indem Sie 'allow_extra_fields' => true 'im Optionsresolver setzen. – nakashu

+1

Hinweis: Allow_extra_fields Option wurde in Symfony v2.6 hinzugefügt – Munir

Antwort

8

Der Fehler wird ausgelöst, weil Sie jede size als form_row definieren, z. :

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

Wie in den Kommentaren erwähnt, sollten Sie die CollectionType oder erstellen Sie verwenden und Ihre benutzerdefinierte Formtype in der gleichen Art und Weise davon verwenden.

Dies wird die Notwendigkeit vermeiden, zusätzliche Felder in Ihrem Formular manuell zu definieren und BTW entfernen den Fehler.

EDIT

@nakashu hat eine Abhilfe erinnerte im Moment verwendet werden.

vermeiden einfach den Fehler, indem Sie folgende in Ihrer CourseGuideRowType:

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

Aber es nicht, dass Sie bei der Handhabung/Bindungsschritte frei von Nebenwirkungen macht.

Verwandte Themen