2012-09-14 121 views
1

有两个实体,类别设备。一个设备可以只与一个类别相关。一个类别可能与许多设备有关。Symfony2实体选择列表设置选择对象

我用下面的自定义表单类型创建和编辑设备:

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> 

回答

1

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

显然创建表单视图时这样

{{ form_widget(form.type)}} 

和表单类型这样

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

将无法​​正常工作。因为“类型”是错误的。它必须是“类别”而不是“类型”。很奇怪,但这是问题;)

1

嗨,我不知道,但你检查关系的一个一对多和多对一一个他们是单向您可以向我们展示您的设备和类别实体类...

+0

看到我的更新,我添加entites作为orm的定义 –

+0

我猜在你的实体类中一切都很好,另一方面当你使用find($ device)时使var_dump ID),你会看到它会返回什么结果,因为你有这个问题... – Nll

+0

我做了一个var_dump,它的工作,对象是正确的 –

1

您正在使用名为find()的自定义存储库方法 - 取决于您如何超载它,Category可能未被提取。您可以依靠默认的findOneById(int $id)方法。

+0

更新一个实体,你不需要调用坚持。 http://symfony.com/doc/2.0/book/doctrine.html#updating-an-object –

+0

@ArtWorkAD谢谢你,删除了一些'persist'然后:D – moonwave99

+0

顺便说一句,用“find()”取得设备,而不是一个类别... –