🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# **模板定位** 默认规则: 视图目录(view)/控制器名(小写)/操作名(小写)+模板后缀.html 我们可以通过修改config.php配置文件的`view_base`与`view_path` ``` 'template' => [ // 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 'auto_rule' => 1, // 模板引擎类型 支持 php think 支持扩展 'type' => 'Think', // V5.0.3+ 视图基础目录,配置目录为所有模块的视图起始目录 //用于定义全局的视图根目录,然后模块作为子目录 'view_base' => '', // 当前模块的模板视图目录 留空为自动获取 'view_path' => '', // 模板后缀 'view_suffix' => 'html', // 模板文件名分隔符 'view_depr' => DS, // 模板引擎普通标签开始标记 'tpl_begin' => '{', // 模板引擎普通标签结束标记 'tpl_end' => '}', // 标签库标签开始标记 'taglib_begin' => '{', // 标签库标签结束标记 'taglib_end' => '}', // 预先加载的标签库 'taglib_pre_load' => 'app\common\taglib\Demo', ], ``` 默认情况下`view_base`与`view_path`都为空,系统自动赋值`view_path`为view,所以我们的模版文件在每个模块下的view目录里 如果设置了view_base的值且不为空,那么优先读取view_base,替换掉原来的application/module/view根目录 如设置`'view_base'=>'/../public/view/',` 那么视图目录就从application/module/view变成public/view 加载模版文件的方法为 ``` return new \think\View\View()->fetch('模块@控制器/操作') ``` >[danger]详细内容查看 视图章节的模版渲染 # **模板标签** ## 普通标签 >[info]用于变量输出和模板注释 普通模板标签默认以`{`和`}`作为开始和结束标识,{里面开头不能出现空格} 修改标签只需要修改配置文件如下选项 ~~~ 'template' => [ // 模板引擎 'type' => 'think', // 普通标签开始标记 'tpl_begin' => '<{', // 普通标签结束标记 'tpl_end' => '}>' ], ~~~ ## 标签库标签 >[info]用于模板变量输出、文件包含、条件控制、循环输出等功能 修改下面的配置参数即可修改标签库标签 ~~~ 'template' => [ // 模板引擎 'type' => 'think', //标签库标签开始标签 'taglib_begin' => '<', //标签库标签结束标记 'taglib_end' => '>', ], ~~~ ### **自定义标签库标签** 下面以标签库放在`common`作为一个示例: ~~~ <?php namespace app\common\taglib; use think\template\TagLib; class Demo extends TagLib{ /** * 定义标签列表 */ protected $tags = [ // 标签定义: attr 属性列表 close 是否闭合(0 或者1 默认1) alias 标签别名 level 嵌套层次 'close' => ['attr' => 'time,format', 'close' => 0], //闭合标签,默认为不闭合 'open' => ['attr' => 'name,type', 'close' => 1], ]; /** * 这是一个闭合标签的简单演示 */ public function tagClose($tag) { $format = empty($tag['format']) ? 'Y-m-d H:i:s' : $tag['format']; $time = empty($tag['time']) ? time() : $tag['time']; $parse = '<?php '; $parse .= 'echo date("' . $format . '",' . $time . ');'; $parse .= ' ?>'; return $parse; } /** * 这是一个非闭合标签的简单演示 */ public function tagOpen($tag, $content) { $type = empty($tag['type']) ? 0 : 1; // 这个type目的是为了区分类型,一般来源是数据库 $name = $tag['name']; // name是必填项,这里不做判断了 $parse = '<?php '; $parse .= '$test_arr=[[1,3,5,7,9],[2,4,6,8,10]];'; // 这里是模拟数据 $parse .= '$__LIST__ = $test_arr[' . $type . '];'; $parse .= ' ?>'; $parse .= '{volist name="__LIST__" id="' . $name . '"}'; $parse .= $content; $parse .= '{/volist}'; return $parse; } } ~~~ 这时候我们的控制器继承`Controller`,在配置参数中配置: ~~~ 'template' => [ // 模板引擎类型 支持 php think 支持扩展 'type' => 'Think', // 模板路径 'view_path' => '', // 模板后缀 'view_suffix' => '.html', // 预先加载的标签库 'taglib_pre_load' => 'app\common\taglib\Demo', ], ~~~ 我们就可以在控制器中对模版赋值: ~~~ //给模版给以一个当前请求时间戳的值 $this->assign('demo_time',$this->request->time()); ~~~ 在模版中调用我们已经预先加载的标签: ~~~ <h1>闭合标签</h1> {demo:close time='$demo_time'/} <hr> <h1>非闭合标签</h1> {demo:open name='demo_name'} {$key}=>{$demo_name}<br> {/demo:open} <br> {demo:open name='demo_name' type='1'} {$key}=>{$demo_name}<br> {/demo:open} ~~~ 内置的模板引擎除了支持普通变量的输出之外,更强大的地方在于标签库功能。 > 标签库类似于Java的Struts中的JSP标签库,每一个标签库是一个独立的标签库文件,标签库中的每一个标签完成某个功能,采用XML标签方式(包括开放标签和闭合标签)。 标签库分为内置和扩展标签库,内置标签库是`Cx`标签库。 ## 导入标签库 使用taglib标签导入当前模板中需要使用的标签库,例如: ~~~ {taglib name="html" /} ~~~ > 如果没有定义html标签库的话,则导入无效。 也可以导入多个标签库,使用: ~~~ {taglib name="html,article" /} ~~~ 导入标签库后,就可以使用标签库中定义的标签了,假设article标签库中定义了read标签: ~~~ {article:read name="hello" id="data" } {$data.id}:{$data.title} {/article:read} ~~~ 在上面的标签中,`{article:read}... {/article:read}`就是闭合标签,起始和结束标签必须成对出现。 如果是`{article:read name="hello" /}`就是开放标签。 > 闭合和开放标签取决于标签库中的定义,一旦定义后就不能混淆使用,否则就会出现错误。 ## 内置标签 内置标签库无需导入即可使用,并且不需要加XML中的标签库前缀,ThinkPHP内置的标签库是Cx标签库,所以,Cx标签库中的所有标签,我们可以在模板文件中直接使用,我们可以这样使用: ~~~ {eq name="status" value="1" } 正常 {/eq} ~~~ 如果Cx不是内置标签的话,可能就需要这么使用了: ~~~ {cx:eq name="status" value="1" } 正常 {/cx:eq} ~~~ 更多的Cx标签库中的标签用法,参考[内置标签](https://www.kancloud.cn/manual/thinkphp5/125015#)。 内置标签库可以简化模板中标签的使用,所以,我们还可以把其他的标签库定义为内置标签库(前提是多个标签库没有标签冲突的情况),例如: ~~~ 'taglib_build_in' => 'cx,article' ~~~ 配置后,上面的标签用法就可以改为: ~~~ {read name="hello" id="data" } {$data.id}:{$data.title} {/read} ~~~ ## 标签库预加载 标签库预加载是指无需手动在模板文件中导入标签库即可使用标签库中的标签,通常用于某个标签库需要被大多数模板使用的情况。 在应用或者模块的配置文件中添加: ~~~ 'taglib_pre_load' => 'article,html' ~~~ 设置后,模板文件就不再需要使用 ~~~ {taglib name="html,article" /} ~~~ 但是仍然可以在模板中调用: ~~~ {article:read name="hello" id="data" } {$data.id}:{$data.title} {/article:read} ~~~