我正在创建一个名为Template
的ZF2模块。见下文:
在我的module.config.php
中,我的视图管理器和控制器配置如下:
return array(
// Telling where the views are
'view_manager' => array(
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => array(
'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
'template/my/index' => __DIR__ . '/../view/template/myctrl/index.phtml',
'error/404' => __DIR__ . '/../view/error/404.phtml',
'error/index' => __DIR__ . '/../view/error/index.phtml',
),
'template_path_stack' => array(
__DIR__ . '/../view',
),
),
// Mapping controller names to controller files
'controllers' => array(
'invokables' => array(
'Template\Controller\MyCtrl' => 'Template\Controller\MyController'
)
),
在template_map
中,我必须使用template/my/index
值而不是template/myctrl/index
,否则,我会收到以下错误消息:
Zend\View\Renderer\PhpRenderer::render:
Unable to render template "template/my/index";
resolver could not resolve to a file
为什么?
答案 0 :(得分:1)
所以,这有点令人困惑,因为你在一个名为'template'的模块中渲染视图模板时遇到了麻烦,但是,我不认为这是一个bug。
假设您没有尝试从控制器渲染特定视图,ZF将根据模块名称,控制器名称和操作名称确定要使用的视图。 (我不认为您在控制器invokables
中使用的别名是相关的。)对于控制器,它将删除任何名称空间并剥离“Controller”后缀(如果存在)。所以template/my/index
就是你留下的。
你没有拥有来使用template_map(它是可选的,可以提高性能),但在你的情况下,因为你的视图文件夹名为myctrl
,渲染只能起作用如果您使用模板地图将ZF正在查找的内容映射到实际位置。
我建议您只需将myctrl
视图文件夹重命名为my
并删除模板映射条目(暂时),然后一切都应该正常工作。
答案 1 :(得分:0)
找到您的templatemap_generator.php
文件。它应该在您的ZF2/bin
文件夹中。导航到您的模块文件夹,例如Application
文件夹所在的src, view, config
目录。打开终端并键入php ../../vendor/ZF2/bin/templatemap_generator.php
ZF将在模块目录中创建模板映射。现在使用此模板,只需修改module.config.php文件
return array(
// Telling where the views are
'view_manager' => array(
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => include __DIR__ . '/../template_map.php',
),
// Mapping controller names to controller files
'controllers' => array(
'invokables' => array(
'Template\Controller\MyCtrl' => 'Template\Controller\MyController'
)
),
在myAction()
$view = new ViewModel();
$view->setTemplate("template/myctrl/index");
我打电话给template/my/index
,因为这是生成器将要生成的内容,但您可以随意重命名为任意内容。
答案 2 :(得分:0)
您可以使用controller_map
更精细地控制渲染模板的名称。
所以在你的情况下你可能会这样做:
return array(
// Telling where the views are
'view_manager' => array(
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => array(
'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
'template/my/index' => __DIR__ . '/../view/template/myctrl/index.phtml',
'error/404' => __DIR__ . '/../view/error/404.phtml',
'error/index' => __DIR__ . '/../view/error/index.phtml',
),
'template_path_stack' => array(
__DIR__ . '/../view',
),
'controller_map' => array(
'Template\Controller\MyCtrl' => 'template/myctrl',
),
),
// Mapping controller names to controller files
'controllers' => array(
'invokables' => array(
'Template\Controller\MyCtrl' => 'Template\Controller\MyController'
)
),