## 关于视图(V)
* 控制器调用模型类后返回的数据通过视图组装成不同格式的输出。视图根据不同的需求,来决定调用模板引擎进行内容解析后输出还是直接输出。视图通常会有一系列的模板文件对应不同的控制器和操作方法,并且支持动态设置模板目录。
* ThinkPHP内置了一个基于XML的性能卓越的模板引擎,这是一个专门为ThinkPHP服务的内置模板引擎,使用了XML标签库技术的编译型模板引擎,支持两种类型的模板标签,使用了动态编译和缓存技术,而且支持自定义标签库。
* DaiCuo插件中的视图使用方法完全同ThinkPHP5的视图使用相同,可参考ThinkPHP5官方文档[视图](https://www.kancloud.cn/manual/thinkphp5/118112)章节。
* DaiCuo插件开发使用的模板规则为(后台放置在插件目录/view/...、前台为插件目录/theme/主题目录/...)
* DaiCuo插件应用在模板渲染会根据访客终端自动对应后台配置的移动端或者PC端主题 。
## 基类模板
DaiCuo框架则利用了TP的模板继承功能,内置了前后台两个基类模板(基于BootStrap4.6构建),开发者在需要前端开发时只需要继承这两个基类模板就可以了,实例如下:
* apps/common/views/admin.tpl 后台基类模板
* apps/common/views/front.tpl 前台基类模板
```
{extend name="apps/common/view/front.tpl" /}
{block name="header_meta"}......{/block}
{block name="header_header"}......{/block}
{block name="header_main"}......{/block}
{block name="header_footer"}......{/block}
```
## 模板继承
* 模板继承是一项更加灵活的模板布局方式,模板继承不同于模板布局,甚至来说,应该在模板布局的上层。
* 模板继承其实并不难理解,就好比类的继承一样,模板也可以定义一个基础模板(或者是布局),并且其中定义相关的区块(block),然后继承(extend)该基础模板的子模板中就可以对基础模板中定义的区块进行重载。
* 因此,模板继承的优势其实是设计基础模板中的区块(block)和子模板中替换这些区块。每个区块由`{block} {/block}`标签组成。 下面就是基础模板中的一个典型的区块设计(用于设计网站标题):
~~~
{block name="title"}<title>网站标题</title>{/block}
~~~
## 模板主题
* 如果您的插件应用使用模板的场景比较简单,则直接在应用目录theme模板目录下创建PC主题目录(default)、移动主题目录(default\_wap)
* 多主题切换只需要定义当前插件应用配置的theme、theme_wap的值即可;通常是在插件应用的配置文件里重置即可;当然您也可以通过配置组件将模板主题配置写入数据库中,在加载插件的动态配置时会自动处理。
```
//index模块主题定义示例
DcConfigMerge('index',[
'theme'=>'default',
'theme_wap'=>'default'
]);
```
## 模板变量
在模板中输出变量的方法很简单,例如,在控制器中我们给模板变量赋值:
~~~
public function index()
{
$this->assign('url', 'http://www.daicuo.net');
return $this->fetch();
}
~~~
然后就可以在模板中使用,注意模板标签的`{`和`$`之间不能有任何的空格,否则标签无效。
~~~
Hello,{$url}!
~~~
模板编译后的结果就是:
~~~
Hello,<?php echo($url);?>!
~~~
## 使用函数
变量输出使用的函数可以支持内置的PHP函数或者用户自定义函数,甚至是静态方法。
~~~
{$create_time|date="y-m-d",###}
{$name|md5|strtoupper|substr=0,3}
{:substr(strtoupper(md5($name)),0,3)}
~~~
## 内置标签
变量输出使用普通标签就足够了,但是要完成其他的控制、循环和判断功能,就需要借助模板引擎的标签库功能了,系统内置标签库的所有标签无需引入标签库即可直接使用。
内置标签包括:
| 标签名 | 作用 | 包含属性 |
| --- | --- | --- |
| include | 包含外部模板文件(闭合) | file |
| load | 导入资源文件(闭合 包括js css import别名) | file,href,type,value,basepath |
| volist | 循环数组数据输出 | name,id,offset,length,key,mod |
| foreach | 数组或对象遍历输出 | name,item,key |
| for | For循环数据输出 | name,from,to,before,step |
| switch | 分支判断输出 | name |
| case | 分支判断输出(必须和switch配套使用) | value,break |
| default | 默认情况输出(闭合 必须和switch配套使用) | 无 |
| compare | 比较输出(包括eq neq lt gt egt elt heq nheq等别名) | name,value,type |
| range | 范围判断输出(包括in notin between notbetween别名) | name,value,type |
| present | 判断是否赋值 | name |
| notpresent | 判断是否尚未赋值 | name |
| empty | 判断数据是否为空 | name |
| notempty | 判断数据是否不为空 | name |
| defined | 判断常量是否定义 | name |
| notdefined | 判断常量是否未定义 | name |
| define | 常量定义(闭合) | name,value |
| assign | 变量赋值(闭合) | name,value |
| if | 条件判断输出 | condition |
| elseif | 条件判断输出(闭合 必须和if标签配套使用) | condition |
| else | 条件不成立输出(闭合 可用于其他标签) | 无 |
| php | 使用php代码 | 无 |
## 模板缓存
每个模板文件在执行过程中都会生成一个编译后的缓存文件,其实就是一个可以运行的PHP文件。内置的模板引擎支持普通标签和XML标签方式两种标签定义,分别用于不同的目的:
| 标签类型 | 描述 |
| --- | --- |
| 普通标签 | 主要用于输出变量和做一些基本的操作 |
| XML标签 | 主要完成一些逻辑判断、控制和循环输出,并且可扩展 |
这种方式的结合保证了模板引擎的简洁和强大的有效融合。
## 助手函数
* DcViewPath 获取模板主题存放目录路径
* DcTheme 模板主题目录名称