2013-04-04 94 views
0

以下數據的情況是:實體字段類型的symfony 2.0 - 顯示從數據庫中編輯行動

我有3個表(一到多): 產品,ProductLabel,LabelTag(標籤保留-_- )

正如您可能已經猜到的,產品可以有很多標籤。

現在我有一個表單產品,顯示可用的標籤。對於我的新建和創建操作,我已經能夠顯示並保存所選的標籤。 當我嘗試在數據庫的編輯動作中顯示標籤+顯示選定的標籤時,出現問題。

一些代碼:

實體產品:

/** 
* @var Doctrine\Common\Collections\ArrayCollection $productLabels 
* 
* @ORM\OneToMany(targetEntity="Labeyrie\Bundle\MainsiteBundle\Entity\ProductLabel", mappedBy="product") 
*/ 
protected $productLabels; 

實體LabelTag:

/** 
* @var Doctrine\Common\Collections\ArrayCollection $productLabels 
* 
* @ORM\OneToMany(targetEntity="Labeyrie\Bundle\MainsiteBundle\Entity\ProductLabel", mappedBy="labelTag") 
*/ 
protected $productLabels; 

實體ProductLabel:

/** 
* @var Labeyrie\Bundle\MainsiteBundle\Entity\Product $product 
* 
* @ORM\Id 
* @ORM\ManyToOne(targetEntity="Labeyrie\Bundle\MainsiteBundle\Entity\Product", inversedBy="productLabels") 
*/ 
protected $product; 

/** 
* @var Labeyrie\Bundle\MainsiteBundle\Entity\LabelTag $labelTag 
* 
* @ORM\Id 
* @ORM\ManyToOne(targetEntity="Labeyrie\Bundle\MainsiteBundle\Entity\LabelTag", inversedBy="productLabels") 
*/ 
protected $labelTag; 

產品形態:

->add('productLabels', 'entity', array(
      'class' => 'LabeyrieMainsiteBundle:LabelTag', 
      'property' => 'title', 
      'multiple' => true, 
      'expanded' => true, 
     )) 

這是我如何保存它創建行動:

if ($form->isValid()) { 
     /* save product */ 
     $em->persist($product); 
     $em->flush(); 

     /* save product labels */ 
     $labels = $product->getProductLabels(); 
     if (!empty($labels)) { 
      foreach ($labels as $label) { 
       $productLabel = new ProductLabel(); 
       $productLabel->setLabelTag($label); 
       $productLabel->setProduct($product); 

       $em->persist($productLabel); 
      } 
     } 
     $em->flush(); 
    } 

沒有異議。

問題是我編輯操作:

$entity = $em->getRepository('MyProjectBundle:Product')->find($id)); 

    $form = $this->createForm(new ProductType(), $entity); 

如果我只是呈現形式,我只能看到標籤,那裏面的人已經選擇不發送信息(因爲它是在我管理的中間表),因此沒有顯示。

我需要一個使用我的一對多架構的解決方案。表單配置是否錯誤?請幫忙。 :)

回答

0

我終於找到了答案:

只需要做到以下幾點:

$collection = new ArrayCollection(); 
    $labels = $entity->getProductLabels(); 
    if (!empty($labels)) { 
     foreach ($labels as $label) { 
      $collection->add($label->getLabelTag()); 
     } 
    } 

    $form->get('productLabels')->setData($collection); 

檢索單個對象(LabelTag),把它放在一個陣列收集,收集傳遞給窗體字段的數據,你就完成了。

顯示窗體並顯示選定的選項。

相關問題