2014-10-10 3 views
0

이전 응용 프로그램을 Symfony2로 다시 쓰고 있는데 조금 갇혀 있습니다. 응용 프로그램은 TaskTypeTagsType입니다. TaskType 양식의 컬렉션은 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') 
     ; 
    } 

    // ... 
} 

대신 collectionentity을 가진 경우 query_builder를 사용하는 것과 비슷 태그를 필터링 할 수있는 방법이 있습니까? 해결 방법이 있습니까?

+0

작업 ID (선택적 매개 변수?)를 전달하여 TagType에 query_builder direclty를 사용하지 않는 이유는 무엇입니까? 나는 correclty btw라는 질문을 이해했는지 확신 할 수 없다. – DonCallisto

+0

'TagType '도 표시 할 수 있습니까? – frumious

+0

@DonCallisto 아주 간단합니다 - 위의 설정으로 모든 태그를 볼 수 있습니다. 컬렉션의 일부 태그 ('SELECT * FROM tags'대신 'SELECT * FROM tags WHERE archived = false')를 제외하고 싶습니다. 아이디어의 예를 게시 할 수 있습니까? – tftd

답변

2

보관 된 태그가 사용자에게 표시되지 않는 전체 시스템의 경우 "삭제 가능"동작과 유사하므로 전역 필터를 사용하는 것이 좋습니다.

현재

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

코드를 볼 수 있습니다 Softdeletable는 무시 할 동안, 엔티티를 "부드럽게 삭제"무시 할 수 태그를 "보관". 어노테이션 등을 사용하기 때문에 매우 진보 된 예제입니다. 질의 된 클래스가 "태그"이고 단순히 "AND Tag.archived = 0"또는 무엇이든 반환하는 경우에만 확인해야합니다.

+0

오늘 일찍 조사하면서 이걸 보았습니다. 그래도 symfony가 내장되어 있다면 궁금합니다.하지만 지금은 그렇지 않습니다. 답변 해주셔서 감사합니다! – tftd

+1

또 하나는 PRE_SET_DATA 양식 이벤트의 데이터를 수동으로 필터링하는 것입니다. 컬렉션 위젯은 givent 데이터를 잠그는 것으로되어 있습니다. 해당 엔터티에 이미 존재하는 데이터를 필터링하는 것은 폼의 작업이 아닙니다. –

0

한 가지 방법은 아카이브 된 것으로 표시하는 것입니다 태그는 "소프트 삭제됨"으로, 다른 옵션은 수집 기준을 만드는 것입니다. Task 엔티티에서 getTags() 메소드의 기준을 적용 할 수 있습니다.

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

이 말이 맞지 않을 것입니다. 엔티티에 이러한 논리를 유지하면 안됩니다. 확실히 현장 getter가 분명하지 않은 경우 –

+0

일대 다 관계가 있고 1000 개의 관련 태그 (arhived 및 non-archived)를 사용한다고 가정하면이 경우 getTags() 메서드는 1000 개의 태그를 반환하지만 분명히 무언가가 아닙니다 너는하고 싶을 것이다. 데이터를 제한해야 할 때와 기준이 절대로 바뀌지 않을 때만이 작업을 수행합니다. 또 다른 옵션은 다른 메소드 getArchivedTags()를 작성하는 것입니다 ... – tomazahlin

+0

불행히도이 솔루션은 당신이 언급 한 1000 개의 관련 태그가있는 경우 정확하게 작동하기 때문에 나에게 도움이되지 않습니다. 이 태그를 몇 개만 사용하면이 문제를 해결할 수 있습니다. :) – tftd

관련 문제