搜索
系统检测到您的用户名不符合规范:

TP5视图模板目录分离/定位(view_base/view_path/view_theme)主题实现

浏览:4904 发布日期:2017年09月22日 分类:ThinkPHP5专区 关键字: 视图 模板 分离 定位
[TP5 模板定位修改 ] 项目基于TP 5.0.10 实现
不喜勿喷,需要修改框架两个文件约20行代码

TP5 view_base 、view_path 模板定位思路不太适应,在app_debug不同状态下定位机制还不一样(一会相对目录,一会绝对目录,不会刷模板缓存)
修改为统一思路,支持控制器渲染时不指定模板名称自动定位,支持跨模块 @ 调用

修改后实现以下视图模板结构需求:
view_base、view_path、view_theme 都配置为相对文件夹名称,定位解析时统一转为基于Application的绝对路径,避免app_debug不同状态下定位机制或跨模块调用带来的问题 'template' => [
'type' => 'Think',
'view_base' => '',// 前后不带DS
'view_path' => 'view',// 前后不带DS
'view_theme' => '',// pc mobile 前后不带DS
'view_suffix' => 'html',
'view_depr' => DS
],
[全局视图层目录] 定义view_base,即不使用 view_path
Application\(view_base )\
------------(module_name1)\[(view_theme)]\
-------------------(controller1)\(action).html
-------------------(controller2)\(action).html
------------(module_name2)\[(view_theme)]\
-------------------(controller1)\(action).html
-------------------(controller2)\(action).html

[相对视图层目录] 定义view_path,把view_base定义为空,即不使用 view_base,
Application\
------------(module_name1)\(view_path)\[(view_theme)]\
-------------------(controller1)\(action).html
-------------------(controller2)\(action).html
------------(module_name2)\(view_path)\[(view_theme)]\
-------------------(controller1)\(action).html
-------------------(controller2)\(action).html

view_base、view_path 自定义,设为为相对文件夹名称即可,view_base默认为空,view_path默认为view
view_theme 可选,默认为空



[1]、关于配置项
增加一个view_theme的配置项

view_base 配置:默认'' ,全局视图层目录 (基于APP_PATH的路径, 前后不带DS)
view_path 配置:默认'view' ,相对视图层目录(module_name下视图层文件夹,前后不带DS)
view_theme 配置:默认'' ,主题相对目录(view_path下主题文件夹,前后不带DS)

如果配置了view_base,那么使用全局视图层目录(view_base[path])+([module_name])+([view_theme])
如果未配置view_base,那么使用相对视图层目录([module_path])+(view_path)+([view_theme])

[2]、用途
如需实现多套模板主题,控制器基类接受(或检测判断)、缓存主题名称,在控制器fetch或view()渲染试图前动态设置 view_theme 即可实现$this->view->config('view_theme', 'pc');
$this->view->config('view_theme', 'mobile');
$this->view->config('view_theme', 'blue');
$this->view->config('view_theme', 'red');
如不适用模板主题,把config 配置文件view_theme默认配置为空就行
注意:
如使用多主题,建议config统一配置view_theme或动态配置view_theme,调用fetch()渲染时不带 view_theme 主题名称

TP控制器渲染return $this->fetch();
return $this->fetch('aa/bb');
return $this->fetch('module_name@aa/bb');
自定义渲染$View=View::instance();
return $View->fetch('common@form_build/layout-form',['form_data'=>$form_data],[]);
[2.1]、相对视图层+(view_path)+[view_theme]
使用相对视图层, 把 config 配置文件view_base默认配置为空就行

[2.2]、全局视图层+[view_theme]
使用全局视图层, 把 config 配置文件view_base配置为全局视图层文件夹名称
config 配置文件统一约定后,可以直接实现全局视图层目录(view_base[path])+([module_name])+([view_theme])
启用全局视图层后,view_path就不需要了,还可以加入view_theme实现多套主题


[修改TP5文件]
[文件一] think\Templateprivate function parseTemplateFile($template){
.......
//[START] 模板定位修改
if (!isset($this->config['view_path']) || empty($this->config['view_path'])) {
$this->config['view_path'] = 'view';
}
if (!isset($this->config['view_theme'])) {
$this->config['view_theme'] = '';
}
$module = isset($module) ? $module : Request::instance()->module();

if (isset($this->config['view_base']) && !empty($this->config['view_base'])) {
//使用全局视图层目录
$path = APP_PATH . $this->config['view_base'] . DS . $module . DS;
} else {
//使用相对视图层目录
$path = APP_PATH . $module . DS . $this->config['view_path'] . DS;
}
!empty($this->config['view_theme']) && $path .= $this->config['view_theme'] . DS;
//[END] 模板定位修改
.......
}
[文件二] think\view\driver\Think //架构函数,注释自动设置view_path为绝对地址
public function __construct($config = [])
{
$this->config = array_merge($this->config, $config);
/*
if (empty($this->config['view_path'])) {
$this->config['view_path'] = App::$modulePath . 'view' . DS;
}
*/
$this->template = new Template($this->config);
}

private function parseTemplate($template){
.......
//[START] 模板定位修改
if (!isset($this->config['view_path']) || empty($this->config['view_path'])) {
$this->config['view_path'] = 'view';
}
if (!isset($this->config['view_theme'])) {
$this->config['view_theme'] = '';
}
$module = isset($module) ? $module : $request->module();

if (isset($this->config['view_base']) && !empty($this->config['view_base'])) {
//使用全局视图层目录
$path = APP_PATH . $this->config['view_base'] . DS . $module . DS;
} else {
//使用相对视图层目录
$path = APP_PATH . $module . DS . $this->config['view_path'] . DS;
}
!empty($this->config['view_theme']) && $path .= $this->config['view_theme'] . DS;
//[END] 模板定位修改
.......
}
最佳答案
评论() 相关
收藏
ygzhang
积分:3555 等级:LV4
热点推荐
(追記) (追記ここまで)
最新更新

我们

合作

网站

信息

ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

AltStyle によって変換されたページ (->オリジナル) /