在自定义目录路径中重新分配模板
Reassign template in custom directory path
我正在尝试将视图模型模板更新为自定义结构中的模板。
首先,我使用以下代码将以下 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);
而且 id 需要确保我也可以使用该目录中的自定义布局。
更新
我通过以下方式让它工作:
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']);
}
但问题是这是硬编码的,我无权访问请求,所以我无法获取模块、控制器、操作
不需要您更新的解决方案,您可以使用配置提供程序功能从模块提供配置,它将被模块管理器拾取并在合并配置事件中合并:
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/
我正在尝试将视图模型模板更新为自定义结构中的模板。
首先,我使用以下代码将以下 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);
而且 id 需要确保我也可以使用该目录中的自定义布局。
更新
我通过以下方式让它工作:
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']);
}
但问题是这是硬编码的,我无权访问请求,所以我无法获取模块、控制器、操作
不需要您更新的解决方案,您可以使用配置提供程序功能从模块提供配置,它将被模块管理器拾取并在合并配置事件中合并:
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/