【发布时间】:2019-09-12 09:19:47
【问题描述】:
我成功地重现了教程,一切正常。但是,当我在我的字段上应用“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' => ['data-provider' => 'select2'] 时才有效。
我试过了:
$('#ticket_admin_form_client').on("select2:selecting", function(e) {
console.log('test');
});
但它不起作用。
你有解决方案让它与 select2 一起工作吗?
【问题讨论】:
-
“它不起作用(不再)”根本没有帮助。什么是行不通的?浏览器控制台中是否有错误消息?如果是的话,分享它们是明智的。如果不是,您应该真正描述您预期会发生什么,以及确实发生了什么。我们这里几乎没有信息。
-
当我将
'attr' => ['data-provider' => '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