Forms Symfony 3:向表单数据库添加复选框

Forms Symfony 3:向表单数据库添加复选框,forms,symfony,checkbox,Forms,Symfony,Checkbox,我正在和symfony表单做斗争。我想为用户构建一个表单。此用户作为arraycollection字段,用于收集产品名称、说明 我想创建一个表单,为传递给表单生成器的每个产品创建一个复选框。实际上,它只是创建了没有标签的输入字段。。。下面是我的UserType类的代码: public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('nom')->add('p

我正在和symfony表单做斗争。我想为用户构建一个表单。此用户作为arraycollection字段,用于收集产品名称、说明

我想创建一个表单,为传递给表单生成器的每个产品创建一个复选框。实际上,它只是创建了没有标签的输入字段。。。下面是我的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';
}
这是我的产品类型代码:

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(),
    ));
}
谢谢你的帮助

您应该使用Symfony\Bridge\doctor\Form\Type\EntityType而不是CollectionType

在您的用户类型中

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';
}

这样,您的数据库中的每个产品实体都有一个复选框,只有您选中的那个实体才会与您的用户关联

我认为您已将UserType类粘贴为ProduuctType类。您能更新您的问题以便我们查看您的产品类型吗?你好,ehymel,谢谢您的帮助。我传递了正确的对象用户,但没有使用EntityType。现在它起作用了;。你好,奥利维耶克,谢谢你的回答!确实如此。我昨天发现,我仍然很难通过Symfony文档^^。现在我坚持用单选按钮,我想用用户来选择。分组数据。再次感谢!如果你也有groupe实体,你就可以像对待产品那样做。要获得单选按钮,您需要将“扩展”选项设置为“真”,将“多选项”选项设置为“假”。您还可以将问题标记为已解决,以帮助其他在将来遇到相同问题的人获得答案。。您能否提供一个示例,说明如何设置所选产品?默认情况下,此代码将返回数据库中给定类的所有实体。如果您想更具体地说明您希望填写表单的数据,您可以查看symfony文档中的query\u builder选项