在自定义目录路径中重新分配模板

时间:2018-10-14 07:32:15

标签: zend-framework view zend-framework3

我正在尝试将视图模型模板更新为自定义结构中的模板。

首先,我使用以下代码将以下view_manager config合并到service manager config中:

$config = ArrayUtils::merge($config,$selConf);
$this->serviceManager->setAllowOverride(true);
$this->serviceManager->setService('Config',$config);
$this->serviceManager->setAllowOverride(false);

这是合并的内容,请求以publicweb作为模块,index作为控制器,index作为动作:

 array (size=1)
  'view_manager' => 
    array (size=2)
      'template_map' => 
    array (size=1)
      'publicweb/index/index' => string '/srv/app/client/design/gopher/publicweb/index/index/template.phtml' (length=95)
      'template_path_stack' => 
    array (size=1)
      0 => string '/srv/app/client/design/gopher' (length=58)

最后,我执行了这段代码:

$view = $e->getViewModel();
$view->setTemplate('publicweb/index/index');

结果不正确。

我也尝试过:

$view = $e->getViewModel();
$view->setTemplate('publicweb/index/index/template');

结果不正确,抛出异常Unable to render template

我将模板路径堆栈/srv/app/client/design/gopher推到了template_stack_path array的开头,因此它可以找到第一个并且仍然无法正常工作。

不确定发生了什么。还需要注意的是,这是通过以下方式作为事件执行的:

$events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
        MvcEvent::EVENT_DISPATCH,[$this,'assignTemplates'],500);

来自Application Module

应该注意的是,此事件还在viewhelperpluginmanager的渲染器中的视图助手中添加了JS和CSS文件:

 $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
        MvcEvent::EVENT_DISPATCH,[$this,'hydrateJsAssets'],500);

而且我还需要确保我也可以使用该目录中的自定义布局。

更新

我能够通过以下方式使它起作用:

    public function onMergeConfig(ModuleEvent $event){
        parent::onMergeConfig($event);  
        $configListener = $event->getConfigListener();
        $sm = $event->getParam('ServiceManager');
        $config = $configListener->getMergedConfig(false);
        $selConf = [
            'view_manager' => [
                'template_map'=>[
                    'publicweb/index/index' => '/srv/app/client/design/gopher/publicweb/index/index/template.phtml',
                ]
            ]
        ];
        $config = ArrayUtils::merge($config,$selConf);
        $configListener->setMergedConfig($config);
        $event->setConfigListener($configListener);
        $sm->setAllowOverride(true);
        $sm->setService('Config',$config);
        $sm->setAllowOverride(false);
    }

通过

 public function init(ModuleManager $moduleManager) {
    $events = $moduleManager->getEventManager();
    $events->attach(ModuleEvent::EVENT_MERGE_CONFIG,[$this,'onMergeConfig']);        
}

但是问题是这是硬编码的,我无法访问请求,所以我无法获取模块,控制器,动作

1 个答案:

答案 0 :(得分:0)

不需要更新的解决方案,您可以使用config provider功能从模块提供配置,它将由模块管理器提取并在merge config事件中合并:

namespace Foo;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\Mvc\MvcEvent;

class Module
{
    public function getConfig()
    {
        return [
            'view_manager' => [
                'template_map' => [
                    // change to application root relative paths
                    'publicweb/index/index' => '/srv/app/client/design/gopher/publicweb/index/index/template.phtml',
                ],
            ],
        ];
    }

    /**
     * Register layout listener
     */
    public function onBootstrap(MvcEvent $e)
    {
        $e->getApplication()
            ->getEventManager()
            ->getSharedManager()
            ->attach(AbstractActionController::class, 'dispatch', function($e) {
                $controller = $e->getTarget();
                $controllerClass = get_class($controller);
                $config = $e->getApplication()
                    ->getServiceManager()
                    ->get('config');
                // do your logic here, you have controller class and config
                if ($logic) {
                    $controller->layout($layout);
                }
            }, 100);
    }
}

关于更改布局的不错的文章也适用于zf3 https://www.masterzendframework.com/views/change-layout-controllers-actions-zend-framework-2/