所以我在过去的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。我可以将其扩展为复选框:
这将仅显示订单中的订单产品,但是当我尝试添加新产品时(我将复制/粘贴其中一个输入的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)))
这将为每个关系呈现包含所有产品的收音机。由于CollectionType,我可以在订单中添加新产品,但初始关系将所有产品显示为每个关系的无线电列表。如果我能以某种方式告诉EntityType只渲染当前关系。
有办法做到这一点吗?