在Symfony2文档中,您可以嵌入一组表单来添加对象,但是如何从现有对象中进行选择以添加到集合中?

时间:2015-09-17 17:42:55

标签: forms symfony datatables entity

不确定这是提出问题的最明确方式,但基本上我想尝试在Symfony2中实现以下目标:

enter image description here

重要的是要注意我已根据文档尝试嵌入一个集合,但我不打算创建一个新对象并添加到集合中我试图选择要添加到集合中的现有对象。

我目前有一个产品组实体,它只包含ID,名称和产品集合:

<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Product Group
 * @ORM\Table(name="productGroups")
 * @ORM\HasLifecycleCallbacks
 */
class ProductGroup
{  
    /**
     * @var integer
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     * @ORM\Column(name="name", type="string", length=255)
     */
    protected $name;

    /**
     * @ORM\ManyToMany(targetEntity="Product", mappedBy="productGroups")
     **/
    protected $products;

    ...

然后我有了产品实体:

<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Product
 * @ORM\Table(name="products")
 * @ORM\HasLifecycleCallbacks
 */
class Product
{  
    /**
     * @var integer
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     * @ORM\Column(name="name", type="string", length=255)
     */
    protected $name;

    /**
     * @var string
     * @ORM\Column(name="code", type="string", length=20)
     */
    protected $name;

    /**
     * @ORM\ManyToMany(targetEntity="ProductGroup", mappedBy="products")
     **/
    protected $productGroups;

    ...

我要做的是创建一个允许我创建和更新产品组的表单。

我想输入产品组的名称,然后通过勾选表格行的复选框来选择产品。我的想法是,我可以使用像数据表这样的东西来过滤产品,使其更容易添加。

要开始此操作,我添加了一个产品组类型:

<?php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ProductGroupType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name');
        $builder->add('products', 'collection', array(
            'type' => new ProductType()
        ));
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\ProductGroup',
        ));
    }

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

然后我有产品类型:

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

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Product',
        ));
    }

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

现在我对如何拥有一个产品表非常感到困惑,这些产品有一个选中的复选框,保存的表单将保存在产品组中。

任何人都可以帮助或建议任何其他方式吗?

如果有帮助,我附上了我想要实现的目标。

提前致谢。

1 个答案:

答案 0 :(得分:1)

使用实体表单类型: http://symfony.com/doc/current/reference/forms/types/entity.html

$builder->add('name', 'text')
        ->add('code', 'text')
        ->add(
            'ProductGroups', 'entity', array(
            'class' => 'YourBundle:ProductGroups',
            'label' => 'Select ProductTypes',
            'placeholder' => 'Select ProductGroups',
            'multiple' => true,
                'expanded' => true
            ))
            ->getForm();
    }

Multiple标签将生成一个复选框列表,允许您选择多个productGroups