ZF2仪表板 - 需要从多个模块添加视图

时间:2014-07-10 23:48:07

标签: zend-framework2 doctrine dashboard modular-design

我正在尝试将仪表板添加到我的ZF2应用程序中。 我想通过从多个模块收集视图来构建仪表板。我添加到应用程序的每个模块都需要将它自己的视图添加到仪表板。

我不确定哪种方法最好。以下是我的想法:

1。 在渲染仪表板的控制器动作中,我触发一个事件。我的模块捕获此事件,例如在他们的init()方法中。每个模块都添加它自己的ViewModel。在我的控制器操作中,我可以将它们添加到基础ViewModel。 问题:没有可能为仪表板部分设置排序顺序(由其他模块添加的ViewModels)

2。 我可以扩展ZF2导航以收集比标签和路线更多的信息。它需要收集可以创建小部件的标题和工厂类名称,然后像本机导航一样呈现它们呈现菜单项。我可以从模块配置向仪表板添加零件。我不确定这是否可行,但我需要深入了解ZF2导航才能找到答案。我并不认为可以像这样创建一个复杂的仪表板。

我的仪表板需要什么? 例如,我想列出具有关键服装库存的产品。

你们怎么会建立这样的仪表板?

[编辑 - 用法]

嘿@Rudolph Gottesheim,当我找到更多时间时,我会更详细地解释它是如何工作的。为了给您一个快速的答案,我将解释如何使用仪表板进行操作。

我现在可以在module.config.php中配置多个Dashboards,它看起来像这个

    '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服务,因此Elements也可以包含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和路由防火墙,所以目前我正在考虑通过配置的elemens路由值来过滤对仪表板元素的访问。

3 个答案:

答案 0 :(得分:1)

(你听起来就像你知道你在ZF2中做了什么,所以我只想给你一些类名形式的想法。如果你想澄清一下,请告诉我,我会更新我的回答。)

我会创建一个包含Dashboard的{​​{1}}类,一个DashboardItem视图帮助程序和一个可以访问该配置的$this->dashboard($dashboard)服务。然后我会在每个模块的配置文件中添加仪表板项目,并从中构建项目。

答案 1 :(得分: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; ?>

答案 2 :(得分:0)

最后我找到了一些时间尝试一下。这种方式非常好用。 如果有人需要帮助来做类似的事情,我可以发布我的代码。我的Dashboard班级和DashboardElement有点复杂,但服务非常简单。 在我的phtml视图中,我现在可以执行此操作echo $this->appDashboard()->render();

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

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

谢谢@Rudolph Gottesheim