Php 如何在Symfony2中筛选表单集合?

Php 如何在Symfony2中筛选表单集合?,php,forms,symfony,Php,Forms,Symfony,我正在将一个旧应用程序重写到Symfony2,我有点卡住了。应用程序具有TaskType和TagsType。TaskType表单具有TagType的集合。某些标记可能已存档,即Tagarchived=true。如果是这种情况,则在您尝试编辑任务时,表单中不应显示已存档的标记 class TaskType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $o

我正在将一个旧应用程序重写到Symfony2,我有点卡住了。应用程序具有TaskType和TagsType。TaskType表单具有TagType的集合。某些标记可能已存档,即Tagarchived=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')
        ;
    }

    // ...
}

当使用实体而不是集合时,是否有类似于使用查询生成器的方法来过滤标记?是否有任何解决方法?

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

您可以在这里查看代码


Softdeletable允许您忽略软删除的实体,而您希望忽略归档的标记。这是一个非常高级的示例,因为它使用注释等,所以您只需要检查查询的类是否为Tag,并简单地返回和Tag.archived=0或其他任何内容,一种方法是将归档的标记标记标记为软删除,另一种方法是制定收集条件。您可以在任务实体的getTags方法中应用这些条件

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

为什么不在标记类型中使用query\u builder direclty,传递任务id可选参数?。顺便说一句,我不确定我是否正确理解了这个问题。你也可以显示标记类型吗?@DonCallisto这很简单-通过上面的设置,你可以看到所有标记。我想排除集合中的一些标记,即从标记中选择*,其中存档=false,而不是从标记中选择*。你能举个例子说明你的想法吗?我今天早些时候在研究的时候看到了这个。不过,我想知道是否有一种内置的symfony方式,但我想目前还没有。谢谢你的回答!另一件事是手动过滤PRE_SET_data form事件上的数据。收集小部件应该只是显示给定数据,表单的工作不是过滤用于编辑的实体中已经存在的数据。我认为这是不正确的,您不应该在实体中保留这样的逻辑,当然不在字段的明显getter中如果你有一对多的关系,比如说1000个相关的标记已归档和未归档,那么getTags方法在这种情况下将返回1000个标记,这显然不是你想要做的事情。我只在需要限制数据和标准永远不会改变时才这样做。另一个选择是编写另一个方法getArchivedTags…不幸的是,这个解决方案对我来说不起作用,因为它正是您提到的1000个相关标记的情况。如果我只有几个标签的话,这本可以作为一个解决办法好的,请记住,用50多个映射到字段的对象渲染表单,结果对我来说非常慢,需要几秒钟。我可以想象。但在我的情况下,我只有大约10-15个对象不是软删除的,所以一切都应该正常工作。谢谢你的通知!: