我的做法与此处所述的相同:http://symfony.com/doc/current/cookbook/form/form_collections.html
但在我的情况下,我想通过点击链接手动添加新的“标签”,但是会自动添加。我给我的模板一个带有项目的数组,对于每个项目,我想添加一个新表格 - 项目数量应该等于表格数量。
如果有可能,我更喜欢这样的解决方案:
{% for i in items %}
{{ i.name }} {{ form_widget(form.tags[loop.index0].name) }}
{% endfor %}
但是如何在控制器中自动创建对象呢?它告诉我没有index = 1的obeject,是的 - 没有,但是没有办法自动创建它们而不需要在我的控制器中创建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);
}
});
答案 0 :(得分:0)
假设您的主类具有addTag($ tag)方法,您可以为其添加不同的“新”标记。
在课程任务
中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部分。