所以我的自定義表單型別中的 CollectionType 有問題。當我向集合中添加兩個新表單并正確填寫并提交時。只有最后一個選項被提交。在過去的四個小時里,我一直在努力解決這個問題。
class CustomType extends AbstractType
{
public function buildForm(...)
{
$builder->add(
'collection',
CollectionType::class,
[
'required' => false,
'entry_type' => CustomItemType::class,
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'label' => 'Some label',
'by_reference' => false,
'error_bubbling' => false,
'entry_options' => [
'empty_data' => new CustomItem(),
'by_reference' => false
]
]
);
}
public function configureOptions(...)
{
$resolver->setDefaults(['data_class' => CustomContainer::class]);
}
}
如果您需要更多資訊,請詢問,我會提供。我已經使用 jQuery 和 CollectionType 類提供的原型實作了子表單的添加。我按照 symfony.com 上的教程進行操作,此時我對前進的方向不知所措。感謝您提供任何幫助。
我確實對表單進行了一些除錯,并且資料已正確提交,但是當它對表單物件進行水合時,它會為添加的每個條目傳遞表單中的最后一項。
編輯
function addItem(e) {
e.preventDefault();
var collectionSelector = $(this).data('collection-selector');
var list = $(collectionSelector);
var counter = list.data('widget-counter');
var newWidget = list.data('prototype');
var newHtmlElem = newWidget.replace(/__name__/g, counter);
var newElem = $(newHtmlElem);
newElem.on('click', e.data.removeButtonClass, {itemContainerClass: e.data.itemContainerClass}, removeItem);
counter ;
list.data('widget-counter', counter);
var accordianContainer = $(collectionSelector ' ' e.data.collapse);
newElem.appendTo(accordianContainer);
}
$(document).ready(function () {
$('body').tooltip({selector: '.custom-tooltip'});
$('.add-custom-item-btn').click({removeButtonClass: '.remove-custom-item-btn', itemContainerClass: '.custom-item-item', collapse: '#custom-item-accordion'}, addItem);
$('.remove-custom-item-btn').click({itemContainerClass: '.custom-item-item'}, removeItem);
});
這是樹枝模板的片段
{% macro printItem(custom_item, index) %}
<div class="panel panel-default custom-item-item">
<div class="panel-heading" role="tab" id="custom-item-heading-{{ index }}>
<h4 class="panel-title">
<a role="button"
data-toggle="collapse"
data-parent="#custom-item-accordion"
href="#custom-item-collapse-{{ index }}"
hljs-string">"
>
Custom Item
</a>
</h4>
</div>
<div id="custom-item-collapse-{{ index }}"
hljs-string">"
role="tabpanel"
aria-labelledby="custom-item-heading-{{ index }}"
aria-expanded="false"
>
<div hljs-string">">
{{ form_row(custom_item) }}
<button type="button" hljs-string">">
<span hljs-string">" aria-hidden="true"></span>
</button>
</div>
</div>
</div>
{% endmacro %}
{% import _self as formMacros %}
<div hljs-string">">
<div hljs-number">12 form-group">
<button type="button" hljs-string">" data-collection-selector="#custom-container-fields-list">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
</button>
</div>
<div id="custom-container-fields-list"
data-prototype="{{ formMacros.printItem(form.collection.vars.prototype, '__name__') }}"
data-widget-counter="{{ max(form.collection|keys) 1 }}"
>
<div hljs-string">" id="custom-item-accordion" role="tablist" aria-multiselectable="true">
{% for index, custom_item in form.collection %}
{{ formMacros.printItem(custom_item, index) }}
{% endfor %}
</div>
</div>
</div>
編輯 我創建了一個 repo 來演示所有類的這個問題,以便您可以隨意查看它。不,這不是實際代碼,但問題仍然存在。我使用的是 PHP 8.1 和 symfony 5.4,但所有這些都在下面 repo 的 composer.json 檔案中可見。如果有人能提供一些啟示,我將不勝感激。或者如果大家一致認為這是一個錯誤,我會用 symfony 記錄一個錯誤,但我寧愿先確定這一點。
重現問題的回購
uj5u.com熱心網友回復:
您的問題似乎是由您的以下行引起的CustomType:
'empty_data' => new CustomItem(),
由于您已設定empty_data為 的單個實體CustomItem,因此每個新行都將重新使用同一實體。
您還在by_reference上設定為 false CollectionType,這意味著您的類上的 adder 方法正在為每個新行CustomContainer使用相同的實體呼叫 。CustomItem假設您已使用該make:entity命令,則此 adder 方法僅CustomItem在其陣列中不存在相同實體時才添加該物件,這解釋了缺少的專案。
解決方案是為每個新行創建一個新CustomItem實體,如下例所示:
https ://webmozart.io/blog/2015/09/09/value-objects-in-symfony-forms/ (在 下The empty_data Option)
'empty_data' => function (FormInterface $form) {
return new CustomItem();
},
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/523590.html
標籤:php交响乐symfony 形式
