如何在Symfony2中过滤表单集合?

时间:2014-10-10 01:22:36

标签: php forms symfony

我将旧的应用程序重写为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')
        ;
    }

    // ...
}

在使用query_builder代替entity时,有没有办法过滤类似于使用collection的代码?是否有任何解决方法?

2 个答案:

答案 0 :(得分:2)

如果整个系统的情况是归档标签没有显示给用户,您可能想要使用全局过滤器,因为它类似于"删除"行为。

你可以看一下这里的代码

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

Softdeletable让您忽略"轻轻删除"实体,虽然你想忽略"存档"标签。这是一个非常先进的例子,因为它使用了注释等等,你需要检查的只是查询类是" Tag"并简单地返回" AND Tag.archived = 0"或者其他什么

答案 1 :(得分:0)

一种方法是将归档标签标记为"软删除",其他选项是制定收集标准。您可以在任务实体中的getTags()方法中应用条件。

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