2017-09-21 11 views
0

私は市場、タイプ、および航空会社のためにフィルタリングしているフィルタフォームを持っています。送信時に、選択した値の後に別のドロップダウンリスト(ドキュメントリスト)をフィルタリングしたいと思います。したがって、post_submitイベントリスナを作成しました(次のコードで見られるように値をダンプしました)。しかし、クエリビルダとフィルタのデータを使ってドキュメントリストの値を更新しようとすると、それは機能しません。任意のアイデア:ポストサブミットデータを持つ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

関連する問題