如何在ZF2中呈现当前视图

时间:2012-12-03 13:06:27

标签: zend-framework2 viewrendering

有没有办法让当前视图在zend框架2中呈现?

我相信这应该可以通过事件系统实现,但我似乎无法使其发挥作用。

我想获取此信息的原因是我可以自动包含同名的.js文件,这样可以节省每次我在操作中时指定此规则的时间。

非常感谢, 汤姆

2 个答案:

答案 0 :(得分:3)

我不太清楚你在ZF2中渲染当前视图的意思,但是这里你可以自动添加一个以动作命名的js文件。把它放在你的控制器中:

public function onDispatch(MvcEvent $mvcEvent)
{
    $renderer = $this->serviceLocator->get('Zend\View\Renderer\PhpRenderer');
    $actionName = $mvcEvent->getRouteMatch()->getParam('action');
    $jsFile = $actionName . '.js';
    $baseUrl = $mvcEvent->getRouter()->getBaseUrl();
    $renderer->headScript()->appendFile($baseUrl . '/js/' . $jsFile);

    return parent::onDispatch($mvcEvent);
}

您可能需要调整js文件位置和名称的代码。在操作之前自动调用onDispatch方法。

答案 1 :(得分:1)

谢谢Wunibald,

您的示例运行良好,我已将其修改为附加到事件,以便它适用于每个控制器/模块。为此,我将它包含在我的应用程序模块中的onBootstrap函数中。

$events = StaticEventManager::getInstance();

    $events->attach('Zend\\Mvc\\Application', 'dispatch', function(\Zend\EventManager\Event $event)
    {
        $baseUrl = $event->getRouter()->getBaseUrl();
        $renderer = $event->getApplication()->getServiceManager()->get('Zend\View\Renderer\PhpRenderer');

        $action = $event->getRouteMatch()->getParam('action');
        $controller = $event->getRouteMatch()->getParam('controller');

        if (strlen($controller) > 0)
        {
            list($module, $_null, $controller) = explode('\\', $controller);

            $renderer->headScript()->appendFile($baseUrl . '/module/' . $module . '/view/' . strtolower($module) . '/' . strtolower($controller) . '/' . strtolower($action) . '.js');
            $renderer->headScript()->appendFile($baseUrl . '/module/' . $module . '/view/' . strtolower($module) . '/' . strtolower($module) . '.js');
        }
    });

再次感谢你指出我正确的方向。