繁体   English   中英

Symfony2实现OneToOne关系的表单

[英]Symfony2 implement a form for OneToOne relation

我正在尝试实现一对一的关系。 每个用户都可能受到建筑物的影响(对我来说是可行的)。 一栋建筑物可以有很多人,但每个人最多只能在一栋建筑物上受到影响。

我有这个错误:

ContextErrorException:可捕获的致命错误:传递给Intranet \\ UserBundle \\ Entity \\ User :: setUserEtab()的参数1必须是Intranet \\ RhBundle \\ Entity \\ Etablissement的实例,给定的数组在C:\\ wamp \\ www \\ projet \\ vendor中调用\\ symfony \\ symfony \\ src \\ Symfony \\ Component \\ PropertyAccess \\ PropertyAccessor.php行360,并在C:\\ wamp \\ www \\ projet \\ src \\ Intranet \\ UserBundle \\ Entity \\ User.php行322中定义

User.php的322行是:

public function setEtablissement(\Intranet\RhBundle\Entity\Etablissement $etablissement = null)

它发生在$form->handleRequest($request); 我的控制器。 这是我的控制器:

public function editerAction(Request $request, User $user){
    $form = $this->createForm(new EditerFormType, $user);
    if ($request->getMethod() == 'POST') {
        $form->handleRequest($request);
        die("ici");
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($user);
            $this->get('session')->getFlashBag()->add('success', "L'utilisateur ". $user->getNom() ." ". $user->getPrenom() . " a été édité avec succès !");
            $em->flush();
            return $this->redirect($this->generateUrl('intranet_rh_homepage'));
        }else
            $this->get('session')->getFlashBag()->add('danger', "Erreur de formulaire !");  
    }
    return $this->render('IntranetRhBundle:User:editer.html.twig',array('user' => $user, 'form' => $form->createView()));
}

死不了。 在添加表单之前,它已经正常工作。

这是EditForm:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('email', 'email', array('label' => 'form.email', 'translation_domain' => 'FOSUserBundle')) 
        ->add('nom', 'text')
        ->add('prenom', 'text')
        ->add('naissance','date',array(
        'widget' => 'single_text',
        'format' => 'dd/MM/yyyy',
        'attr' => array('class' => 'date', 'readonly' => 'readonly')
        ))
        ->add('sexe', 'choice', array(
         'choices' => array('Homme' => 'Homme', 'Femme' => 'Femme'),
         'multiple' => false
        ))
        ->add('etablissement', new UserEtabType())
    ;
}

public function setDefaultOptions(OptionsResolverInterface  $resolver)
{
    $resolver->setDefaults(array('data_class' => 'Intranet\Userbundle\Entity\User'));
}

这是我的UserEtab表格:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
    ->add('etablissement', 'entity', array('class' => 'IntranetRhBundle:Etablissement', 'property' => 'nom', 'empty_value' => 'Aucun', 'empty_data'  => -1, 'required' => false))
    ;
}

我与用户实体的关系:

    /**
* @ORM\OneToOne(targetEntity="Intranet\RhBundle\Entity\Etablissement", cascade={"persist", "remove"})
**/
private $etablissement;

窗体的视图还可以,有一个包含所有建筑物的选择列表,并且有一个空值。 但是当我发帖时,我遇到了我无法理解和解决的错误。

我有二传手和getter如果用户实体:

    /**
 * Set Etablissement
 *
 * @param \Intranet\RhBundle\EntityEtablissement $etablissement
 * @return User
 */
public function setEtablissement(\Intranet\RhBundle\Entity\Etablissement $etablissement = null)
{
    $this->etablissement = $etablissement;

    return $this;
}

/**
 * Get Etablissement
 *
 * @return \Intranet\RhBundle\Entity\Etablissement 
 */
public function getEtablissement()
{
    return $this->etablissement;
}

但是当我var_dump $request->get('user')->get('etablissement')时不起作用:

错误:在C:\\ wamp \\ www \\ projet \\ src \\ Intranet \\ RhBundle \\ Controller \\ UserController.php第69行中调用未定义的方法Intranet \\ UserBundle \\ Entity \\ User :: get()

而且该建筑物不会出现在$request->get('user') var_dump中。

编辑:

我的UserEtabType没有setDefaultOptions方法,因为我不知道该怎么办。 我试图实现它,但是我有这种错误:

表单的视图数据应该是Intranet \\ UserBundle \\ Entity \\ User类的实例,但是是Proxies__CG __ \\ Intranet \\ RhBundle \\ Entity \\ Etablissement类的实例。 您可以通过将“ data_class”选项设置为null或通过添加将类Proxies__CG __ \\ Intranet \\ RhBundle \\ Entity \\ Etablissement的实例转换为Intranet \\ UserBundle \\ Entity \\ User的实例的视图转换器来避免此错误。

对于新的UserEtabType:

namespace Intranet\UserBundle\Form\Type;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class UserEtabType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
    ->add('etablissement', 'entity', array('class' => 'IntranetRhBundle:Etablissement', 'property' => 'nom', 'empty_value' => 'Aucun', 'empty_data'  => -1, 'required' => false))
    ;
}

public function setDefaultOptions(OptionsResolverInterface  $resolver)
{
    $resolver->setDefaults(array('data_class' => 'Intranet\UserBundle\Entity\User'));
}

public function getName()
{
    return 'intranet_userbundle_useretablissementtype';
}
}

您可以显示新的UserEtabType()类吗?

编辑1 :尝试将这一行:

->add('etablissement', 'entity', array('class' => 'IntranetRhBundle:Etablissement', 'property' => 'nom', 'empty_value' => 'Aucun', 'empty_data' => -1, 'required' => false));

在主EditForm中

编辑2 :另外要小心:

$resolver->setDefaults(array('data_class' => 'Intranet\UserBundle\Entity\User'));

一定是

$resolver->setDefaults(array('data_class' => 'Intranet\UserBundle\Entity\Etablissement'));

在您的UserEtabType()类中

尝试插入记录时出现此错误吗? 或者在那之前。 就您的信息而言,由于一对一关系,User实体中的setUserEtab()需要一个Etablissement对象。 传递数组的值是不够的。 尝试自行传递Etablissement对象(执行dql之后选择的对象)。

希望这对某人有帮助。

干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM