2016-02-25 9 views
5

私はフォームを提出し、それをSylius ResourceControllerで処理してフォームを提出し、それを検証する。Symfony 2フォームエラー "このフォームには余分なフィールドが含まれてはいけません。"フォームを提出するとき

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

"フォーム" ここCourseGuideRowTypeで、次のようになります:

/** 
* {@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は、このようになります

この

は、その場でフォームです

しかし、私はフォームを提出し、このようなエラーをダンプする:

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

私が取得:

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

"余分なデータは、" "サイズ" フィールドです。

私はここで大騒ぎしていますか?

編集:2017年6月:このエラーを抑制するために 'allow_extra_fields'を使用できるようになりました。 http://symfony.com/doc/current/reference/forms/types/form.html#allow-extra-fields

+0

通常、ユーザーが送信したデータの入力がフォームに定義されているものより多い場合、エラーがスローされます。 symfonyには、手動でやろうとしていることを既に行っている組み込み型があります:http://symfony.com/doc/current/reference/forms/types/collection.html。 – Karolis

+1

また、最適な解決策ではありませんが、オプションのリゾルバで ''allow_extra_fields' => true'を設定することで余分なフィールドを許可することもできます。 – nakashu

+1

注:symfony v2.6でallow_extra_fieldsオプションが追加されました – Munir

答えて

8

sizeform_rowと定義しているため、エラーがスローされます。 :コメントで述べたように

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

、あなたがCollectionTypeを使用するか、または作成し、それを同じようにカスタムにformTypeを使用する必要があります。

これにより、フォームに余分なフィールドを手動で定義する必要がなくなり、BTWがエラーを取り除きます。

EDIT

@nakashuは、現時点で使用される回避策を思い出しました。

ちょうどあなたのCourseGuideRowTypeに次のように追加することでエラーを回避:

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

をしかし、それは取り扱い/結合工程中の副作用のあなたが自由になりません。

関連する問題