我正在尝试将视图模型模板更新为自定义结构中的模板。
首先,我使用以下代码将以下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']);
}
但是问题是这是硬编码的,我无法访问请求,所以我无法获取模块,控制器,动作
答案 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/