Я много пробовал, но не могу заставить это работать.
Я использую форму с CollectionType (ChoiceType) в Symfony 4. В моей форме вы можете добавлять детей (буквально дети - маленькие молодые люди :) - это поле выбора возраста).
Для этого я добавил одного ребенка по умолчанию.
В строке формы я хочу использовать идентификаторы, метка et c с текущим номером ребенка. например, я хочу, чтобы метка каждого дочернего элемента была похожа на «Child 1», «Child 2» и т. д.
Сначала код: ChildField в FormType
->add('childs', CollectionType::class, [
'allow_add' => true,
'prototype' => true,
'entry_type' => ChoiceType::class,
'entry_options' => [
'choices' => [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],
],
'data' => [
1 => 0,
]
]);
Мой шаблон для строка поля
<div class="form-group row" id="childsupport_child_{{child_number}}_formgroup">
<div class="col-sm-12" id="childsupport_child_{{child_number}}_toplabel"><b>{% trans %}childsupport.child{% endtrans %} {{child_number}}</b></div>
<div class="col-sm-8" id="childsupport_child_{{child_number}}_label" for="childsupport_childs_{{child_number}}">{% trans %}childsupport.childAge{% endtrans %}</div>
<div class="col-sm-2">
{{ form_widget(childField) }}
</div>
{% if child_number > 1 %}
<div class="col-sm-1" id="childsupport_child_{{child_number}}_delete"><span class="btn btn-danger" onclick="delete_child({{child_number}})">X</span></div>
{% endif %}
</div>
Как видите, я хочу использовать переменную {{child_number}} в этом шаблоне. Я использую шаблон через макрос.
[...]
{% import _self as formMacros %}
[...]
{% macro printChildRow(childField, counter) %}
{% include 'childsupport.child.html.twig' with {'childField': childField, counter} %}
{% endmacro %}
[...bla bla form starts, other field get printed...]
<div class="js-child-wrapper" data-prototype="{{formMacros.printChildRow(childsupport_form.childs.vars.prototype, childsupport_form.childs|length+1)|e('html_attr') }}"
data-index="{{ childsupport_form.childs|length }}"
></div>
{% for childField in childsupport_form.childs %}
{% set counter = ( counter | default(0) ) + 1 %}
{{ formMacros.printChildRow(childField, counter) }}
{% endfor %}
[...bla bla submit button, form ends...]
Я пытаюсь передать текущую длину коллекции + 1 в качестве счетчика.
И наконец js.
function add_child(){
var wrapper = $('.js-child-wrapper');
var prototype = wrapper.data('prototype');
var index = wrapper.data('index');
var newChild = prototype.replace(/__name__/g, index+1);
$(newChild).insertAfter( "#childsupport_child_"+index+"_formgroup" );
wrapper.data('index', index + 1);
var i;
for (i = 0; i <= index; i++) {
$('#childsupport_child_'+i+'_delete').hide();
}
}
Это работает впервые. childsupport_form.childs | length + 1 равно 2, и второй дочерний элемент добавляется правильно. Но тогда это больше не работает.
Так что у меня сложилось впечатление, что childsupport_form.childs | length не является значением Dynami c, которое изменяется в процессе добавления CollectionFields.
Что мне нужно вместо этого передать в качестве второй переменной для прототипа в этой строке?
<div class="js-child-wrapper" data-prototype="{{formMacros.printChildRow(childsupport_form.childs.vars.prototype, childsupport_form.childs|length+1)|e('html_attr') }}"
data-index="{{ childsupport_form.childs|length }}"
></div>
Или я совершенно не прав?
Заранее спасибо!