2016-08-11 1 views
1

AdminBundle \ Formular \ CoreForm.php hinzufügen:Symfony3 Ajax Formular Extra-Feld

class CoreForm extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     /** 
     Ajax Call : onSubmitAdd 
     */ 
     $builder->add('set_core_doctrine_metadata_type', ChoiceType::class, array(
      'label' => 'Doctrine Metadata Cache Driver', 
      'choices' => $this->getDoctrineAccelerator(), 
      'empty_data' => 'array', 
      'choice_translation_domain' => false, 
      'attr' => array(
       'onSubmitAdd' => 'set_core_doctrine_metadata_host|set_core_doctrine_metadata_port' 
      ) 
     )) 

     /** 
     Ajax Response : onSubmitAdd 
     */ 
     $doctrineModify = function (FormInterface $form){ 
      $metaDataDriver = $form->get('set_core_doctrine_metadata_type')->getData(); 

      if (!$form->isValid()) { 
       if ($metaDataDriver == 'memcache' || $metaDataDriver == 'memcached'){ 
        $form->add('set_core_doctrine_metadata_host', TextType::class, array(
         'label' => 'Doctrine Metadata Cache Host', 
        )) 
        ->add('set_core_doctrine_metadata_port', IntegerType::class, array(
         'label' => 'Doctrine Metadata Cache Port', 
        )); 
       } 
      } 
     }; 

     $builder->addEventListener(FormEvents::SUBMIT, function (FormEvent $event) use ($doctrineModify){ 
      $form = $event->getForm(); 
      $doctrineModify($form); 
     }); 
    } 
} 

Formulartyp: Formular reibungslos funktioniert. Aber es erlaubt kein neues Feld.

jQuery Ajax-Code:

$(document).on('change', '[onSubmitAdd]', function() { 
    // Get Form 
    form = $(this).closest('form'); 

    // Send Data 
    var data = {}; 
    data[$(this).attr('name')] = $(this).val(); 

    // Html Block 
    formGroup = $(this).closest('.form-group'); 
    getFormGroup = $(this).attr('onSubmitAdd'); 
    getFormGroup = getFormGroup.split('|'); 

    $.ajax({ 
     url: form.attr('action'), 
     type: form.attr('method'), 
     data: data, 
     success: function (data) { 
      addContent = ""; 

      // Get Items 
      $.each(getFormGroup, function (index, item) { 
       dt = $(data.content.body).find('.' + item).html(); 
       if (typeof dt != 'undefined'){ 
        addContent = addContent + '<div class="form-group">'+ dt +'</div>'; 
       } 
      }); 

      // Replace or Add 
      if (formGroup.next().hasClass('onSubmitAdded')){ 
       formGroup.next().html(addContent); 
      } else { 
       formGroup.after('<div class="onSubmitAdded">'+ addContent +'</div>'); 
      } 
     } 
    }); 
}); 

Problem: Ajax System funktioniert reibungslos. Aber wenn das Formular abgeschickt wird, wird der Fehlercode „Diese Form soll nicht enthalten zusätzliche Felder“

Antwort

1

der Lage sein, die zusätzliche vorgelegten Entscheidungen zu akzeptieren, müssen Sie sie in Ihrem Formular hinzufügen auf den PRE_SUBMIT Event:

class FooType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('tag', ChoiceType::class, array('choices'=>array())) 
     ; 

     $builder->addEventListener(
      FormEvents::PRE_SUBMIT, 
      function(FormEvent $event){ 
       // Get the parent form 
       $form = $event->getForm(); 

       // Get the data for the choice field 
       $data = $event->getData()['tag']; 

       // Collect the new choices 
       $choices = array(); 

       if(is_array($data)){ 
        foreach($data as $choice){ 
         $choices[$choice] = $choice; 
        } 
       } 
       else{ 
        $choices[$data] = $data; 
       } 

       // Add the field again, with the new choices : 
       $form->add('tag', ChoiceType::class, array('choices'=>$choices)); 
      } 
     ); 
    } 
} 

um zu vermeiden, "Notice: Array to string conversion" Denken Sie alle Feld Array-Parameter in neuem Feld in $ Form zu kopieren, zum Beispiel, wenn Sie 'multiple' => true in $ builder 'Tag' steckte es in $ form haben 'tag' zu