跳到内容

KnpMenu

编辑此页

管理员集成了 KnpMenu。它将菜单与 KnpMenu 库集成。此菜单可以是 SonataAdmin 服务,使用 Knp 菜单提供器创建的菜单,或自定义控制器的路由。

在菜单中添加自定义控制器条目

在管理菜单中添加自定义控制器条目

创建您的控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
use Symfony\Component\HttpFoundation\Response;

final class BlogController
{
    /**
     * @Route("/blog", name="blog_home")
     */
    public function blogAction(): Response
    {
        // ...
    }

    /**
     * @Route("/blog/article/{articleId}", name="blog_article")
     */
    public function ArticleAction(string $articleId): Response
    {
        // ...
    }
}

将控制器路由添加为菜单项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# config/packages/sonata_admin.yaml

sonata_admin:
    dashboard:
        groups:
            news:
                label:                ~
                translation_domain:   ~
                items:
                    - sonata.news.admin.post
                    - route:        blog_home
                        label:        Blog
                    - route:        blog_article
                        route_params: { articleId: 3 }
                        label:        Article

如果您想向具有不同角色的用户显示您的路由,您可以为每个路由配置此项。如果未设置,将检查组角色。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# config/packages/sonata_admin.yaml

sonata_admin:
    dashboard:
        groups:
            news:
                label:                ~
                translation_domain:   ~
                items:
                    - sonata.news.admin.post
                    - route:        blog_home
                        label:        Blog
                        roles:        ['ROLE_FOO', 'ROLE_BAR']
                    - route:        blog_article
                        route_params: { articleId: 3 }
                        label:        Article
                roles: ['ROLE_ADMIN', 'ROLE_SONATA_ADMIN']

您还可以覆盖 sonata 使用的 knp_menu 模板。默认模板为 `@SonataAdmin/Menu/sonata_menu.html.twig`

1
2
3
4
5
# config/packages/sonata_admin.yaml

sonata_admin:
    templates:
        knp_menu_template: '@ApplicationAdmin/Menu/custom_knp_menu.html.twig'

现在您有一个菜单组,其中包含指向 sonata 管理员(通过其 ID)、您的博客和特定文章的链接。

使用菜单提供器

如上所示,声明菜单的主要方法是在您的 sonata 管理员配置文件中声明项目。在某些情况下,您可能需要根据您的业务逻辑创建更复杂的菜单。这可以通过使用菜单提供器来填充整个菜单组来实现。这是通过 provider 配置值完成的。

以下配置使用菜单提供器来填充菜单组 my_group

1
2
3
4
5
6
7
8
# config/packages/sonata_admin.yaml

sonata_admin:
    dashboard:
        groups:
            my_group:
                provider: 'MyBundle:MyMenuProvider:getMyMenu'
                icon: 'fas fa-edit' # html is also supported

使用 KnpMenuBundle,您可以通过使用构建器类或将其声明为服务来创建自定义菜单。请参阅 Knp 文档 以获取更多信息。

在 sonata 中,无论您选择哪种实现,您只需将菜单别名提供给 provider 配置键即可

  • 如果您使用构建器类,您的菜单别名应类似于 MyBundle:MyMenuProvider:getMyMenu
  • 如果您使用服务,您的菜单别名是在 knp_menu.menu 标签中设置的别名。在以下示例中,它是 my_menu_alias
1
2
3
<service id="my_menu_provider" class="MyBundle/MyDirectory/MyMenuProvider">
    <tag name="knp_menu.menu" alias="my_menu_alias"/>
</service>

请注意,当使用 provider 选项时,您无法通过配置设置菜单标签。它在您的自定义菜单中完成。

扩展菜单

您可以通过事件修改菜单。您可以为名为 sonata.admin.event.configure.menu.sidebar 的事件注册任意数量的监听器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// src/EventListener/MenuBuilderListener.php

namespace App\EventListener;

