我正在使用Symfony 2.7創建一個ToDo列表。該Form
包含列表名稱和簡單的文本字段的items
集合:Symfony表單 - 重新排序/排序CollectionType元素
class TodoType extends AbstractType {
public function getName() {
return 'todo_list';
}
public function setDefaultOptions(OptionsResolverInterface $resolver) {
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\TodoList',
));
}
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('name', 'text', array(
'label' => 'Name',
...
))
->add('create', 'submit', array(
'label' => 'Save',
...
));
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$todoList = $event->getData();
$form = $event->getForm();
$form
->add('items', 'collection', array(
'type' => 'todo_list_item_type',
'allow_add' => true,
'allow_delete' => true,
//'by_reference' => false,
'data' => ($todoList != null ? $todoList->getItems() : null),
));
});
}
}
}
這工作得很好。該項目陣列包括在使用「陣列式」的名字形式:
<form ...>
...
<ul class="sortable">
<li>
<input id="todo_list_items_0_name" class="item-name form-control" type="text" value="Shopping" placeholder="Name" required="required" name="todo_list[items][0][name]">
</li>
<li>
<input id="todo_list_items_1_name" class="item-name form-control" type="text" value="Wash car" placeholder="Name" required="required" name="todo_list[items][1][name]">
</li>
...
<ul>
現在我想用jQuery Sortable Plugin進行重新排序。這工作正常。用戶可以按他喜歡的方式重新排序項目。但是,這不會影響項目的存儲順序。
我認爲這個問題是顯而易見的:的排序插件只改變DOM
,而項目名稱中的項目,其中包括他們的數組索引的位置,保持不變。因此,Item0在提交表單時仍然有index = 0
,不管它在列表中的新位置。
有沒有解決方案來解決這個問題?我發現的唯一解決方案是聽取排序插件的stop
事件(一旦重新排序完成後觸發),並使用一些JavaScript手動查找/替換字段名稱中的索引編號。這當然會起作用,但對字段名稱的更改會很脆弱。例如,如果未來版本的Symfony將使用some_field_name_0
而不是some_field_0_name
,則替換代碼將不再工作。
另一種解決方案是,將Item
類擴展爲附加字段sortOrder
,並將該信息作爲隱藏字段包含在表單中。我仍然需要使用JS手動更新這個索引,但至少我會對格式有更多的控制。
但是我想知道沒有更簡單的方法。排序集合類型沒有什麼特別的。所以也許有一個開箱即用的解決方案?
謝謝!用重新設置索引號時很容易識別的一些自定義內容替換'__name__'是個不錯的選擇。我已經使用原型動態地添加新的項目到表單中,我可以在這一步中輕鬆地更改'__name__'的值。不過,我不明白這是如何工作的項目已經存在,因此與表單加載。我對這些價值/物品沒有任何影響。 –
以您找到的解決方案,重新命名字段,以便將正確的順序「發送」給Symfony,它爲您提供了一個生成新名稱的模板。因此,如您所述,使您的解決方案免受Symfony升級/更改。 – romaricdrigon