Zend framework2 ZF2仪表板-需要添加来自多个模块的视图

Zend framework2 ZF2仪表板-需要添加来自多个模块的视图,zend-framework2,doctrine,dashboard,modular-design,Zend Framework2,Doctrine,Dashboard,Modular Design,我正在尝试将仪表板添加到我的ZF2应用程序中。 我想通过收集多个模块的视图来构建仪表板。我添加到应用程序中的每个模块都需要将自己的视图添加到仪表板中 我不确定哪种方法是最好的。以下是我的想法: 一,。 在呈现仪表板的控制器操作中,我触发一个事件。此事件由我的模块捕获,例如在它们的init()方法中。每个模块都添加自己的ViewModel。在控制器操作中,我可以将它们添加到基本ViewModel。 问题:无法为仪表板部件(由其他模块添加的ViewModels)设置排序顺序 二,。 我可以扩展ZF2

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

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

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

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

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

你们怎么建立这样一个仪表盘

[编辑-用法]

嘿@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和路由防火墙,因此目前我正在考虑通过配置的elemens路由值过滤对仪表板元素的访问

您可以使用
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; ?>
//dashboard.phtml
我的产品
我的销售
(听起来你好像知道自己在ZF2中做什么,所以我将以类名的形式向你介绍一些想法。如果你想澄清,请告诉我,我会更新我的答案。)


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

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

appDashboard是我在模块ViewHelperConfig中设置的自定义
ViewHelper
。初始化时,它将获得
仪表板提供程序
服务

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


谢谢@Rudolph Gottesheim

嘿,Rudolph,你的主意听起来很好,听起来正是我想做的。如果我不知道如何继续下去,我会报复你的:-)谢谢你接受我的回答。只是出于好奇。。你到底做了什么?谢谢AlexP,但这不是我想知道的。这样我就无法真正以模块化的方式构建仪表板。这样,我需要为我添加的每个新模块编辑我的仪表板模块。鲁道夫的回答是ZF2认为应该采取的方式更多。