Symfony更改表单呈现ManyToOne字段的形式

时间:2013-02-16 00:02:22

标签: symfony doctrine-orm doctrine symfony-forms

这是我的第一个问题:S

我使用Symfony2,我遇到以下麻烦

我有两个与ManyToOne关系相关的实体,我想为跟随实体创建一个表单

/**
 * @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为object,string   给定的   C:\ XAMPP \ htdocs中\ SYM2 \的Symfony \供应商\原则\ ORM \ LIB \原则\ ORM \ UnitOfWork.php   1358行

似乎ORM无法读取PK的字符串,任何人都不知道我必须看到什么来修复它。谢谢你的建议:)

1 个答案:

答案 0 :(得分: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());