如何在Symfony2中筛选表单集合


How would one filter a form collection in Symfony2?

我正在将一个旧的应用程序重写为Symfony2,我有点卡住了。应用程序具有TaskTypeTagsTypeTaskType表单具有TagType的集合。一些标签可能被归档(即Tag#archived=true)。如果是这种情况,则在尝试编辑任务时,不应在表单中显示存档的标记。

class TaskType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add(
                'tags',
                'collection',
                array(
                    'type'         => new TagType(),
                    'allow_add'    => true,
                    'allow_delete' => true,
                    'by_reference' => false,
               )
            )
        ;
    }
    // ...
}

class TagType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
        ;
    }
    // ...
}

当使用entity而不是collection时,是否有类似于使用query_builder的方法来过滤标签?有什么变通办法吗?

如果整个系统都没有向用户显示存档的标记,那么您可能需要使用全局过滤器,因为它类似于"可删除"行为。

你可以在这里查看代码

https://github.com/Atlantic18/DoctrineExtensions/blob/master/lib/Gedmo/SoftDeleteable/Filter/SoftDeleteableFilter.php

Softdeletable允许您忽略"软删除"的实体,而您希望忽略"存档"的标记。这是一个非常高级的例子,因为它使用了注释等,您只需要检查被查询的类是否为"Tag",并简单地返回"and Tag.archived=0"或任何

一种方法是将存档的标签标记为"软删除",另一种选择是制定收集条件。您可以在Task实体中应用getTags()方法中的条件。

public function getTags()
{
    return $this->tags->matching(Criteria::create()->where(Criteria::expr()->eq('archived',true)));
}