将自定义奏鸣曲页面路由添加到导航栏

Posted

技术标签:

【中文标题】将自定义奏鸣曲页面路由添加到导航栏【英文标题】:Add custom Sonata page route to the navbar 【发布时间】:2016-02-18 19:24:41 【问题描述】:

我创建了一个自定义奏鸣曲页面

简单路线

medapp_adminStreamCommands:
    path:     /admin/stream
    defaults:  _controller: MedAppBundle:VideoChat/VideoChat:adminStreamCommands 

返回管理池的控制器

  public function adminStreamCommandsAction(Request $request)
    

        return $this->render('@MedApp/AdminSonata/Stream/stream_commands.html.twig', array(
            'admin_pool' => $this->get('sonata.admin.pool')));
    

普通视图模板

% extends '@MedApp/AdminSonata/standard_layout.html.twig' %

% block content %
foobar
% endblock content 

这行得通,我可以在我的网站上使用/admin/foo 访问它,我会得到一个页面,其中包含带有我的“foobar”内容的奏鸣曲管理模板。

我的问题是,如何在不修改默认模板的情况下将此路由添加到左侧和顶部导航栏? 那是因为左侧菜单是由 KNP 菜单呈现的:

% block side_bar_nav %
    % if app.user and is_granted('ROLE_SONATA_ADMIN') %
         knp_menu_render('sonata_admin_sidebar', template: admin_pool.getTemplate('knp_menu_template')) 
    % endif %
% endblock side_bar_nav %

我需要添加我的新页面以通过此菜单呈现。

通常,页面是通过服务添加的,但这些都是建立在实体之上的:

servicename:
     class: Bundle\Class
     arguments: [~, Bundle\Entity\Entityname, ~]
     tags:
         -  name: sonata.admin, manager_type: orm, group: admin, label: CustomName

不过,我的页面没有使用实体,只是静态内容或不依赖于实体的内容。

我已经知道我可以修改生成菜单的块,但我认为最好的方法是将我的类添加为标记为没有 orm manager_type 的 sonata.admin 的服务,在其他话,不是实体。怎么可能?

【问题讨论】:

【参考方案1】:

我认为这是不可能的,您必须创建一个新布局,复制 sonata admin layout 并根据您的需要对其进行自定义。

您可以通过更改 sonata_admin(模板 -> 布局)或 extending the SonataAdmin bundle 的 yml 配置并创建自己的 layout.html.twig 来更改使用的布局。

【讨论】:

我已经这样做了。但是,我需要根据管理池路由和我自己的自定义页面生成菜单。我在想奏鸣曲有办法通过 yml 文件或其他更简单的方法来完成,而不是让我创建自己的菜单。我想我不是第一个想要类似功能的人,但我找不到任何这样做的例子。 不知道除了创建自己的菜单是否还有其他方法,您还可以通过检查页面的当前路径并添加自己的html来设置自己的链接,这是一种肮脏的方式它但会工作。 确实如此。另一种方法是为模型设置一个管理类,该模型不是与 ORM 绑定的实体。我已经看到过关于这种方式的讨论,但同样,找不到任何关于如何做到这一点的例子。这肯定会起作用,因为我可以将路由添加到当前模型的 routecollection 并实现自定义操作。不幸的是,我找不到任何关于它的东西,或者如果它甚至可能的话。【参考方案2】:

您应该覆盖 standard_layout 并修改 side_bar_nav 块的内容。这是一种简单快捷的方法。或者您可以深入研究奏鸣曲代码以找到如何将一些东西注入admin_pool.dashboardgroups - 玩得开心:)

【讨论】:

我知道,这就是另一个答案所说的。我一直在寻找使用与 ORM 无关的实体的方法。这样我就可以为管理面板定义我自己的自定义数据,但菜单仍然会包含它,因为它将是一个带有 sonata.admin 标签的服务。

以上是关于将自定义奏鸣曲页面路由添加到导航栏的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义导航栏链接到导航控制器?

将自定义导航栏分配给 UINavigationController [重复]

将自定义 CSS 导航栏从水平转换为垂直

小程序自定义单页面全局导航栏

【微信小程序】自定义顶部导航栏

如何在 React 中登录页面后配置侧边栏导航中的路由?