2017-03-12 18 views
0

symfonyフォームに苦労しています。私はユーザーのためのフォームを構築したい。このユーザーは、製品(nom、description)を収集するarraycollectionフィールドです。Symfony 3:フォームフォームデータベースにチェックボックスを追加する

フォームビルダーに渡された各製品のチェックボックスを作成するフォームを作成したいとします。実はそれだけでラベルなしで入力フィールドを作成した...ここに私のUserTypeクラスのコードです:ここで

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

    $builder->add('nom')->add('prenom')->add('mail')->add('tel1')->add('tel2', TextType::class, array('required' => false)) 
     ->add('username')->add('password', PasswordType::class) 
     ->add('groupe', ChoiceType::class, array(
      'choices' => array('Administrateur' => 'ROLE_SUPER_ADMIN', 'Gérant' => 'ROLE_ADMIN', 'Opérateur' => 'ROLE_USER'), 
      'expanded' => true, 
     )) 
     ->add('produits', CollectionType::class, array(
      'entry_type' => ProduitType::class 
     )) 
    ; 
} 

/** 
* {@inheritdoc} 
*/ 
public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => User::class 
    )); 
} 

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

は私ProduuctTypeコードです:ここで

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

    $builder->add('nom')->add('prenom')->add('mail')->add('tel1')->add('tel2', TextType::class, array('required' => false)) 
     ->add('username')->add('password', PasswordType::class) 
     ->add('groupe', ChoiceType::class, array(
      'choices' => array('Administrateur' => 'ROLE_SUPER_ADMIN', 'Gérant' => 'ROLE_ADMIN', 'Opérateur' => 'ROLE_USER'), 
      'expanded' => true, 
     )) 
     ->add('produits', CollectionType::class, array(
      'entry_type' => ProduitType::class 
     )) 
    ; 
} 

/** 
* {@inheritdoc} 
*/ 
public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => User::class 
    )); 
} 

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

は私UserControllerでコードです:

public function ajouterAction(Request $request){ 

    $this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Unable to access this page!'); 
    $em = $this->getDoctrine()->getManager(); 
    $produits = $em->getRepository('ProduitBundle:Produit')->findAll(); 
    $societes = $em->getRepository('SocieteBundle:Societe')->findAll(); 
    $user = new User(); 
    foreach ($produits as $produit) { 
     $user->getProduits()->add($produit); 
    } 
    $form = $this->createForm('GestCoupons\UserBundle\Form\UserType', $user); 
    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($user); 
     $em->flush($user); 

     return $this->redirect('dashboard_admin'); 
    } 

    return $this->render('user/new.html.twig', array(
     'user' => $user, 
     'form' => $form->createView(), 
    )); 
} 

おかげさまで、お世話になりました。

+0

は私が考えるあなたのUserTypeクラスを貼り付けますあなたの "ProduuctType"クラスとして。 "ProduuctType"が表示されるように質問を更新できますか? – ehymel

+0

こんにちはehymel、あなたの助けに感謝します。私は正しいオブジェクト(ユーザー)を渡していましたが、EntityTypeを使用していませんでした。今それは動作します;)。 – THaulbert

答えて

1

CollectionTypeの代わりにSymfony \ Bridge \ Doctrine \ Form \ Type \ EntityTypeを使用する必要があります。あなたのUserType

use Symfony\Bridge\Doctrine\Form\Type\EntityType; 
use AppBundle\Entity\Produit; 

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

    $builder 
     ->add('nom') 
     ->add('prenom') 
     ->add('mail') 
     ->add('tel1') 
     ->add('tel2', TextType::class, array(
      'required' => false 
     )) 
     ->add('username') 
     ->add('password', PasswordType::class) 
     ->add('groupe', ChoiceType::class, array(
      'choices' => array(
       'Administrateur' => 'ROLE_SUPER_ADMIN', 
       'Gérant' => 'ROLE_ADMIN', 
       'Opérateur' => 'ROLE_USER' 
      ), 
      'expanded' => true, 
     )) 
     ->add('produits', EntityType::class, array(
      'class' => Produit::class, 
      'multiple' => true, 
      'expanded' => true, 
      'label' => 'nom' //If you don't have a __toString method in your Produit Entity 
     )) 
    ; 
} 

/** 
* {@inheritdoc} 
*/ 
public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => User::class 
    )); 
} 

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

あなたは、データベース内の各製品のエンティティと、あなたのユーザーに関連付けられます確認だけのためのチェックボックスがあります。このようにして

+0

こんにちはOlivierC、あなたの答えをありがとう!確かにそうだった。私は昨日見つけましたが、私はまだSymfonyのドキュメントを読むのに苦労しています^^。今私はラジオボタンをつけていましたが、これはユーザーと一緒に選択したいものです。グループデータ。 もう一度おねがいします! – THaulbert

+0

groupeエンティティもある場合は、商品と同じように行うことができます。ラジオボタンを取得するには、展開した値をtrueに、複数のオプションをfalseに設定する必要があります。 – OlivierC

+0

将来同じ問題を抱える他の人を助けるために解決された問題にもマークできます。 – OlivierC

関連する問題