在Symfony 2.0中呈现表单集合的问题

时间:2014-03-12 03:46:42

标签: php forms symfony

我有以下用户实体:

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)))

                ;

    }

但现在我收到错误:

预期数组。

enter image description here

我该如何解决这个问题?

1 个答案:

答案 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()方法。