EasyAdmin 3:如何基于 dql 为 CRUD 索引显示实体

Posted

技术标签:

【中文标题】EasyAdmin 3:如何基于 dql 为 CRUD 索引显示实体【英文标题】:EasyAdmin 3: How to display entities based on dql for CRUD index 【发布时间】:2021-08-26 05:39:16 【问题描述】:

我有一个名为 Page 的实体,它可以是 callToAction(布尔值),我想在一个子菜单上显示带有 callToAction == false 的页面实体,在另一个子菜单上显示带有 callToAction == true 的页面实体。我有一个页面实体的 CRUD。所以仪表板应该是这样的:

MenuItem::subMenu('Page', 'far fa-file-alt')->setSubItems([
                MenuItem::linkToCrud('Page', 'fa fa-alt', Page::class),
                MenuItem::linkToCrud('Call To Action', 'fa fa-file-alt', Page::class),
            ])

但我不知道将 dql 放在哪里来显示我想要的实体(callToAction 真或假),我什至不知道这是否可能,但我知道这是使用 Easy Admin 2,这就是为什么我想知道。 我也希望在 NEW Action 上这样做,当您在带有 callToAction == true 的页面上时,当您从这里创建新的实体页面时,callToAction 立即设置为 true 并且用户甚至看不到场地。还是不知道有没有可能。 谢谢:)

编辑:所以我发现我可以使用 createIndexQueryBuilder() 在索引上准确显示实体,并且效果很好,但我不知道如何根据我们显示的子菜单调用两个不同的 createIndexQueryBuilder。我尝试执行自定义操作并使用 createQueryBuilder,但我没有参数 searchDto 等:

public function configureActions(Actions $actions): Actions
    
        $indexIsCallToAction = Action::new('indexIsCallToAction', 'Index Call To Action', 'fa fa-send')
            ->linkToCrudAction('indexIsCallToAction');
        $actions->add(CRUD::PAGE_INDEX, $indexIsCallToAction);
        return $actions;
        //return parent::configureActions($actions); // TODO: Change the autogenerated stub
    

    public function indexIsCallToAction(AdminContext $context,SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters)
        $response = $this->get(EntityRepository::class)->createQueryBuilder($searchDto, $entityDto, $fields, $filters);

        return $response;
    

所以它不起作用。

【问题讨论】:

【参考方案1】:

仪表板控制器是一个普通的控制器,你可以这样做:

public function __construct(PageRepository $pageRepo)

    $this->pageRepo = $pageRepo;


public function configureMenuItems(): iterable

    $submenuItems = [];
    if (null !== $pages = $this->pageRepo->findBy(["callToAction" => true ])) 
        foreach ($pages as $page) 
            $submenuItems[] = MenuItem::linkToCrud('Call To Action', 'fa fa-file-alt', Page::class);
        
    
    yield MenuItem::subMenu('Page Submenu with callToAction', 'far fa-file-alt')->setSubItems($submenuItems);

    $submenuItems = [];
    if (null !== $pages = $this->pageRepo->findBy(["callToAction" => false ])) 
        foreach ($pages as $page) 
            $submenuItems[] = MenuItem::linkToCrud('Page', 'fa fa-alt', Page::class);
        
    
    yield MenuItem::subMenu('Other Page Submenu', 'far fa-file-alt')->setSubItems($submenuItems);

【讨论】:

以上是关于EasyAdmin 3:如何基于 dql 为 CRUD 索引显示实体的主要内容,如果未能解决你的问题,请参考以下文章

EasyAdmin 3翻译错误,“翻译”字段的Doctrine类型为“4”,EasyAdmin尚不支持

如何在easyadmin 3中更改分页

如何在 Symfony EasyAdmin 3 中创建密码输入类型

类 DateTime 的 EasyAdmin 3 对象无法转换为字符串

EasyAdmin 3 如何根据查询从操作 createEntity 设置关联

如何在 EasyAdmin 3 中添加自定义操作?