2017-05-11 10 views
0

私がしたいのは、コントローラのcreateFormメソッドに渡されたEntityを使用してEntityTypeフィールドをフィルタリングすることです。symfonyのEntityType入力フィルタのパラメータとしてエンティティを使用する

エンティティが関連している:

従業員( '1')----( '1')ユーザ( 'M')-----( '1')TicketQueue( 'M')を - ---( '1')チケット

ユーザー( 'M')----( '1')チケット私が何をしたいのか

があるために、ticketqueueするチケット関係を使用しています従業員プロファイルを持ち、チケットが割り当てられているキューに割り当てられているユーザーだけにユーザーフィールドをフィルタすることができます。 のみのユーザーに割り当てられたキュー

けど避難所と従業員プロファイルと のみのユーザー:

私はsucessfullyある私の条件のいくつかを満たしている:私はどこ

は、これまでのところ、これはありますTicketQueue = "どこにチケットが割り当てられていても"どこのステートメントでフィルタリングするのか分かりませんでした。

このフォームはチケットのステータスと譲受人(ユーザー)の編集時にのみ使用されます。

Formクラス:

class TicketUpdateType extends AbstractType { 

public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder 
      ->add('assignedto', EntityType::class, array('multiple' => false, 
       'class' => 'AuthBundle\Entity\User', 'placeholder' => 'Select Personel', 
        'query_builder' => function (UserRepository $er) { 
         return $er->createQueryBuilder('u') 
         ->select('u') 
         ->join('u.employee','e') 
         ->join('u.ticketQueues','tq')         
         ->orderBy('u.username', 'ASC');             
        }, 
       'label' => "Assigned To:", 
       'choice_label' => function 
       ($q) { 
        return $q->getEmployee()->getFirstName()." ".$q->getEmployee()->getLastName(); 
       }, 'attr' => array('class' => 'form-control')))     
      ->add('ticketstatus', EntityType::class, array('multiple' => false, 
       'class' => 'TicketBundle\Entity\TicketStatus', 'placeholder' => 'Select Status','label' => "Ticket Status", 'choice_label' => function 
       ($q) { 
        return $q->getName(); 
       }, 'attr' => array('class' => 'form-control')));    
} 

public function configureOptions(OptionsResolver $resolver) { 
    $resolver->setDefaults(array(
     'data_class' => Ticket::class, 
    )); 
} 
} 

EDIT:

フォーム:

class TicketUpdateType extends AbstractType{ 

public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder 

      ->addEventSubscriber(new AddQueueFieldSubscriber())     

      ->add('ticketstatus', EntityType::class, array('multiple' => false, 
       'class' => 'TicketBundle\Entity\TicketStatus', 'placeholder' => 'Select Status','label' => "Ticket Status", 'choice_label' => function 
       ($q) { 
        return $q->getName(); 
       }, 'attr' => array('class' => 'form-control')));    
} 


public function configureOptions(OptionsResolver $resolver) { 
    $resolver->setDefaults(array(
     'data_class' => Ticket::class, 
    )); 
} 
} 

イベント加入:

class AddQueueFieldSubscriber implements EventSubscriberInterface{ 

public static function getSubscribedEvents() 
{ 
    // Tells the dispatcher that you want to listen on the form.pre_set_data 
    // event and that the preSetData method should be called. 
    return array(FormEvents::PRE_SET_DATA => 'preSetData'); 
} 


public function preSetData(FormEvent $event) 
{ 
    $ticket = $event->getData(); 
    $form = $event->getForm(); 
    $queue = $event->getData()->getTicketQueue()->getName(); 

    if ($ticket) { 
     $form->add('assignedto', EntityType::class, array('multiple' => false, 
       'class' => 'AuthBundle\Entity\User', 'placeholder' => 'Select Personel', 
        'query_builder' => function (UserRepository $er) use ($queue){ 
         return $er->createQueryBuilder('u') 
         ->select('u') 
         ->join('u.employee','e') 
         ->join('u.ticketQueues','tq') 
         ->where('tq.name = :queue')   
         ->orderBy('u.username', 'ASC') 
         ->setParameter('queue', $queue);   
        }, 
       'label' => "Assigned To:", 
       'choice_label' => function 
       ($q) { 
        return $q->getEmployee()->getFirstName()." ".$q->getEmployee()->getLastName(); 
       }, 'attr' => array('class' => 'form-control'))); 
    } 
}  
} 
+0

なぜクエリビルダに追加しないでください: - > where( 'u.TicketQueue = 1')? – ahmedbhs

+0

異なるキューを持つ別のチケットに適応することはできますか?問題のチケットと同じキューを持つユーザーのみが表示されます –

+0

複数の参加ステートメントを使用する必要がありますか? $ qb-> select ( 'AuthBundle \ Entity \ User'、 'e') - > join( 'AuthBundle \ Entity \ User'、 'e') - >ここで( 'u.user = s .user ') - > andWhere(' u.TicketQueue = s。TicketQueue ') – ahmedbhs

答えて

1

「何私がしたいのは、EntityTypeフィールドをフィルタリングするためにコントローラのcreateFormメソッドに渡されたEntityを使用することです。あなたの形式でPRE_SET_DATA機能を使用する必要が

symfony doc

この機能は、あなたのフォームを準備することができます。

exemple:

$builder->addEventListener(
     FormEvents::PRE_SET_DATA, 
     function (FormEvent $event) { 
      $form = $event->getForm(); 
      $entity = $event->getData(); 

      if (!$entity->getEnabled()) { 
       $form->remove('validity'); 
      } 
     } 
    ); 

あなたのコントローラ内のエンティティを使用して、フォームを初期化することを忘れないでください:

$form = $this->createForm(TicketUpdateType::class, $yourEntity);

幸運!

+0

これはすごくうまくいった、ありがとう!! –

関連する問題