2017-11-21 5 views
0

FormEvents에 문제가 있습니다. UserType에 필드 PersonnelType이있는 두 개의 엔티티 User 및 Personnel (fonction, statut)이 있습니다. 필드의 속성이 statut의 값에 따라 동적으로 채워지 길 원합니다.양식 이벤트로 동적으로 채워지는 필드

이를 위해, 나는 문서처럼 FormEvent을 사용하는 말 :

PersonnelType 클래스 :

<?php 

namespace UserBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 
use Symfony\Bridge\Doctrine\Form\Type\EntityType; 
use Doctrine\ORM\EntityRepository; 
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 

use Symfony\Component\Form\FormEvent; 
use Symfony\Component\Form\FormEvents; 
use Symfony\Component\Form\FormInterface; 

class PersonnelType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     #$cod_cmp = $options['cod_cmp']; 
     $builder->add('fonction', ChoiceType::class, array('attr' => array('class' => 'UserBundle:Fonction')))    
       ->add('statut', ChoiceType::class, array(
           'choices' => array(
            'Administratif' => 'admi', 
            'Professeur' => 'prof',         
           ), 
           'preferred_choices' => array('prof'), 

           )); 




      $formModifier = function (FormInterface $form, $statut) { 

       $form->add('fonction', EntityType::class, array(
          'class'  => 'UserBundle:Fonction', 
          'choice_label' => 'nom', 
          'query_builder' => function (EntityRepository $er) use($statut) { 
           $qb = $er->createQueryBuilder('Fonction'); 
           $qb->where('Fonction.statut = :statut')->setParameter('statut', $statut) 
            ->orWhere('Fonction.statut = :no_statut')->setParameter('no_statut', ''); 

           $qb->orderBy('Fonction.nom', 'ASC'); 
           return $qb; 
          } 

        )); 

       }; 

      $builder->get('statut')->addEventListener(
       FormEvents::POST_SUBMIT, 
       function (FormEvent $event) use ($formModifier) {     

        $formModifier($event->getForm()->getParent(), $event->getForm()->getData()); 
       } 
      ); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'UserBundle\Entity\Personnel', 

     )); 

     $resolver->setRequired(['cod_cmp']); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getBlockPrefix() 
    { 
     return 'userbundle_personnel'; 
    } 
} 

UserType을 클래스 :

<?php 

namespace UserBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 
use FOS\UserBundle\Util\LegacyFormHelper; 
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 
use Symfony\Component\Form\FormEvent; 
use Symfony\Component\Form\FormEvents; 
use Symfony\Component\Form\FormInterface; 
use Doctrine\ORM\EntityRepository; 
USE Symfony\Component\Form\FormError; 
use Symfony\Bridge\Doctrine\Form\Type\EntityType; 
use UserBundle\Entity\User; 

class UserType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    {#die($options['cod_cmp']); 
     $builder->add('personnel', PersonnelType::class, 
         array('required' => false, 
           'label' => 'Nouveau Enseignant/Administratif', 
           'cod_cmp' => $options['cod_cmp']        
          )) 
       ->add('username', TextType::class, array('label' => 'Login'))    
       ->add('email', TextType::class, array('label' => 'Adresse e-mail')) 
       ->add('Enregistrer',  SubmitType::class);   
    } 


    /** 
    * {@inheritdoc} 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'UserBundle\Entity\User', 
      'cod_cmp' => null, 
     )); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getBlockPrefix() 
    { 
     return 'userbundle_user'; 
    } 
} 

PersonnelController.php

공공 기능 addPersonnelAction ($ request 요청) {

 $userManager = $this->get('fos_user.user_manager'); 
     $user = $userManager->createUser(); 

     $form = $this->createForm(UserType::class, $user); 




     if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) { 


      $em = $this->getDoctrine()->getManager('app'); 

      $personnel = $user->getPersonnel(); 

      $fonction = $personnel->getFonction()->getNom(); die($fonction); 

      $statut = $personnel->getStatut(); 

      $em->persist($personnel); 
      $em->flush(); 

      $encoder_service = $this->get('security.encoder_factory'); 
      $encoder = $encoder_service->getEncoder($user); 
      $encoded_pass = $encoder->encodePassword($user->getPassword(), $user->getSalt()); 
      $user->setPassword($encoded_pass); 

      $userManager->updateUser($user); 

      return $this->redirectToRoute('user_login_success');      
     } 

     return $this->render('UserBundle:Prof:addProf.html.twig', array(
           'form' => $form->createView(), 

    )); 
} 

statut의 값을 변경하면 필드 기능이 채워지지 않습니다. 불행히도, 인터넷 검색 몇 시간 후, 난 여전히 붙어 있어요.

주셔서 감사합니다 도와주세요 form events documentation에 명시된 바와 같이

+1

https://symfony.com/doc/3.3/form/dynamic_form_modification.html – habibun

+0

링크를 제공해 주셔서 감사합니다. 나는 문서에서 말한 것을 따라 갔지만 불행히도 그것은 작동하지 않았다. – Banach

답변

1

, 추가하거나 FormEvents::POST_SUBMIT 이벤트에서 폼에 필드를 제거 할 수 없습니다에 많은. FormEvents::SUBMIT을 청취하고 이에 따라 코드를 편집해야합니다.

+0

답변 해 주셔서 감사합니다. 나는 POST_SUBMIT를 SUBMIT로 바꿨다. 그러나 아무것도 바뀌지 않았습니다. 법정의 가치가 변하면, 명부는 비어 있습니다. 첫 번째 메시지에 모든 코드를 게시했다고 생각합니다. 내가 뭔가 잊었 니? – Banach

관련 문제