我从Symfony2开始,如果我的问题非常简单,请原谅我:
我有两个实体:
新闻(id,标题,标签)
标签(id,新闻)
我有多对多的关系
新闻的示例代码:
/**
* @ORM\ManyToMany(targetEntity="Tag", inversedBy="news", cascade={"persist", "remove"}))
* @ORM\JoinTable(name="news_tags")
*/
private $tags;
标签示例代码:
/**
* @ORM\ManyToMany(targetEntity="News", mappedBy="tags")
*/
private $news;
我有一个TagType来向DB添加标签,只是简单的
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('name', 'text');
}
NewsType
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('title', 'text', array(
'attr'=>array(
'maxlength'=>60
)
))
->add('tags', 'collection', array(
'type'=>new TagType(),
'allow_add'=>true,
'allow_delete'=>true,
'by_reference'=>false,
))
;
}
新闻形式HTML示例:
<table class="tags table table-hover">
<thead>
<tr>
<th>name</th>
<th>action</th>
</tr>
</thead>
<tbody data-prototype="{% filter escape %}{% include 'XAdminBundle:Form:news_tags_prototype.html.twig' with {'form': form.tags.vars.prototype} %}{% endfilter %}">
{% for tag in form.tags %}
<tr>
<td>
{{ tag.vars.data.name }}
{{ form_widget(tag.name, {'attr': {'class': 'hidden'} }) }}
</td>
<td class="action">
</td>
</tr>
{% endfor %}
</tbody>
</table>
news_tags_prototype.html.twig
<tr>
<td>{{ form_widget(form.name, {'attr': { 'class': 'form-control' } }) }}</td>
<td class="action"></td>
</tr>
在这种情况下,当我单击添加标签时,我有一个文本输入,我可以添加全新的标签,但是在单击添加标签后我想要的唯一一个得到一个选择框,其名称为来自DB的标签权利。 如何做到这一点抛出js和prototype(由http://symfony.com/doc/current/cookbook/form/form_collections.html建议)。
感谢您的帮助!
答案 0 :(得分:0)
在TagType中,你应该使用类似的东西:
$builder->add('name', 'entity', array(
'class' => 'SomeBundle:Tag'));
这将确保原型呈现为下拉列表而不是文本元素。希望有所帮助。
编辑:我刚刚意识到你可能需要现有的TagType才能将标签添加到数据库中。在这种情况下,使用上面建议的更改创建一个名为TagDropdownType的新文件,然后在NewsType中更改:
->add('tags', 'collection', array(
'type'=>new TagType(),
'allow_add'=>true,
'allow_delete'=>true,
'by_reference'=>false,
))
为:
->add('tags', 'collection', array(
'type'=>new TagDropdownType(),
'allow_add'=>true,
'allow_delete'=>true,
'by_reference'=>false,
))