Symfony 3.2表单事件:无法检索数据

时间:2018-01-17 09:23:00

标签: php forms symfony symfony-3.2

我没有找到与我的问题相关的任何主题,我的情况非常特别,这就是我寻求帮助的原因。

我有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 ;



}

欢迎任何提示或技术建议!感谢。

1 个答案:

答案 0 :(得分:0)

我忘了在POST_SUBMIT函数中使用表单修饰符,我不得不删除'选项' =>表单生成器中的[]覆盖发送到服务器的数据。