2017-09-21 65 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

对不起,再次distrub你,但你有任何进一步的建议?我仍然坚持这一点.. – sonja