2013-02-16 43 views
0

這是我的第一個問題:SSymfony的改變形式的一種形式呈現多對一場

我使用Symfony2中,我有以下的麻煩

我有一個相關的兩個實體多對一的關係,我想打一個形式的跟隨着實體

/** 
* @ORM\Entity 
* @ORM\Table(name="product") 
*/ 
class Product 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 
    /** 
    * @ORM\Column(type="string", length=100) 
    */ 
    protected $name; 
    /** 
    * @ORM\ManyToOne(targetEntity="Acme\ProductsBundle\Entity\ProductCategory", inversedBy="products") 
    * @ORM\JoinColumn(name="category_id", referencedColumnName="id") 
    */ 
    protected $productCategory; 
} 

所以我做了以下「ProductType」

class ProductType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('productCategory') 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Acme\ProductsBundle\Entity\Product' 
     )); 
    } 

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

當我渲染窗體時,所有的工作都很棒,但現在我想將「productCategory」的窗口小部件更改爲文本窗口小部件,因爲用戶需要編寫作爲productCategory主鍵的數字。

但是,當我這樣做,並完成表格,我得到以下錯誤。

警告:spl_object_hash()預計參數1爲對象,串 在 C中給出:\ XAMPP \ htdocs中\ SYM2 \的Symfony \廠商\教義\ ORM \ lib中\學說\ ORM \ UnitOfWork.php line 1358

似乎ORM讀取PK字符串失敗,任何人都不知道我必須看到什麼來修復它。謝謝建議:)

+0

你需要多一點工作,而不僅僅是從實體生成表單,記住你可以結合FormTypes,一個ProductType可以有一個CategoryType在裏面。檢查symfony文檔,它寫得很好(如果你和我一樣,用法語)。 – mpm 2013-02-16 02:02:12

+0

還要檢查你的getters/setters,以便正確地鍵入它們。 – Ocramius 2013-02-16 02:38:33

回答

0

您的產品實體與產品類別有關係。所以你的表單期望類別是一個實體而不是一個字符串。這就是爲什麼你會收到錯誤expects parameter 1 to be object, string given

要避免這種情況,您可以刪除setDefaultOptions方法。如果這樣做,表單類將不再知道它與某個實體類相關聯。這個缺點是,當你將實體傳遞給表單類時,它不會自動設置字段。

但是,現在您可以輸入類別ID並處理它。

E.g.

class ProductType extends AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('productCategory');   
    } 

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

現在productCategory將自動成爲文本小部件。但是,您需要將其保存在控制器中。但爲此,你可能會問另一個問題。

注意,當您創建表單時,請勿傳遞產品對象。讓它像這樣

$form = $this->createForm(new ProductType(), array()); 
+0

嗨作品,感謝您的回覆,我是解決這個問題的好方法,我深入閱讀了symfony文檔,並發現使用數據轉換器您也可以使用它。所以我認爲這兩個都是很好的選擇。感謝您的回覆。 http://symfony.com/doc/current/cookbook/form/data_transformers.html – 2013-02-16 17:12:24