2017-09-21 16 views
0

시장, 유형 및 항공사를 필터링하는 필터 양식이 있습니다. 제출할 때 다른 값 (문서 목록)을 선택한 값 다음에 필터링하고 싶습니다. 그래서 나는 post_submit eventlistener를 만들었다. (다음 코드에서 볼 수있는 것처럼 값을 버렸다.) 그러나 쿼리 작성기를 통해 문서 목록 값을 업데이트하려고 할 때 내 필터의 데이터로 업데이트하려고하면 작동하지 않습니다. 어떤 아이디어 :게시물 제출 데이터가있는 Symfony 쿼리 빌더가 EventListener의 값을 변경하지 않습니다.

<?php 

namespace DocumentBundle\Form\Document; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Doctrine\ORM; 
use Doctrine\ORM\EntityRepository; 
use Symfony\Bundle\FrameworkBundle\Controller; 
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; 
use Symfony\Component\Form\FormEvent; 
use Symfony\Component\Form\FormEvents; 
use Symfony\Bridge\Doctrine\Form\Type\EntityType; 
use DocumentBundle\Form\Document\DocumentFilterType; 

class DocumentDeactivationType extends DocumentFilterType { 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 

    $builder 
    ->add('type', 'choice', array('choices' => array(
     'document_types.contract' => 1, 
     'document_types.general'=>2, 
     'document_types.goodwill_policy'=>3, 
     'document_types.pricesheet'=>4, 
     'document_types.yq_update'=>5, 
     'document_types.contract_addendum'=>6), 
     'choices_as_values' => true, 'label' => 'label.types', 
     'expanded' => false, 'multiple' => true, 
     'label' => 'label.type', 'required' => false, 
     'translation_domain' => 'Documents')) 

    ->add('airlines', 'entity', array(
     'class' => 'AppBundle:Airline', 'property' => 'id', 
     'query_builder' => function (EntityRepository $er){ 

     return $er->createQueryBuilder('a') 
      ->addOrderBy('a.id', 'ASC'); 
     }, 
     'choice_value' => 'id', 
     'choice_label' => 'id', 'label' => 'label.airlines', 
     'expanded' => false, 'multiple' => true, 'required' => false, 
     'translation_domain' => 'Documents')) 

    ->add('markets', 'entity', array(
     'class' => 'AppBundle:Market', 'property' => 'id', 
     'query_builder' => function (EntityRepository $er){ 
      return $er->createQueryBuilder('m') 
      ->addOrderBy('m.id', 'ASC'); 
      }, 
     'choice_value' => 'id', 
     'choice_label' => 'id', 'label' => 'label.markets', 
     'expanded' => false, 'multiple' => true, 'required' => false, 
     'translation_domain' => 'Documents')) 

    ->add('documentlist', EntityType::class, array(
     'class' => 'DocumentBundle:Document', 
     'property' => 'name', 
     'expanded' => false, 'multiple' => true, 
     'label' => 'label.document_list', 
     'empty_value' => "Select document", 
     'required' => false, 
     'mapped' => false, 
     'translation_domain' => 'Documents')); 

    $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) use ($builder) 
     { 
     $form = $event->getForm(); 
     $data = $event->getData(); 
     $markets = $data['markets']; 
     $type = $data['type']; 
     $airlines = $data['airlines']; 
     dump($markets, $type); 
$builder 
    ->add('documentlist', EntityType::class, array(
     'class' => 'DocumentBundle:Document', 
     'property' => 'name', 
     'expanded' => false, 'multiple' => true, 
     'label' => 'label.document_list', 
     'empty_value' => "Select document", 
     'required' => false, 
     'mapped' => false, 
     'translation_domain' => 'Documents', 
     'query_builder' => function (EntityRepository $er) use ($markets, $type, $airlines){ 
     return $er->createQueryBuilder('e') 
     ->where('e.markets = :markets') 
     ->andWhere('e.airlines IN (:airlines)') 
     ->andWhere('e.products IN (:products)') 
     ->setParameter('e.markets', $markets) 
     ->setParameter('e.airlines', $airlines) 
     ->setParameter('e.type', $type); 
     }, 
    )); 
    }); 
} 
public function getName() 
{ 
    return 'document_deactivation'; 
} 

}

답변

1

당신은 POST_SUBMIT 이벤트에 양식 (추가 또는 제거 필드)를 변경할 수 없습니다. 하지만 PRE_SUBMIT 이벤트에서 할 수 있으므로 POST_SUBMITPRE_SUBMIT으로 변경하면됩니다.

양식 데이터가 PRE_SUBMIT으로 정규화되지 않으므로주의해야합니다. 양식 (배열)의 원시 데이터로 작업하거나 수동으로 데이터를 정규화해야합니다.

+0

귀하의 답변 중 절반 만 이해하고있어 죄송합니다. POST_SUBMIT에서 PRE_SUBMIT으로 바꿀 수 없으므로 이해합니다. 그러나 정상화 부분은 어떻습니까? 나는 그것을 이해하지 못한다 :/PRE_SUBMIT 이벤트와 함께, 나는 여전히 내 필터에서 데이터를 얻지 만 드롭 다운은 여전히 ​​그 값을 업데이트하지 않는다. – sonja

+0

다시 파헤 치기를 유감스럽게 생각하지만 추가 조언이 필요합니까? 나는 아직도 그것에 붙어있다 .. – sonja