【问题标题】:ZF2 Dashboard - need to add views from multiple modulesZF2 Dashboard - 需要添加来自多个模块的视图
【发布时间】:2014-07-10 23:48:07
【问题描述】:

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

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

1。 在呈现仪表板的控制器操作中,我触发了一个事件。这个事件被我的模块捕获,例如在他们的 init() 方法中。每个模块都添加自己的 ViewModel。在我的控制器操作中,我可以将它们添加到基本 ViewModel。 问题:无法为 Dashboard partials(其他模块添加的 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 和路由防火墙,所以目前我正在考虑通过元素的配置路由值过滤对仪表板元素的访问。

【问题讨论】:

    标签: zend-framework2 doctrine dashboard modular-design


    【解决方案1】:

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

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

    【讨论】:

    • 嘿鲁道夫,你的想法听起来很不错,听起来正是我想做的。如果我不知道该怎么做,我会回来找你的 :-)
    • 感谢您接受我的回答。只是出于好奇......你到底做了什么?
    【解决方案2】:

    您可以使用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; ?>
    

    【讨论】:

    • 感谢 AlexP,但这不是我想要实现的。这样我就不能真正以模块化的方式构建仪表板。这样,我需要为我添加的每个新模块编辑我的仪表板模块。鲁道夫的回答更像是 ZF2 认为应该做的方式。
    【解决方案3】:

    终于有时间试一试。这种方式效果很好。 如果有人需要帮助来做类似的事情,我可以发布我的代码。我的Dashboard 类和DashboardElement 有点复杂,但服务很简单。 在我的 phtml 视图中,我现在可以做到这一点echo $this-&gt;appDashboard()-&gt;render();

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

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

    谢谢@Rudolph Gottesheim

    【讨论】:

      猜你喜欢
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多