2016-02-25 29 views
5

Bir form gönderir ve formu gönderir ve onaylayan Sylius ResourceController'da ele alıyorum.Symfony 2 Form hatası "Bu form ek alanlar içermemelidir." Bir form gönderirken

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

"form" Burada bir CourseGuideRowType olduğunu şöyle:

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

/** 
* {@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 sonra şuna benzer

Bu

yerinde şeklidir

Ancak, formu gönderdiğimde ve aşağıdaki gibi hataları döktüğümde:

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

alıyorum:

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

"ekstra veri" "boyutları" alanları olduğunu.

Burada bariz bir şekilde yanlış bir şey yapıyorum?

DÜZENLEME Haziran 2017: Artık bu hatayı bastırmak için 'allow_extra_fields' özelliğini kullanabilirsiniz. Eğer örneğin bir form_row, her size tanımlayan çünkü http://symfony.com/doc/current/reference/forms/types/form.html#allow-extra-fields

+0

Normalde kullanıcı tarafından gönderilen veriler formda tanımlanmış olandan daha fazla girdi olduğunda hata atılır. Symfony, halihazırda el ile yapmaya çalıştığınız şeyi yapan yerleşik bir türe sahiptir: http://symfony.com/doc/current/reference/forms/types/collection.html. – Karolis

+1

Ayrıca en iyi çözüm değil, ayrıca seçenek çözümleyicide 'allow_extra_fields '=> true' ayarlayarak ek alanlara da izin verebilirsiniz. – nakashu

+1

Not: allow_extra_fields seçeneği Symfony v2.6 – Munir

cevap

8

hata atılır : Açıklamalarda belirtildiği gibi

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

, sen CollectionType kullanabilir veya oluşturabilir ve bunun aynı şekilde özel FormType kullanmalıdır.

Bu, formunuzdaki ek alanları el ile tanımlama gereksinimini ortadan kaldıracak ve BTW hatayı kaldıracaktır.

DÜZENLEME

@nakashu an kullanılacak geçici bir çözüm hatırlattığı.

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

Ama kullanımı/bağlayıcı adımları sırasında yan etkileri özgür yapmaz:

Sadece senin CourseGuideRowType aşağıdaki ekleyerek hatayı önlemek.