仅渲染集合表单中的现有关系,并允许为现有项添加新关系

时间:2016-10-11 08:53:42

标签: php doctrine symfony symfony-forms

所以我在过去的4天里一直在苦苦挣扎,我不确定Symfony是否可行,或者我是否需要介入自定义修复。我觉得这是一个通过应用程序使用的常见小部件,它可能很简单,但我不知道如何做到这一点。

我们的想法是将现有产品添加到表单中的新订单。产品已经在数据库中,它们只需要被带到前端。要执行此操作,按名称搜索它们的文本字段将返回可单击的下拉列表,并且在单击列表中的一个项目时,产品将添加到订单中。这样,就不会创建新产品。

问题在于我只希望最初显示现有关系,而不是数据库中的所有产品。

现在,我到目前为止所做的尝试:

class Order
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

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

    /**
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Product", inversedBy="orders")
     * @ORM\JoinTable()
     */
    protected $products;

}


class Product
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

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

    /**
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Order", mappedBy="products")
     */
    protected $orders;

}

现在OrderType表单:

这将显示所有产品的多选,所选产品是订单的产品。问题是select包含所有产品。

->add('products')

默认值实际上是带multiple=true, expanded = false的EntityType。我可以将其扩展为复选框:

img

这将仅显示订单中的订单产品,但是当我尝试添加新产品时(我将复制/粘贴其中一个输入的html并将其ID更改为现有产品)我会得到“选择”选择列表中不存在“8”。“。

->add('products',EntityType::class,array('class'=>Product::class,'choices'=>$order->getProducts(),'multiple'=>true,'expanded'=>true))

这让我觉得我需要允许EntityType允许添加的选项不在传递给表单的选项中,但我不知道该怎么做,似乎无法找到方法,或使用CollectionType,它允许我添加/删除关联。

->add('products', CollectionType::class, array('by_reference' => false, 'entry_type' => EntityType::class, 'allow_add' => true, 'allow_delete' => true, 'entry_options' => array('class'=>Product::class,'expanded'=>true)))

image

这将为每个关系呈现包含所有产品的收音机。由于CollectionType,我可以在订单中添加新产品,但初始关系将所有产品显示为每个关系的无线电列表。如果我能以某种方式告诉EntityType只渲染当前关系。

有办法做到这一点吗?

0 个答案:

没有答案