布局中的ZF2小部件/视图

时间:2014-08-27 17:42:03

标签: php zend-framework2 widget viewhelper

我正在开发一个网站,我需要在我的Zend Framework 2布局中使用“小部件”视图。 小部件应该显示服务器的运行状态(已完成)。

(如果这是糟糕的MVC风格,请纠正我) 我用

构建了一个控制器
function viewStatusAction(){ 
   ... 
   return $viewModel(array($vars))
}

然后我想使用viewHelper来获取动作的状态。 这就是我被困住的地方。我知道如何创建viewHelper,但不知道从控制器操作开始获取返回视图的位置。 那我该怎么做呢?

2 个答案:

答案 0 :(得分:3)

您可以使用Zend\Mvc\Controller\Plugin\Forward控制器插件从另一个内部发送另一个控制器操作。

文档说

  

有时,您可能希望从匹配的控制器中调度其他控制器 - 例如,您可以使用此方法来构建“widgetized”内容。 Forward插件有助于实现这一目标。

如果您已经有这些操作但希望将它们与其他操作结合起来构建聚合视图,这将非常有用。

use Zend\View\Model\ViewModel;

class AdminController extends AbstractActionController 
{
    public function adminDashboardAction()
    {
        $view = new ViewModel();
        $view->setTemplate('admin/admin/dashboard');

        //..
        $serverStatsWidget = $this->forward()->dispatch('ServiceModule\Controller\Server', array(
            'action' => 'status',
            'foo' => 'bar',
        ));
        if ($serverStatsWidget instanceof ViewModel) {

            $view->addChild($serverStatsWidget, 'serviceStats');
        }

        return $view;
    }

由于$serverStatsWidget是调度控制器的结果,您可以将其作为子项添加到“主”视图中,并使用echo呈现结果。

// admin/admin/dashboard.phtml
echo $this->serviceStats;

答案 1 :(得分:2)

这就是我所做的。这也应该是正确的方法

在module.php中

public function getViewHelperConfig()
{
    return array(
        'factories' => array(
            'statusWidget' => function ($sm) {
                -- some service handling --
                $statusWidget = new statusWidget($service);
                return $statusWidget;
            }
        )
    );
}

然后我在operationalStatus \ View \ Helper

中创建了一个viewHelper
<?php
namespace operationalStatus\View\Helper;

use Zend\View\Helper\AbstractHelper;

class statusWidget extends AbstractHelper
{

    public function __construct($service){
        $this->service = $service
    }

    public function __invoke()
    {
        -- collect data from the service --

        return $this->getView()->render('operational-status/widget/status', array('operation' => $status));
    }

}