use Sonata\AdminBundle\Event\ConfigureMenuEvent;

final class MenuBuilderListener
{
    public function addMenuItems(ConfigureMenuEvent $event): void
    {
        $menu = $event->getMenu();

        $child = $menu->addChild('reports', [
            'label' => 'Daily and monthly reports',
            'route' => 'app_reports_index',
        ])->setExtras([
            'icon' => 'fas fa-bar-chart', // html is also supported
        ]);
    }
}
1
2
3
4
5
6
7
# config/services.yaml

services:
    app.menu_listener:
        class: App\EventListener\MenuBuilderListener
        tags:
            - { name: kernel.event_listener, event: sonata.admin.event.configure.menu.sidebar, method: addMenuItems }

请参阅 使用事件来允许扩展菜单 以获取更多信息。

隐藏菜单项

您可以修改菜单以隐藏某些菜单项。您需要在您的管理员服务中添加 show_in_dashboard 选项,或从 sonata_admin 仪表板组配置中删除菜单项

1
2
3
4
5
6
# config/services.yaml

sonata_admin.admin.post:
    class: Sonata\AdminBundle\Admin\PostAdmin
    tags:
        - { name: sonata.admin, model_class: Sonata\AdminBundle\Entity\Post, controller: Sonata\AdminBundle\Controller\CRUDController, manager_type: orm, group: admin, label: Post, show_in_dashboard: false }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# config/packages/sonata_admin.yaml

sonata_admin:
    dashboard:
        groups:
            news:
                label:                ~
                translation_domain:   ~
                items:
                  # comment or remove the sonata.news.admin.post declaration to hide it from the menu.
                  #  - sonata.news.admin.post
                    - route:        blog_home
                      label:        Blog
                    - sonata.news.admin.news

保持菜单组打开

您可以将 keep_open 选项添加到菜单组,以使该组始终保持打开状态并忽略打开/关闭效果

1
2
3
4
5
6
7
8
9
10
11
12
13
# config/packages/sonata_admin.yaml

sonata_admin:
    dashboard:
        groups:
            sonata.admin.group.content:
                keep_open:          true
                label:              sonata_media
                translation_domain: SonataMediaBundle
                icon:               'fas fa-image' # html is also supported
                items:
                    - sonata.media.admin.media
                    - sonata.media.admin.gallery
The navigation side bar with a group which uses "keep_open" option

显示不带树状视图的菜单项

您可以修改菜单以显示不带树状视图的菜单项。您需要在您的管理员服务或 sonata_admin 仪表板组配置中添加 on_top 选项

1
2
3
4
5
6
# config/services.yaml

sonata_admin.admin.post:
    class: Sonata\AdminBundle\Admin\PostAdmin
    tags:
        - { name: sonata.admin, model_class: Sonata\AdminBundle\Entity\Post, controller: Sonata\AdminBundle\Controller\CRUDController, manager_type: orm, group: admin, label: Post, on_top: true }
1
2
3
4
5
6
7
8
9
10
11
# config/packages/sonata_admin.yaml

sonata_admin:
    dashboard:
        groups:
            news:
                on_top:             true
                label:              ~
                translation_domain: ~
                items:
                    - sonata.news.admin.post
on_top option

在此屏幕截图中,我们向 TagBlog Post 管理员服务添加了 on_top 选项。

您不能同时为两个或多个项目使用此选项

1
2
3
4
5
6
7
8
9
10
11
12
13
# config/packages/sonata_admin.yaml

sonata_admin:
    dashboard:
        groups:
            news:
                on_top:            true
                label:              ~
                translation_domain: ~
                items:
                    - sonata.news.admin.post
                    - route:        blog_home
                      label:        Blog

在这种情况下,您会收到异常:“您不能对多个同名组使用 on_top 选项”。

这项工作,包括代码示例,根据 Creative Commons BY-SA 3.0 许可获得许可。
目录
    版本