2014-11-25 1 views
2

모음 필드 유형이있는 양식이 있습니다. 엔티티 필드 유형에 대해 할 수있는대로 필터링하고 싶습니다. 그러나 솔루션을 찾지 못했습니다.심포니 필터 컬렉션 필드 유형과 같은 필드 유형

나는 비슷한 질문을했지만 지금까지는 만족할만한 답을 찾지 못했습니다.

$builder 
    ->add('userIngredients', 'collection', array(
      'type' => new UserImportedIngredientType($this->userIngredients), 
      'query_builder'=>$this->queryBuilder, 
     )) 
; 

양식 리스너 이벤트를 사용하여 객체 속성을 기반으로 일부 요소를 제외 할 수 있습니까? 어떻게?

이 컬렉션은 isImported 속성이 true로 설정된 경우 사용자가 변경할 수 있도록하려는 userIngredients를 나타내며 따라서 query_builder 솔루션을 검색합니다.

답변

1

우물이있다, 나는 일반 양식을 구축 나는이 연결되지 않은 단순한 뭔가를 할 수 생각 부모 엔티티로

경우 이것은 도움이 될 사람 :

class UserImportedIngredientType extends AbstractType 
{ 

    protected $userIngredients; 
    protected $userImportedIngredients; 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     foreach ($this->userImportedIngredients as $userImportedIngredient) 
     { 
      /** 
      * @var $userImportedIngredient UserIngredient 
      */ 
      $builder 
       ->add($userImportedIngredient->getId(), 'genemu_jqueryselect2_entity', array(
         'query_builder'=>$this->userIngredients, 
         'class' => 'AppBundle:FoodAnalytics\UserIngredient', 
         'multiple' => false, 
         'label' => $userImportedIngredient->getName(), 
         'required'=>false, 
         'mapped' => false, 
         'data' => $userImportedIngredient 
        )) 
      ; 
     } 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'appbundle_foodanalytics_user_imported_ingredient'; 
    } 

    public function __construct($userIngredients, $userImportedIngredients) 
    { 
     $this->userIngredients=$userIngredients; 
     $this->userImportedIngredients=$userImportedIngredients; 
    } 
} 
0

내가 아는 한 콜렉션이 not have the query_builder option 이렇게하면 안된다. formType의 4 줄로하려는 작업을 해독하기 어렵습니다.

unsuppported query_builder를 제외하고 코드는 괜찮아 보이며 이미 userIngredients를 생성자에 전달하고 있습니다.

필자는 이것을 필터링해야 할 경우 컬렉션 유형에서하지 말고 다른 곳에서해야합니다.

편집 : 비록 초에

, 당신은 잘못된 장소에서 컬렉션을 필터링하기 위해 노력하고 있습니다. 기본 컬렉션이 아니라에서 :

class UserImportedIngredientType extends AbstractType { 
    function __construct($userIngredients) { 
    // Do your stuff 
    } 

    function buildForm(FormBuilderInterface $builder, array $options) { 
    // Add here your entity with the query_filter option :) 

    } 
} 

확인의 다른 항목이 SO 컬렉션을 통해, many of them

1

내가 심포니의 상단에 추가 소나타 내 경우에는 다음과 같이 그것을 해결. 내가 한 일은 '데이터'매개 변수에 특별히 교리를 묻는 쿼리 결과를 제공하는 것입니다. (저장소> getQuery을 $ queryBuilder-을 반환 () -> getResult를();)

/** @var MyEntityRepository $myEntityRepository */ 
$myEntityRepository = $this->getEntityManager()->getRepository(MyEntity::class); 
/** @var MyEntity[] $myEntities */ 
$myEntities = $myEntityRepository->findBySomeCriteriaFilter(
    $parameter, Constants::specificConstant 
); 

$formMapper->add(
    // html name= 
    'myEntityProperty', 
    \Symfony\Component\Form\Extension\Core\Type\CollectionType::class, 
    [ 
     // specific form for MyEntity 
     'entry_type' => new Form\MyEntity\MyEntityType(), 
     'allow_add' => true, 
     'label' => false, 
     'entry_options' => [ 
      'label' => false 
     ], 
     // the filtered array of entities from doctrine repository query above 
     'data' => $myEntities, 
     ] 
); 

대신 사용 sonata_type_model_list이 나는 것 같아요. 또한 sonata_type_model을 필터링하려면 EntityType을 대신 사용하고 Closure와 함께 'query_builder'옵션을 사용하고 엔티티 배열 대신 queryBuilder를 반환하십시오. 이것은 모두 매우 모순되며 심포니와 소나타를 전혀 사용하지 않는 것이 좋습니다.