在CollectionType Admin

时间:2019-03-11 07:50:18

标签: symfony symfony4 sonata-admin sonata

我正在创建一个实体 basketElement ,该实体通过实例化的Sonata \ Form \ Type \ CollectionType链接到父实体 basket 。创建实体 basketElement 时,我还需要调用一个服务函数,该函数需要实体 basket 的ID。

现在,我有一个管理员:

class BasketAdmin extends AbstractAdmin {
    /**
     * @param \Sonata\AdminBundle\Form\FormMapper $formMapper
     */
    public function configureFormFields(FormMapper $formMapper): void
    {
        $formMapper->with('basket.group.basketElements')
            ->add('basketElements', Sonata\Form\Type\CollectionType::class)
        ;
    }
}

而basketElements字段的管理员如下:

class BasketElementAdmin extends AbstractAdmin {
    /**
     * @param \Sonata\AdminBundle\Form\FormMapper $formMapper
     */
    public function configureFormFields(FormMapper $formMapper): void
    {
        $formMapper->with('basketElement.group.products')
            ->add('basket', Sonata\AdminBundle\Form\Type\ModelHiddenType::class)
        ;
    }

    public function prePersist(){
        $this->myService->myFunction($this->getParent()->getSubject()->getId());
    }
}

如何访问父实体?

1 个答案:

答案 0 :(得分:0)

我找到了2个解决方案;

    可以在link_parameters字段上将
  • fieldDescriptionOptions添加到add方法的CollectionType自变量中。比在basketElementAdmin中,可以从请求对象中检索链接参数,并使用它来检索链接的实体。
    /**
     * @param \Sonata\AdminBundle\Form\FormMapper $formMapper
     */
    public function configureFormFields(FormMapper $formMapper): void
        {
            $formMapper->with('basket.group.basketElements')
                ->add('basketElements', Sonata\Form\Type\CollectionType::class, [], [
                    'link_parameters' => ['basket_id' => $this->getSubject()->getId()]
                ])
            ;
        }
    }
  • 可以在父管理员的prePersistpreUpdate方法中调用需要父ID的服务功能并将其设置为childAdmin