Symfony2实体选择列表设置选定对象

时间:2012-09-14 10:33:41

标签: php symfony doctrine-orm

有两个实体,类别设备。设备可以与一个类别相关。类别可以与许多设备相关。

我使用以下自定义表单类型来创建和编辑设备:

class DeviceFormType extends AbstractType {

    public function buildForm(FormBuilder $builder, array $options) {

        $builder->add('name');
        $builder->add('category', 'entity', array(
            'class' => 'MySupportBundle:Category',
            'property' => 'name'
        ));
    }

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

    public function getDefaultOptions(array $options) {
        return array(
            'data_class' => 'My\SupportBundle\Entity\Device',
        );
    }

}

所以基本上每个设备都有一个名称,并分配给一个类别。这很好用。现在,当我尝试编辑设备并更改类别时,在选项列表中未选择当前类别:

 public function editDeviceAction($id, Request $request) {

        $em = $this->getDoctrine()->getEntityManager();
        $device = $em->getRepository('MySupportBundle:Device')->find($id);

        $form = $this->createForm(new DeviceFormType(), $device);

        $valid = false;

        if ('POST' == $request->getMethod()) {
            $form->bindRequest($request);

            if ($form->isValid()) {
                $device = $form->getData();
                $device->setUpdatedAt(new \DateTime('now'));
                $em->flush();

                return $this->redirect($this->generateUrl('view_shop'));
            } else {
                $valid = true;
            }
        } else {
            $valid = true;
        }

        return $this->render('MySupportBundle:Shop:editDevice.html.twig', array(
                    'form' => $form->createView(),
                    'valid' => $valid,
                    'device' => $device
                ));
    }

如何将类别设置为已选择?

设备:

<entity name="My\SupportBundle\Entity\Device" table="device">   
        <id name="id" type="integer" column="id">
                <generator strategy="AUTO" />
        </id>

        <many-to-one field="category" target-entity="Category"/>

        <field name="name" column="name" type="string" length="255"/>     
</entity>

类别:

<entity name="My\SupportBundle\Entity\Category" table="category">   
    <id name="id" type="integer" column="id">
            <generator strategy="AUTO" />
    </id>

    <one-to-many field="device" target-entity="Device" mapped-by="Device"/>

    <field name="name" column="name" type="string" length="255"/>              
</entity>

3 个答案:

答案 0 :(得分:1)

您好我不确定,但您是否正在检查一对多和多对一的关系?它们是单向还是双向的?您可以向我们展示您的设备和类别实体类......

答案 1 :(得分:1)

您正在使用名为find()的自定义存储库方法 - 根据您重载的方式,可能未提取Category。您可以依赖默认的findOneById(int $id)方法。

答案 2 :(得分:1)

最后我自己找到了一个解决方案。

显然在创建这样的表单视图时

{{ form_widget(form.type)}}

以及像这样的表单类型

    $builder->add('type', 'entity', array(
        'class' => 'MyBundle:Category',
        'property' => 'name'
    ));

它不起作用。因为“类型”是错误的。它必须是“类别”而不是“类型”。很奇怪,但这是问题;)