私は以前の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イベントは必要ありませんか? 問題:
- 「フィルタ」ドロップダウンからいくつかの値を選択すると、 'markets'を除いて、私は、おそらく、$ markets = $ data ['markets'] - >という行のために、「市場のための未定義のインデックス」というエラーが出るので、私がここで欲しいのは、それらのすべてを選択することを強いられていません。
- ドキュメントリストのドロップダウンを更新しても機能しません。私は、クエリビルダーが何もしていないと思う。しかし、私はそれが私の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 %}
2) 'PRE_SUBMIT'が' submit'アクションの直前に起こるので、 'documentlist'のすべての値を使用するので、AJAX経由でリストを更新する必要があると思います。 – user742736