2

我正在尝试将仪表板添加到我的 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 和路由防火墙,所以目前我正在考虑通过元素的配置路由值过滤对仪表板元素的访问。
4

3 回答 3

1

(你听起来好像你知道你在 ZF2 中在做什么,所以我将以类名的形式向你提出一些想法。如果你想澄清一下,请告诉我,我会更新我的答案.)

我将创建一个Dashboard包含DashboardItems 的类、一个$this->dashboard($dashboard)视图助手和一个DashboardProvider可以访问配置的服务。然后我会在每个模块的配置文件中添加仪表板项目并从中构建项目。

于 2014-07-12T12:58:06.170 回答
0

您可以使用forward()控制器插件来构建聚合视图。该插件将调度目标控制器操作并返回视图模型。

一个非常简单的例子

 // FooController
 public function dashboardAction() {

   $view = new ViewModel(array('foo' => $foo));

   $productsView = $this->forward()->dispatch(
     'MyModule\Controller\Products', array('action' => 'index')
   );
   $salesView = $this->forward()->dispatch(
     'Sales\Controller\Sales', array('action' => 'sales-figures')
   );

   $view->addChild($productsView, 'products');
   $view->addChild($salesView, 'sales');

   return $view;
 }

在视图中输出

// dashboard.phtml

<h3>My Products</h3>
<?php echo $this->products; ?>

<h3>My Sales</h3>
<?php echo $this->sales; ?>
于 2014-07-11T08:30:37.183 回答
0

终于找时间试了一下。这种方式效果很好。如果有人需要帮助来做类似的事情,我可以发布我的代码。我的DashboardDashboardElement有点复杂,但服务很简单。在我的 phtml 视图中,我现在可以执行此操作echo $this->appDashboard()->render();

appDashboard 是我ViewHelper在模块 ViewHelperConfig 中设置的自定义。它在DashboardProvider初始化时获取服务。

在下一步中,我将更改我ViewHelper和我的DashboardProvider服务,以便我可以配置和输出多个仪表板。例如,用于管理员的额外仪表板。然后我的视图代码将看起来像这样或类似的东西echo $this->appDashboard('admin')->render();

谢谢@Rudolph Gottesheim

于 2014-07-30T19:27:39.150 回答