2016-06-23 18 views
2

symfonyのドキュメントhttp://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#dynamic-generation-for-submitted-formsに従って、依存フォームの動的生成を行いました。symfony送信されたフォームの動的生成が機能しない

型クラス:

class EtlType extends AbstractType 
{ 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('outTable', EntityType::class, array(
       'class'=>'TableBundle:TableList', 
       'placeholder' => '', 
       'choice_label'=>'tableName', 
       'attr' => array('class' => 'form-control', 'style' => 'margin-bottom:10px; width:180px'))); 

     $formModifier = function (FormInterface $form, TableList $tableList = null) { 
      $fields = null === $tableList ? array() : $tableList->getFields(); 
      $form->add('outField', EntityType::class, array(
       'class'  => 'TableBundle:TableDesc', 
       'placeholder' => '', 
       'choices'  => $fields, 
      )); 
     }; 

     $builder->addEventListener(
      FormEvents::PRE_SET_DATA, 
      function (FormEvent $event) use ($formModifier) { 
       $data = $event->getData(); 
       $formModifier($event->getForm(), $data->getOutTable()); 
      } 
     ); 

     $builder->get('outTable')->addEventListener(
      FormEvents::POST_SUBMIT, 
      function (FormEvent $event) use ($formModifier) { 
       $outTable = $event->getForm()->getData(); 
       $formModifier($event->getForm()->getParent(), $outTable); 
      } 
     ); 
    } 
} 

小枝テンプレート:

    {{ form_start(form) }} 
        {{ form_row(form.outTable) }} 
        {{ form_row(form.outField) }} 
        {{ form_widget(form) }} 
        <input class="button button1 right" type="submit" value="Create" onclick="return confirm('Confirm Creation?')"/> 
        {{ form_end(form) }} 
        <script> 
         var $outTable = $('#etl_outTable'); 
         $outTable.change(function() { 
          // ... retrieve the corresponding form. 
          var $form = $(this).closest('form'); 
          // Simulate form data, but only include the selected outTable value. 
          var data = {}; 
          data[$outTable.attr('tableName')] = $outTable.val(); 
          // Submit data via AJAX to the form's action path. 
          $.ajax({ 
           url : $form.attr('action'), 
           type: $form.attr('method'), 
           data : data, 
           success: function(html) { 
            // Replace current position field ... 
            $('#etl_outField').replaceWith(
              // ... with the returned one from the AJAX response. 
              $(html).find('#etl_outField') 
            ); 
           } 
          }); 
         }); 
        </script> 

私は、文書の手順に従ってくださいと思います。しかし、outFieldでは、常に選択するものはありません。誰かが間違っていることを指摘できますか?本当にありがとう。

+0

多分私はJavaScriptが動作していないと思われますか?私はこれに新しい、いくつかの助けていただきありがとうございます。 –

+0

問題を把握しましたか?私は別の問題を抱えています。 'Catchable Fatal Error:AcmeBundle \ Form \ ScheduleType :: PIE10Bundle \ Form \ {closure}()に渡される引数1は、AcmeBundle \ Form \ Symfony \ Component \ Form \ Formのインスタンスでなければなりません。 \ Formに与えられ、/var/www/Acme/api/src/AcmeBundle/Form/ScheduleType.phpで61行目に呼び出され、 ' は何か考えていますか? – inckka

答えて

0

フォーム全体を送信しないでください。これを試してください:

$outTable.change(function() { 
    // ... retrieve the corresponding form. 
    var $form = $(this).closest('form'); 
    // Simulate form data, and include the whole form. 
    var data = new FormData($form); 
    // Submit data via AJAX to the form's action path. 
    $.ajax({ 
     url : $form.attr('action'), 
     type: $form.attr('method'), 
     data : data, 
     success: function(html) { 
     // I'd rather replace the whole form 
     $('#etl_outField').replaceWith(
     // ... with the returned one from the AJAX response. 
     $(html).find('#etl_outField') 
    ); 
     } 
    }); 
}); 
関連する問題