2014-10-10 34 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