我没有找到与我的问题相关的任何主题,我的情况非常特别,这就是我寻求帮助的原因。
我有4个涉及的实体:PurchaseOrder,SapPO,项目和产品。如下所示,PurchaseOrder与SapPo之间存在一对多关联,SapPo与Project之间存在一对多的双向关联,以及purchaseOrder与产品之间的多对多关联。
PurchaseOder.php:
/**
* @ORM\ManyToMany(targetEntity="SapPo",cascade={"persist","remove"})
* @ORM\JoinTable(name="po_sappo",
* joinColumns={@ORM\JoinColumn(name="po_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="sappo_id", referencedColumnName="id", unique=true,onDelete="CASCADE")}
* )
*/
private $sapPo;
/**
* @ORM\ManyToMany(targetEntity="Product", mappedBy="purchaseOrders")
*/
private $products;
SapPo.php
/**
* @ORM\ManyToOne(targetEntity="Project", inversedBy="sapPos")
* @ORM\JoinColumn(name="project_sap", referencedColumnName="id")
*/
private $project ;
Project.php:
/**
* @ORM\OneToMany(targetEntity="SapPo", mappedBy="project")
*/
private $sapPos ;
/**
* @ORM\ManyToMany(targetEntity="Product", inversedBy="projet")
* @ORM\JoinTable(name="product_project")
*/
private $products;
最后是Product.php:
/**
* @ORM\ManyToMany(targetEntity="PurchaseOrder", inversedBy="products",
cascade={"persist"})
* @ORM\JoinTable(name="purchaseOrders_products")
*/
private $purchaseOrders;
/**
* @ORM\ManyToMany(targetEntity="Project", mappedBy="products")
*/
private $projet;
我想要做的是用表示所选项目数据之间交集的产品填充表单。 例如,我们必须选择项目“Project 1”,它有两个产品“product 1”和 “product 2” 和另一个项目“project 2”有两个产品 “产品2” 和“产品3”。
在此示例中, “product 2” 是交集,需要使用该表单填充表单。
使用下面显示的代码并使用FormEvents我已成功使用必要的AJAX调用和随后的ArrayCollection Filter使用必要的数据填充表单。问题是,一旦我提交表单,我没有选择产品,但我得到一个空的ArrayCollection。
PurchaseOrderType.php:
/**
* Product modifier used to modify products after the SAP PO choice validation
* @param FormInterface $form
* @param $sapPos
*/
$productModifier = function (FormInterface $form, $names){
$form->add('products', EntityType::class,array(
'class' => 'FollowupBundle:Product',
'multiple' => true,
'expanded' => false,
'query_builder' => function(EntityRepository $er) use ($names) {
$qb = $er->createQueryBuilder('u') ;
$qb->where("u.name IN (:projects)")
->setParameter('projects',$names) ;
return $qb ;
},
'choice_label' => 'name',
'placeholder' => 'Selectionner le produit'
));
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) {
$form = $event->getForm();
$data = $event->getData();
$sapPos = $data->getSapPo();
$form->add('products',EntityType::class,array(
'class' => 'FollowupBundle:Product',
'multiple' => true,
'expanded' => false,
'required' => false,
'choices' => [],
'placeholder' => 'selectionner les produits',
'choice_label' => 'name'
)) ;
}) ;
$builder->get('sapPo')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) use ($productModifier){
$sapPos = $event->getForm()->getData() ;
$namesList = $this->getNamesFromSapPo($sapPos) ;
$productModifier($event->getForm()->getParent(), $namesList);
},900
) ;
编辑
这是用于过滤和提取要在查询构建器中使用的产品名称的函数。
/**
* @param Product $product
* @param ArrayCollection $sapPos
* @return bool
*/
public function filterProducts(Product $product, $sapPos){
$isCommon = true ;
foreach ($sapPos as $sapPo){
if (!$sapPo->getProject()->getProducts()->contains($product)){
$isCommon = false;
}else {
}
}
return $isCommon;
}
public function getNamesFromSapPo($sapPos){
$primilnaryProducts = new ArrayCollection() ;
$lastProducts = new ArrayCollection() ;
$namesList = [] ;
foreach ($sapPos as $sapPo){
foreach ($sapPo->getProject()->getProducts() as $product){
$primilnaryProducts->add($product) ;
}
}
// filter products
$lastProducts = $primilnaryProducts->filter(
function ($entry) use ($sapPos){
return $this->filterProducts($entry,$sapPos) ;
}
) ;
//get Names
foreach ($lastProducts as $product){
$namesList[] = $product->getName() ;
}
return $namesList ;
}
欢迎任何提示或技术建议!感谢。
答案 0 :(得分:0)
我忘了在POST_SUBMIT函数中使用表单修饰符,我不得不删除'选项' =>表单生成器中的[]覆盖发送到服务器的数据。