2013-02-16 47 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