我有以下用户实体:
class User extends BaseUser implements ParticipantInterface
{
/**
* @Exclude()
* @ORM\OneToMany(targetEntity="App\MainBundle\Entity\PreferredContactType", mappedBy="user", cascade={"all"})
*/
protected $preferredContactTypes;
/**
* Add preferredContactType
*
* @param \App\MainBundle\Entity\PreferredContactType $preferredContactType
* @return User
*/
public function addPreferredContactTypes(\App\MainBundle\Entity\PreferredContactType $preferredContactType)
{
$this->preferredContactTypes[] = $preferredContactType;
return $this;
}
/**
* Remove preferredContactType
*
* @param \App\MainBundle\Entity\PreferredContactType $preferredContactType
*/
public function removePreferredContactTypes(\App\MainBundle\Entity\PreferredContactType $preferredContactType)
{
$this->preferredContactTypes->removeElement($preferredContactType);
}
/**
* Get preferredContactType
*
* @return \App\MainBundle\Entity\PreferredContactType
*/
public function getPreferredContactTypes()
{
return $this->preferredContactTypes;
}
}
我想创建一个显示preferredContactType的多个选项的表单:
$contactOptions = $em->getRepository('AppMainBundle:ContactType')->findAll();
$settingsForm = $this->createForm(new UserType(), $user, array(
'contact' => $contactOptions,
));
这是我的UserType的样子:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('preferredContactTypes', 'collection', array('type' => 'choice', 'options' => array('choices' => $options['contact'], 'multiple' => true, 'expanded' => true)))
;
}
但现在我收到错误:
预期数组。
我该如何解决这个问题?
答案 0 :(得分:0)
它失败了,因为您传递给了ArrayCollection类的choices
参数实例(在$em->getRepository('AppMainBundle:ContactType')->findAll();
中返回)。但choices
参数必须是数组(http://symfony.com/doc/2.0/reference/forms/types/choice.html#choices)。
您可以在ArrayCollection上使用toArray()
方法来检索数组,但它不会给出预期的结果,因为它将是ContactType
的实例数组。
从实体形成一些选择列表的最佳方法是使用entity
类型而不是choice
。点击此处了解详情:http://symfony.com/doc/current/reference/forms/types/entity.html。
您也可以在某个类中实现Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
,并将其用作choice_list
表单字段中的参数choice
。例如,您可以扩展Symfony\Component\Form\Extension\Core\ChoiceList\LazyChoiceList
并实施loadChoiceList()
方法。