动态表单Symfony2 PRE_SUBMIT适用于更新但不提交

时间:2016-05-20 10:52:18

标签: php symfony doctrine event-listener

我正致力于获取动态表单以将产品加入类别表。

游戏实体有一个与之相关的游戏类别。

 /**
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\GameCategories", inversedBy="products")
 * @ORM\JoinColumn(name="category_id", referencedColumnName="category_id")
 */
public $category_id;    



/**
 * Set categoryId
 *
 * @param \AppBundle\Entity\GameCategories $categoryId
 *
 * @return Products
 */
public function setCategoryId(\AppBundle\Entity\GameCategories $categoryId = null)
{
    $this->category_id = $categoryId;

    return $this;
}

/**
 * Get categoryId
 *
 * @return \AppBundle\Entity\GameCategories
 */
public function getCategoryId()
{
    return $this->category_id;
}

然后是事件监听器

  $builder->addEventListener(
        FormEvents::PRE_SUBMIT,
        function (FormEvent $event) {
             $product = $event->getData();
             $form = $event->getForm();

            // $game_id = $product->getGameId(); 
            $game_id = $product['game_id'];

            $formOptions = array(
                'class' => 'AppBundle\Entity\Products',
                'property' => 'category_id',
                'query_builder' => function (EntityRepository $er) use ($game_id) {

                     $query = $er->createQueryBuilder('i')
                                ->select(array('i'))
                                ->where('i.game_id = :game_id')
                                ->setParameter('game_id', $game_id)
                                ->orderBy('i.name', 'ASC');
                        return $query;
                },
            );

           $form->add('category_id', EntityType::class, $formOptions);
        }
    );       

当我执行onclicks时,它按预期工作,并且正确的选择框更新。

但是当我实际提交表单时,我收到以下错误。

“预期参数类型为”AppBundle \ Entity \ GameCategories“,”AppBundle \ Entity \ Products“给出”

PRE_SUBMIT看起来好像正在使用我试图让它做的产品。但是当它实际提交时它正在寻找另一个实体。

有没有人对如何解决这个问题有任何想法,或者如何更好地了解如何实施链式下拉序列。

提前致谢。

编辑一个

我在查询构建器中使用了错误的实体。

我能够让动态表单改变,但它只显示整数...

选择类别...... 1 2 3

而不是 选择类别...... 第1类 第2类 第3类

 // Category ID

            $formOptions = array(
                'class' => 'AppBundle\Entity\GameCategories',
                'label' => 'Game Category',
                'property' => 'category_id',
                'placeholder' => 'Choose a Category...',
                'query_builder' => function (EntityRepository $er) use ($game_id) {

                    $query = $er->createQueryBuilder('i')
                                ->select(array('i'))
                                ->where('i.gameId = :game_id')
                                ->setParameter('game_id', $game_id)
                                ->orderBy('i.name', 'ASC');

                    return $query;

                },
            );
            // create the field, this is similar the $builder->add()
            // field name, field type, data, options
           $form->add('category_id', EntityType::class, $formOptions);

我如何获得名称而不是整数?

编辑两个

这就是最终的工作。

 $formOptions = array(
                'class' => 'AppBundle\Entity\GameCategories',
                'label' => 'Game Category',
                'property' => 'category_id',
                'choice_label' => function ($category) {
                    return $category->getName();
                },
                'placeholder' => 'Choose a Category...',
                'query_builder' => function (EntityRepository $er) use ($game_id) {
                    $query = $er->createQueryBuilder('i')
                                ->select(array('i'))
                                ->where('i.gameId = :game_id')
                                ->setParameter('game_id', $game_id)
                                ->orderBy('i.name', 'ASC');
                    return $query;
                },
            );

1 个答案:

答案 0 :(得分:1)

您要在表单中添加包含category_id的字段GameCategories,但您要使用Products列表对其进行配置,因为您设置了'class' => 'AppBundle\Entity\Products'。您应该将班级设置为AppBundle\Entity\GameCategories,以获取类别列表。

修改

要选择用于在列表中显示实体的属性,请使用choise_label选项:

  

<强> choice_label
  输入: stringcallablePropertyPath

     

这是应该用于在HTML元素

中将实体显示为文本的属性