如何使复选框在Symfony 2中工作?

时间:2016-06-14 07:55:48

标签: php symfony doctrine-orm twig

我目前正在创建一个表单,让用户从Dropdown和Checkbox中选择一些技能,让用户可以根据自己的需要进行检查。

以下是我的表格:CurriculumVitae

/* namespace ........... */

use Doctrine\ORM\Mapping as ORM;

/**
* CurriculumVitae
*
* @ORM\Table(name="foo_cv")
* @ORM\Entity
*/
class CurriculumVitae
{
    /**
    * @var integer
    *
    * @ORM\Column(name="id", type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    private $id;

    /**
    * @var integer
    * @ORM\ManyToOne(targetEntity="Foo\BarBundle\Entity\Skills")
    * @ORM\JoinColumn(name="skills", referencedColumnName="id")
    */
    private $skills;

    /**
    * @var integer
    * @ORM\ManyToOne(targetEntity="Foo\BarBundle\Entity\Hobby", cascade={"persist"})
    * @ORM\JoinColumn(name="hobbies", referencedColumnName="id")
    */
    private $hobby;

    /*  Setters and Getters   .......  */
}

以下是我的表单类型的一些代码:CurriculumVitaeType

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{

    $builder
        ->add('skills', 'entity', array('class' =>'FooBarBundle:Skills','property' => 'skills'))
        ->add('hobby', 'entity', array( 'class' => 'FooBarBundle:Hobby','property' => 'hobbies', 'expanded'=>true,'multiple'=>true, 'label' => 'hobbies'))
        ->add('save','submit',array('label'=>'Submit'))
    ;
}

/* OptionsResolverInterface  .....   */
/* getName()  .... */

我在我的树枝上用cv.twig.html

这样称呼我的表格
{{ form(curriculumForm) }} 

最后在我的控制器中:CurriculumController

$em = $this->getDoctrine()->getManager();
$cv = new CurriculumVitae();
$curriculumForm = $this->createForm(new CurriculumVitaeType(), $cv);
$curriculumForm->handleRequest($request);

if ($curriculumForm->isValid()) {
    $em->persist($cv);
    $em->flush();
    return $this->redirect($this->generateUrl('foo_main_window'));
}
return array('curriculumForm'=> $curriculumForm->createView());

表格显示正确,但当我从下拉列表中选择技能并指定某个爱好并点击提交时,会抛出错误。

  

在关联Foo \ BarBundle \ Entity \ CurriculumVitae #bobby上找到Doctrine \ Common \ Collections \ ArrayCollection类型的实体,但期待Foo \ BarBundle \ Entity \ Hobby

我不知道我是否遗漏了一些内容,但我认为在提交表单后保留数据的过程中会出现错误。

1 个答案:

答案 0 :(得分:1)

那是因为你有多对一的关系,这意味着

  

许多 CurriculumVitae可以(相同) Hobby

但另一方面,您在表单中创建了一个带有选项'multiple'=>true的字段,这意味着您可以让用户选择多个爱好。因此,表单返回ArrayCollection Hobby的{​​{1}}而不是单个实例。

那不匹配。您需要删除multiple选项,或在$hobby属性上建立多对多关系。