在TrainingType.php中创建表单:
January-Margin February-Margin March-Margin AvgMargin
43.111 0.00 0.00 43.111
57.2897 0.00 0.00 57.2897
55.5352 56.8987 0.00 56.2169
在树枝上
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('trainer', EntityType::class, [
'class' => 'AppBundle:Trainer',
'choices' => $training->trainer_list ?? null,
'label'`enter code here` => 'seminar.trainer.form.trainer.label',
'placeholder' => 'form.trainer.placeholder',
'required' => false,
]);
$builder->addEventListener(FormEvents::PRE_SET_DATA, [$this, 'onPreSetData']); // update 'trainer'
$builder->addEventListener(FormEvents::PRE_SUBMIT, [$this, 'onPreSubmit']); // update 'trainer'
}
javascript(测试):
{% if field == 'trainer' %}
{{ form_row(attribute(form, field), {'id': 'trainer'}) }}
{% endif %}
Visualization 它目前未显示任何可选选项,因为即使在服务器的ajax调用发送了“ foo”,它也将返回结果。
所以我的问题是如何将“ oninput”或“ onchange”侦听器放在图像上的搜索字段中。当我开始输入内容时,应该通过ajax调用从服务器获取更新的选择列表,并立即在下拉列表中将其替换。
我什至没有选择搜索字段。 The choice list should be updated while typing 'foo'上Symfony的文档完全没有帮助,因为所有这些示例事件仅在实际选择内容时才会触发,而不仅仅是在键入搜索词时触发。
奖金,尽管我想我有一个方法来解决这个问题,只是使用javascript重新格式化条目,但我希望能够将每个选项显示为“姓,名-标题-价格€”,而不是“ Symfony本身使用的LastName,FirstName”(培训师实体的__toString()方法)。所以我想,我想让Symfony针对此特定表单行使用不同于__toString()的方法。
答案 0 :(得分:0)
“解决方案”是先等待下拉列表打开,然后将oninput侦听器附加到输入字段。
<script>
$(document).ready(() => {
function trainer_changed() {
let input = event.target;
jQuery.ajax({
url: '{{ path('trainer_select_ajax') }}',
type: 'GET',
data: {
search: input.value
},
success: function (trainers) {
let trainer = $('#trainer')[0];
trainer.options.length = 1; // reset all options, except for the default
trainers.forEach((tr, idx) => {
trainer[idx+1] = new Option(tr.name, tr.id);
});
}
});
}
function select_opened() {
let trainercontainer = $('select2-container select2-container--default select2-container--open');
if (trainercontainer) {
let trainerinput = trainercontainer.prevObject[0].activeElement; // input field
trainerinput.oninput = trainer_changed;
}
}
$('#select2-trainer-container').click(select_opened);
});
</script>
要立即更新渲染的下拉菜单,请使用
$('input.select2__field').trigger('change');