1

AdminBundle\Form\CoreForm.php:

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);
        });
    }
}

フォームの種類: スム​​ーズに機能するフォーム。ただし、新しいフィールドは許可されません。

jQuery Ajax コード:

$(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>');
            }
        }
    });
});

問題: Ajax システムは問題なく動作しています。しかし、フォームが送信されると、「このフォームには余分なフィールドを含めないでください」というエラーコードが表示されます

4

1 に答える 1

1

送信された追加の選択肢を受け入れることができるようにするには、それらをPRE_SUBMIT イベントのフォームに追加する必要があります。

 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));
             }
         );
     }
 }

" " を回避するには、すべてのフィールド配列パラメーターをNotice: Array to string conversion$form の新しいフィールドにコピーすること考えてください

于 2016-08-11T09:00:50.633 に答える