从symfony2中的对象创建数组

时间:2014-11-04 14:33:34

标签: symfony

我试图访问我在数据库中的类别列表,并将它们放入Symfony2中的表单中。

public function productAddAction()
    {
        $product = new Product();
        $categories = $this->getDoctrine()
            ->getRepository('AudsurShopBundle:Category')
            ->findAll();

        $form = $this->createFormBuilder($product)
            ->add('category', 'choice', array(
                'choices' => $categories, /* this is wrong */
                'multiple'  => false,
            ))
            ->add('name', 'text')
            ->add('save', 'submit', array('label' => 'Create Task'))
            ->getForm();

        return $this->render('AudsurAdminBundle:Default:new.html.twig', array(
            'form' => $form->createView(),
        ));
    }

如何从$ categories转到我可以放入以下部分的对象,并且它符合函数所期望的内容?

->add('category', 'choice', array(
                    'choices' => $categories, /* this is wrong */
                    'multiple'  => false,
                ))

我知道这是基本的,但我似乎无法找到合适的关键字来找到答案(我应该寻找什么?)

3 个答案:

答案 0 :(得分:2)

IRC,我认为有一种类型:http://symfony.com/fr/doc/current/reference/forms/types/entity.html

如果我理解你的意思,这应该有助于你想做什么。 :)

答案 1 :(得分:2)

首先,"这是错误的"不是一个特定的错误消息,我们非常帮助您。这就像说'#34;我的代码不起作用"并没有告诉我们原因。继续你的实际问题..

您没有使用正确的表单类型来处理实体类型并正确显示它。正如@Talus提到的,您需要的字段类型是entity。您遗失了一些内容,例如class参数和property参数(假设您未在实体中编写__toString()个功能类。)

    $categories = $this->getDoctrine()
        ->getRepository('AudsurShopBundle:Category')
        ->findAll();

    $form = $this->createFormBuilder($product)
        ->add('category', 'entity', array(
            'class' => 'AudsurShopBundle:Category',
            'choices' => $categories,
            'multiple'  => false,
            'property' => 'name', // This needs to be an actual property, I just assumed name
        ))
        ->add('name', 'text')
        ->add('save', 'submit', array('label' => 'Create Task'))
        ->getForm();

由于您使用了所有Category个实体,因此findAll()查询实际上不是必需的。您可以转而使用basic usage

    $form = $this->createFormBuilder($product)
        ->add('category', 'entity', array(
            'class' => 'AudsurShopBundle:Category',
            'multiple'  => false,
            'property' => 'name', // This needs to be an actual property, I just assumed name
        ))
        ->add('name', 'text')
        ->add('save', 'submit', array('label' => 'Create Task'))
        ->getForm();

如果您正在寻找类别的特定子集,则可以使用之前的choices属性或pass a query_builder

答案 2 :(得分:0)

您可以从数据库中解析数组:

在资源库findAllArray()中创建一个方法:

public function findAllArray() {

    return $this->getEntityManager()
        ->createQuery(
            'SELECT Category '.
            'FROM AudsurShopBundle:Category AS Category'
        )
        ->getArrayResult();
}

然后在您的控制器中调用它并获取所有类别:

$categories = $this->getDoctrine()
    ->getRepository('AudsurShopBundle:Category')
    ->findAllArray();    

当你有数组时,让它适合choice(创建新数组$choices):

$choices = array();
foreach ($categories as $category) {
    $choices[$value['id']] = $value['title'];
}

然后将这个新数组放入表格中:

->add('category', 'entity', array(
        'choices' => $choices,

希望它有所帮助。祝你有愉快的一天。