使用动态小部件构建表单

发布于 12-10 11:44 字数 1788 浏览 1 评论 0原文

我有 3 个类:CategoryParameterProduct

  • CategoryParameters 具有一对多关系。
  • ProductCategory 具有一对多关系。
  • 参数是产品的属性(颜色、重量、尺寸、 品牌等)。

当我选择一个类别并创建新产品时,我想使用这些参数创建一个表单。 我该怎么做? symfony 表单框架可以吗? 我希望得到你的帮助。

我尝试这样做:

 class ProductRepository extends EntityRepository
{

    public function getParameters()
    {
        $em = $this->getEntityManager();
        $parameters = $em->getRepository('ShopProductBundle:CatParameter')->findAll();
        $data = array();
        foreach ($parameters as $k => $value) {
            $name = $value->getId();
            $data[$name] = array("label" => $value->getName());
        }
        return $data;
    }

}

表单类

class ProductType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('name', 'text', array('label' => 'Name'));
        $data = $options['data'];
        foreach($data as $k => $item){
            $builder->add((string)$k, 'text', array('label' => $item['label']));
        }
    }

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

    public function getDefaultOptions(array $options){
        return array('data_class' => 'Shop\ProductBundle\Entity\Product');
    }
}

并在操作中创建表单:

$parameters = $em->getRepository('ShopProductBundle:Product')->getParameters();
$form = $this->createForm(new ProductType(), $parameters);

结束有异常:

预期参数类型为“Shop\ProductBundle\Entity\Product”、“array” 给定

I have 3 classes : Category, Parameter and Product.

  • Category has a one-to-many relationship with Parameters.
  • Product has a one-to-many relationship with Category.
  • Parameters are attributes for a product (color, weight, size,
    brand, etc.).

When I select a category and create a new product I want to create a form with these parameters.
How can I do this? Is it possible with symfony form framework?
I hope for your help.

I trying do this something like:

 class ProductRepository extends EntityRepository
{

    public function getParameters()
    {
        $em = $this->getEntityManager();
        $parameters = $em->getRepository('ShopProductBundle:CatParameter')->findAll();
        $data = array();
        foreach ($parameters as $k => $value) {
            $name = $value->getId();
            $data[$name] = array("label" => $value->getName());
        }
        return $data;
    }

}

Form Class

class ProductType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('name', 'text', array('label' => 'Name'));
        $data = $options['data'];
        foreach($data as $k => $item){
            $builder->add((string)$k, 'text', array('label' => $item['label']));
        }
    }

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

    public function getDefaultOptions(array $options){
        return array('data_class' => 'Shop\ProductBundle\Entity\Product');
    }
}

And create form in action:

$parameters = $em->getRepository('ShopProductBundle:Product')->getParameters();
$form = $this->createForm(new ProductType(), $parameters);

End have exception:

Expected argument of type "Shop\ProductBundle\Entity\Product", "array"
given

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

彻夜缠绵2024-12-17 11:44:14

我猜您会收到此异常,因为在您的控制器中 $parameters 不是产品。
您应该构建一个新产品,并向其中添加参数。
另请查看这篇文章 。它处理与您类似的问题。

I guess you're getting this exception because in your controller $parameters is not a product.
You should build a new product, and add the parameters to it.
Also please have a look to this article. It deals with a problem similar to yours.

涫野音2024-12-17 11:44:14

一旦您在表单中设置了数据类,您可以获得的唯一对象就是它的类型。

'data_class' => 'Shop\ProductBundle\Entity\Product'

我向产品实体添加多个参数的方式是表单项的集合:
如何添加项目集合

或者也许您只是想通过像这样的参数:

$parameters = $em->getRepository('ShopProductBundle:Product')->getParameters();
$form = $this->createForm(new ProductType(), null, $parameters);

或者如果您想要一个实体:

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

As soon as you have setup data class in your form the only object you can get is it's type.

'data_class' => 'Shop\ProductBundle\Entity\Product'

The way I'm adding multiple parameters to a product entity is a collection of form items:
How to add collection of items

Or maybe you just want to pass parameters like this:

$parameters = $em->getRepository('ShopProductBundle:Product')->getParameters();
$form = $this->createForm(new ProductType(), null, $parameters);

Or if you would like to have an entity:

$form = $this->createForm(new ProductType(), new Product(), $parameters);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文