2014-10-10 79 views
0

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

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标签?是否有任何解决方法?

+0

为什么不使用query_builder direclty到TagType中,传递Task id(可选参数?)。我不确定我是否理解这个问题corretty顺便说一句。 – DonCallisto 2014-10-10 07:07:50

+0

你可以显示'TagType'吗? – frumious 2014-10-10 07:08:00

+0

@DonCallisto这很简单 - 使用上面的设置,在窗体中可以看到所有标签。我想排除集合中的一些标记(即'SELECT * FROM tags WHERE archived = false',而不是'SELECT * FROM tags')。你能发表一个你的想法的例子吗? – tftd 2014-10-10 10:17:09

回答

2

如果整个系统的情况下,归档标签不会显示给用户,您可能需要使用全局过滤器,因为它与“可删除”行为类似。

你可以看一下这里的代码

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

Softdeletable让你忽略“轻声删除”的实体,而要忽略“归档”标签。这是一个相当先进的例子,因为它使用注释等,你需要检查的只是如果查询的类是“标记”,并简单地返回“AND Tag.archived = 0”或任何其他

+0

今天早些时候我研究的时候看到了这个。不过,我想知道,如果有内置的symfony方式,但我现在不想。感谢你的回答! – tftd 2014-10-10 10:22:47

+1

另一件事是手动过滤PRE_SET_DATA表单事件上的数据。集合小部件应该只是简化给出的数据,它不是表单的工作来过滤已用于编辑的实体中的数据 – 2014-10-10 10:42:08

0

一种方法是标记存档标记为“软删除”,其他选项是制定收集标准。您可以在Task实体的getTags()方法中应用条件。

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

我认为这是不正确的,您不应该在实体中保留这样的逻辑,肯定不是在字段的明显获取者 – 2014-10-10 12:22:22

+0

如果你有一对多的关系,并且让我们说1000个相关的标签(arhived和non-archived),那么getTags()方法会返回1000个标签,这显然不是什么你会想要做的。我只是这样做,当我需要限制数据和标准永不改变时。另一个选择是编写另一个方法getArchivedTags()... – tomazahlin 2014-10-10 13:13:45

+0

不幸的是,这个解决方案不适用于我,因为它正好是您提到的1000个相关标签的情况。如果我只有几个标签,这可能是一种解决方法。 :) – tftd 2014-10-10 13:31:15