Symfony - Использование длины collectionType в качестве счетчика в шаблоне веточки прототипа не работает - PullRequest
0 голосов
/ 31 марта 2020

Я много пробовал, но не могу заставить это работать.

Я использую форму с 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>

Или я совершенно не прав?

Заранее спасибо!

1 Ответ

0 голосов
/ 31 марта 2020

Временно, я использовал быстрое и грязное решение и клонировал childsupport.child. html .twig в childsupport.child_prototype. html .twig, где я использовал name вместо {{child_number }}.

Итак, я использовал первый шаблон для первоначального создания предопределенных значений коллекции и клонированный для события onClick.

Работает.

Но все же быстро и грязно.

...