新表单-嵌入表单集合-Symfony2

New forms - embedding a collection of forms - Symfony2

本文关键字:表单 集合 -Symfony2 新表单      更新时间:2023-09-26

我正在做与这里解释的相同的事情:http://symfony.com/doc/current/cookbook/form/form_collections.html

但在我的情况下,我想添加新的"标签"不是手动点击链接,而是自动添加。我给我的模板一个包含项目的数组,对于每个项目,我想添加一个新的表单——项目的数量应该等于表单的数量。

如果可能的话,我更喜欢这样的解决方案:

{% for i in items %}
    {{ i.name }} {{ form_widget(form.tags[loop.index0].name) }}
{% endfor %}

但是如何在控制器中自动创建对象呢?它告诉我没有索引为1的对象,是的-没有,但没有一种方法可以自动创建它们,而不需要在我的控制器中创建例如10个相同类型的空对象吗?:(


我想的另一件事是这样的:

{% for i in items %}
 <ul class="orders" data-prototype="{{ form_widget(form.orders.vars.prototype)|e }}">
{{ i.name }} and here should be a field from the form, for example tag.name
 </ul>
{% endfor %}

我建议食谱中给出的js应该改成这样,但我不擅长js,我的尝试没有起到作用。

我试着把这个放在循环中:

<script>
   addTagForm(collectionHolder);
</script>

这个在一个.js文件中:

var collectionHolder = $('ul.orders');
jQuery(document).ready(function() {
   collectionHolder.data('index', collectionHolder.find(':input').length);
   function addTagForm(collectionHolder) {
    var prototype = collectionHolder.data('prototype');
    var index = collectionHolder.data('index');
    var newForm = prototype.replace(/__name__/g, index);
    collectionHolder.data('index', index + 1);
    var $newFormLi = $('<li></li>').append(newForm);
}
});

假设您的主类有addTag($tag)方法,您可以向它添加不同的"new"标记。

课堂任务

public function addTag($tag){
    $this->tags[]=$tag;
    return $this;
}

在控制器中(假设此处有10个标签)

$task=new Task();
for($i=0;i<10;i++){
   $task->addTag(new Tag());
}
$form->setData($task);

在您的视图中

{% for tag in form.tags %}
 <ul class="orders">
    <li>{{ form_widget(tag.name) }}</li>
 </ul>
{% endfor %}

如果你不需要手动点击,你可以删除JavaScript部分。