【问题标题】:Symfony 4 - Dynamic Generation for Submitted Forms with Select2Symfony 4 - 使用 Select2 动态生成提交的表单
【发布时间】:2019-09-12 09:19:47
【问题描述】:

我正在关注http://symfony.com/doc/current/form/dynamic_form_modification.html#dynamic-generation-for-submitted-forms的教程

我成功地重现了教程,一切正常。但是,当我在我的字段上应用“Select2”时,它不再起作用了。

表格:

class TicketAdminForm extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('Client', EntityType::class, [
                'class' => Clients::class,
                'choice_label' => 'name',
                'label' => "Client",
                'placeholder' => '',
                'attr' => ['data-provider' => 'select2'],
            ])
        ;

        $formModifier = function (FormInterface $form, Clients $client = null) {
            $entity = null === $client ? [] : $client->getEntities();

            $form->add('entity', EntityType::class, [
                'class' => 'App\Entity\Entity',
                'placeholder' => '',
                'choices' => $entity,
                'label' => 'Entité',
                'attr' => ['data-provider' => 'select2'],
            ]);
        };

        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $event) use ($formModifier) {
                // this would be your entity, i.e. Clients
                $data = $event->getData();
                $form = $event->getForm();

                $formModifier($event->getForm(), $data->getClient());
            }
        );

        $builder->get('Client')->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $event) use ($formModifier) {
                // It's important here to fetch $event->getForm()->getData(), as
                // $event->getData() will get you the client data (that is, the ID)
                $client = $event->getForm()->getData();

                // since we've added the listener to the child, we'll have to pass on
                // the parent to the callback functions!
                $formModifier($event->getForm()->getParent(), $client);
            }
        );
    }

树枝:

{{ form_start(form, {'attr': {'class': 'form-horizontal'} }) }}
        <div class="box-body">
            {{ form_row(form.client) }}
            {{ form_errors(form.client) }}
            {{ form_row(form.entity) }}
            {{ form_errors(form.entity) }}
        </div>
        <!-- /.box-body -->

        <div class="box-footer">
            <div class="col-md-offset-2 col-sm-8">

                <button id="dropbutton" class="btn bg-ticketing btn-flat form-control" type="submit">
                    {{ 'Submit the ticket'|trans({}, 'TicketingBundle') }}
                </button>


            </div>
        </div>
        <!-- /.box-footer -->
        {{ form_end(form) }}
    </div>

    <script>
        var $client = $('#ticket_admin_form_client');
        // When client gets selected ...
        $client.change(function() {
            console.log('dans change');
            // ... retrieve the corresponding form.
            var $form = $(this).closest('form');
            // Simulate form data, but only include the selected client value.
            var data = {};
            data[$client.attr('name')] = $client.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 entity field ...
                    $('#ticket_admin_form_entity').replaceWith(
                        // ... with the returned one from the AJAX response.
                        $(html).find('#ticket_admin_form_entity')
                    );
                    // Entity field now displays the appropriate entities.
                }
            });
        });
    </script>

此代码仅在我删除表单中的 'attr' =&gt; ['data-provider' =&gt; 'select2'] 时才有效。

我试过了:

$('#ticket_admin_form_client').on("select2:selecting", function(e) { 
   console.log('test');
});

但它不起作用。

你有解决方案让它与 select2 一起工作吗?

【问题讨论】:

  • “它不起作用(不再)”根本没有帮助。什么是行不通的?浏览器控制台中是否有错误消息?如果是的话,分享它们是明智的。如果不是,您应该真正描述您预期会发生什么,以及确实发生了什么。我们这里几乎没有信息。
  • 当我将'attr' =&gt; ['data-provider' =&gt; 'select2'] 应用于表单中的客户端字段时,$client.change(function () {}); 函数不再起作用。我觉得它是 var $client = $('# ticket_admin_form_client');这是行不通的。我在控制台中没有任何代码
  • 这是有道理的,如果 select2 覆盖 $client.change,在这种情况下,这不是 symfony 问题...我不太了解 select2,但也许 select2 有自己的钩子概念进入更改事件?
  • 无论如何:确保您拥有正确的 id:$client = $('#{{ form.client.vars.id }}'); 应该为您提供选择字段的正确 id,以防在使用其他数据属性渲染时 id 神奇地改变了...... ...

标签: symfony jquery-select2 symfony4 symfony-forms


【解决方案1】:

很简单,在你的 ajax 方法中添加这个:

 $('#ticket_admin_form_entity').select2({});

在方法success 中这样:

// ...

$.ajax({
 // ...
 success: function(html) {
    
     $('#ticket_admin_form_entity').replaceWith(
        $(html).find('#ticket_admin_form_entity')
     );
     
     $('#ticket_admin_form_entity').select2({}); // Add this 
}

// ...

;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    相关资源
    最近更新 更多