我正在尝试将仪表板添加到我的 ZF2 应用程序。我想通过收集来自多个模块的视图来构建仪表板。我添加到应用程序的每个模块都需要将它自己的视图添加到仪表板。
我不确定哪个是最好的方法。这是我的想法:
1. 在呈现仪表板的控制器动作中,我触发了一个事件。这个事件被我的模块捕获,例如在他们的 init() 方法中。每个模块都添加自己的 ViewModel。在我的控制器操作中,我可以将它们添加到基本 ViewModel。问题:无法为仪表板部分设置排序顺序(其他模块添加的 ViewModel)
2. 我可以扩展 ZF2 Navigation 以收集比标签和路线更多的信息。它需要收集可以创建小部件的标题和工厂类名称,然后像原生导航渲染菜单项一样渲染它们。然后我可以从模块配置中将部件添加到仪表板。我不确定这是否可能,但我需要深入研究 ZF2 Navigation 才能找到答案。我真的不认为有可能创建这样一个复杂的仪表板。
我的仪表板需要什么?例如,我想列出具有关键耐磨库存的产品。
你们将如何建立这样的仪表板?
[编辑-用法]
嘿@Rudolph Gottesheim,当我找到更多时间时,我将更详细地解释它是如何工作的。为了给你一个快速的答案,我将解释我现在如何使用仪表板。
我现在可以在我的 module.config.php 中配置多个仪表板,它看起来像这样
'application_dashboard' => array(
'application' => array(
'elements' => array (
array(
'label'=>'some dashboard element',
'sortorder'=>2,
//'contentString'=>'instead of contentService or contentElement'
//'contentElement'=> new SomeDashboardElementContent(),
'contentService'=>'name_of_a_service_that_provides_an_element',
'viewHelper'=>'name_of_a_viewhelper'
),
),
),
'admin' => array(
'elements' => array (
array(
'label'=>'label for admin dashboard element',
'sortorder'=>2,
//'contentString'=>'hello world'
),
),
),
),
所以我可以从每个模块中添加新的仪表板和新元素。这些元素可能会变得非常复杂,例如,仪表板元素可以呈现数据库中的用户网格。这就是为什么我最终在元素配置中使用了“contentService”。
该服务完成所有复杂的工作并可以访问其他服务,因此它可以构建任何内容并返回元素。我的 DashboardProviderService 将使用 ServiceLocator 调用配置的“contentService”以获取元素。'viewHelper' 的值是一个知道如何渲染特定元素的 ViewHelper。正如我所说,该元素可以包含一个网格,甚至是一个 ViewModel。我的 DashboardProviderService 使用 ViewHelperManager 服务从该配置中检索特定的 ViewHelper。
我还创建了一个 ViewModelRenderer 视图助手,它可以访问 ZF2 的 ViewRenderer 服务,因此元素也可以包含 ViewModel 的实例。
当它不是动态元素时,也可以直接添加“contentElement”,或者只添加将要在仪表板元素内呈现的字符串。
这是我将在稍后发布并详细解释的当前课程列表:
Application\Service\DashboardProviderService
Application\Dashboard\Container implements Countable, RecursiveIterator
Application\Dashboard\Dashboard extends Application\Dashboard\Container
Application\Dashboard\Element\Element
Application\Dashboard\View\Helper
[编辑-类]
... 快来了 ...
[编辑 - 后续步骤]
- 我将为仪表板元素添加一个“路线”值,可用于在整个仪表板元素上呈现按钮或链接
- 我将集成仪表板的访问控制,以便按用户的角色权限过滤仪表板。我正在使用 ZfcRbac 和路由防火墙,所以目前我正在考虑通过元素的配置路由值过滤对仪表板元素的访问。