2017-09-21 9 views
0

J'ai un filtre qui filtre pour les marchés, les types et les compagnies aériennes. Lorsque soumis, j'aimerais qu'une autre liste déroulante (liste de documents) soit filtrée après les valeurs sélectionnées. Par conséquent j'ai créé un eventlistener de post_submit qui fonctionne (j'ai jeté les valeurs comme vous pouvez le voir dans le code suivant). Mais lorsque j'essaie de mettre à jour les valeurs de la liste de documents via un générateur de requête et avec les données de mes filtres, cela ne fonctionne pas. Toutes les idées:Le générateur de requête Symfony avec les données de post-envoi ne change pas les valeurs dans 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'; 
} 

}

Répondre

1

Vous ne pouvez pas changer la forme (ajouter ou supprimer des champs) dans un événement POST_SUBMIT. Mais vous pouvez dans un événement PRE_SUBMIT, donc vous avez juste besoin de changer POST_SUBMIT avec PRE_SUBMIT.

Mais attention, car vos données de formulaire ne seront pas normalisées dans PRE_SUBMIT, vous devrez donc travailler avec des données brutes de votre formulaire (un tableau), ou normaliser manuellement vos données.

+0

Je suis désolé, je n'ai compris que la moitié de votre réponse. Je comprends que je ne peux pas le changer sur POST_SUBMIT donc je l'ai changé en PRE_SUBMIT. Mais qu'en est-il de la partie normalisation? Je ne comprends pas que:/Maintenant avec l'événement PRE_SUBMIT, je reçois toujours les données de mon filtre mais la liste déroulante ne met toujours pas ses valeurs à jour. – sonja

+0

Désolé de vous distrubier à nouveau mais avez-vous d'autres conseils? Je suis toujours coincé sur ça .. – sonja