Наблюдаемые вами наблюдения согласуются со следующим ...
Когда ваша форма создается, она добавляет поля с именами
mission_edit[options][0][tagname]
mission_edit[options][0][prix]
mission_edit[options][1][tagname]
mission_edit[options][1][prix]
mission_edit[options][2][tagname]
mission_edit[options][2][prix]
и, когда вы добавляете два других параметра,он добавляет:
mission_edit[options][0][tagname]
mission_edit[options][0][prix]
mission_edit[options][1][tagname]
mission_edit[options][1][prix]
, а затем вы отбрасываете первый вариант, оставляя вас (включая исходные параметры!)
mission_edit[options][0][tagname]
mission_edit[options][0][prix]
mission_edit[options][1][tagname]
mission_edit[options][1][prix]
mission_edit[options][2][tagname]
mission_edit[options][2][prix]
mission_edit[options][1][tagname]
mission_edit[options][1][prix]
, и так как php всегда будет перезаписыватьдубликаты имен var ... вы перезаписываете свой второй вариант (с индексом 1
) новым параметром.
Вы должны проверить это, посмотрев на DOM. Если мое предположение верно, то вы «умно» пропустили определенную часть вашей формы в своих шаблонах веток, где создаются оригинальные элементы, которые, вероятно, вне <ul>
, что приводит к index
Счетчик ul
должен быть 0
, и соответственно перезаписывать элементы.
Честно говоря, я не люблю использовать определенную строку кода из примера Symfony - которую вы также используете - дляИменно по этой причине строка кода выглядит следующим образом:
$collectionHolder.data('index', $collectionHolder.find(':input').length);
, поскольку она использует неочевидный набор предположений, в частности: ваша форма имеет по крайней мере один тип входного полячто может быть и не так! (например, редактируемые + много js), и для вашего примера важно, чтобы все существующих потомков были помещены в держатель коллекции , чего вы не делаете. Чтобы быть справедливым, пример Symfony, где это показано, абсолютно работает, поскольку предположения там справедливы.
Вместо * я бы использовал (* означает удаление другой строки кода!)
<ul class="options"
data-prototype="{{ form_widget(edit_form.options.vars.prototype)|e('html_attr') }}"
data-index="{{ edit_form.options.children|length }}"> {# <- this is the important part!! #}
{# I would also add the existing children here, but there may be reasons not to! #}
</ul>
, потому что он правильно устанавливает индекс на количество детей, которое должно быть.