2017-09-22 14 views
0

私は以前の4回のドロップダウンで行った選択に応じてドロップダウンリストをフィルタリングしたいと思います。私のフォームタイプは、以下のようになります。symfonyフォームのサブミット後にクエリービルダーでドロップダウン値を変更する

class DocumentDeactivationType extends AbstractType { 

    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('status', 'entity', array(
     'class' => 'DocumentBundle:Status', 'property' => 'name', 
     'choice_label' => 'translationkey', 'label' => 'Status', 
     'expanded' => false, 'multiple' => true, 'required' => false, 
     'translation_domain' => 'Documents', 
     'choice_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::PRE_SUBMIT, function (FormEvent $event) use ($builder) 
     { 
     $form = $event->getForm(); 
     $data = $event->getData(); 
     $markets = $data['markets']; 
     $status = $data['status']; 
     $type = $data['type']; 
     $airlines = $data['airlines']; 
    $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, $status, $type, $airlines){ 
     return $er->createQueryBuilder('e') 
     ->where('e.markets IN (:markets)') 
     ->andWhere('e.status IN (:status)') 
     ->andWhere('e.airlines IN (:airlines)') 
     ->andWhere('e.products IN (:products)') 
     ->setParameter('markets', $markets) 
     ->setParameter('status', $status) 
     ->setParameter('airlines', $airlines) 
     ->setParameter('type', $type); 
     }, 
    )); 
    }); 
} 
    public function getName() 
    { 
     return 'document_deactivation'; 

    } 
    } 

私はそれは明らかだかどうかはわからない:「documentlist」ドロップダウンがすべての文書実体からの値と、私はPRE_SUBMITのEventListenerを通じて達成しようとしているとそこに既にあります4つの他のドロップダウンからの選択に依存してその値を更新する種類のもの。 4つのドロップダウンには「適用」ボタンがありますので、Ajaxリクエストは必要ありませんが、Post/PreSubmitイベントは必要ありませんか? 問題:

  1. 「フィルタ」ドロップダウンからいくつかの値を選択すると、 'markets'を除いて、私は、おそらく、$ markets = $ data ['markets'] - >という行のために、「市場のための未定義のインデックス」というエラーが出るので、私がここで欲しいのは、それらのすべてを選択することを強いられていません。
  2. ドキュメントリストのドロップダウンを更新しても機能しません。私は、クエリビルダーが何もしていないと思う。しかし、私はそれが私のFormEventと何か関係があるのか​​、多分フォームにドロップダウンを追加する方法があるのか​​どうかはわかりません。すべてが私の小枝ファイルにレンダリングする方法

:追加)

{% block filterContent %} 
    {{ form_start(form) }} 
    {{ form_row(form.type) }} 
    {{ form_row(form.status) }} 
    {{ form_row(form.markets)}} 
    {{ form_row(form.airlines)}} 
    <input type="submit" class="btn-primary btn btn-xs" value="Apply Filter" /> 

    <br clear="all" /> 
{% endblock %} 

{% block content %} 

{{ form_label(form.documentlist) }} 
{{ form_widget(form.documentlist) }} 
{{ form_end(form) }} </br> 

<div class="row"> 
    {% include 'AppBundle::HelpSubmitButton.html.twig' with { 'buttonName': 'label.submit'|trans } %} 
</div> 
{% endblock content %} 
+0

2) 'PRE_SUBMIT'が' submit'アクションの直前に起こるので、 'documentlist'のすべての値を使用するので、AJAX経由でリストを更新する必要があると思います。 – user742736

答えて

0

1 $市場の周りの文が

if (isset($data['markets'])) {$markets = $data['markets'];} 

そして

'query_builder' => function (EntityRepository $er) use ($markets, $status, $type, $airlines) { 
    $query = $er->createQueryBuilder('e') 
    ->where('e.status IN (:status)') 
    ->andWhere('e.airlines IN (:airlines)') 
    ->andWhere('e.products IN (:products)') 
    ->setParameter('markets', $markets) 
    ->setParameter('status', $status) 
    ->setParameter('airlines', $airlines) 
    ->setParameter('type', $type); 
    }; 

    if (isset($data['markets'])) { 
    $query->andWhere('e.markets IN (:markets)') 
    } 

2)私は信じている場合PRE_SUBMITが起こるので、あなたはAJAX経由でリストを更新する必要がありますj submitアクションの前に、documentlistのすべての値を使用する必要があります。

+0

ありがとう@ user742736、私はあなたが言ったように行うためにajax関数を設定しようとしましたが、要求を処理するために私のコントローラに送るデータは空です。どのように動作するかの例を教えてください。 – sonja

関連する問題