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

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/