Symfony2实体集合,从select中添加新内容

时间:2014-08-07 19:26:41

标签: symfony select collections prototype entities

我从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建议)。

感谢您的帮助!

1 个答案:

答案 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,
            ))