### 模板规范
* 模板目录结构(示例)
```
├─ /views/comm/
│ ├─ about - 关于我们 相关模板
│ ├─ assets - js,css,icon资源
│ ├─ cargo - 产品 相关模板
│ ├─ ...
│ ├─ faqs - 问答 相关模板
│ ├─ home - 首页 相关模板
│ ├─ info - 杂项信息 相关模板
│ ├─ news - 新闻 相关模板
│ ├─ topic - 专题 相关模板
│ ├─ _config - 模板配置
│ ├─ _ctrls - 模板控制器
│ └─ _pub - 公共区块
```
* 基本规范
- 在/views/目录下,一组功能(模块)一个目录,如:
文档的模板目录是`book`,示例的模板目录是`demo`,
- assets - 资源目录,存放js,css,icon等文件,如果文件太多,可自定义子目录如:imgs
- \_config - 模板配置,一个模型一个配置文件:见: 核心基础 > 绑定模板
- \_ctrls - 模板控制器,每一个模型,用一个控制器文件,见: 核心基础 > 控制器模式
- \_pub - 模块公用模板区块,可以自定义名称,建议以`_`开头
### 基本输出
* php代码
- 模板里可以直接写php代码;也可以用 `{`php`}`, `{`/php`}` 把原始php包裹起来
* 变量输出
- {=$varName}
- <?=$varName?>
- {=$vname['vkey']}
- {=$vname['k1']['k2']}
- {=$\_cbase['sys_name']}
- 原始php输出:<?=$varName?>,自php5.4之后,`<?=`标签可直接使用,建议用这个了!
* 常量输出
- {=PATH_PROJ}
- {=DIR_PROJ}
- 原始php输出:<?=DIR_PROJ?>,自php5.4之后,`<?=`标签可直接使用,建议用这个了!
* $\_cbase 全局变量
- 当前模板目录: $\_cbase['tpl']['vdir']
- 当前模板: $\_cbase['run']['tplname']
- 系统名称: $\_cbase['sys_name']
- 运行时相关变量:$\_cbase['run']
* $this 对象
- 当前视图对象:包含 模型,路由,模板 相关参数 和 基本数据(如资讯详情数据);
- 当前路由参数:$this->mod, $this->key, $this->view, $this->mkv,
- 当前模板:$this->tplname
* Demo代码效果
- [Demo效果]({=PATH_PROJ}/demo.php?tptag-tpls), [Demo代码]({=PATH_PROJ}/demo.php?home-code&fp=demo/tptag/tpls.htm)
### 流程控制
* 说明
- 尽量接近php语法?!
* if-else
| 标签代码 | 解析结果 |
| ---- | ---- |
| {if $name==1} | `<?php if ($name==1){ ?>` |
| {elseif $name==2} | `<?php } elseif ($name==2){ ?>` |
| {else} | `<?php } else { ?>` |
| {/if} | `<?php } ?>` |
* for
| 标签代码 | 解析结果 |
| ---- | ---- |
| {for $i=0;$i<10;$i++} | `<?php for($i=0;$i<10;$i++) { ?>` |
| {/for} | `<?php } ?>` |
* loop
| 标签代码 | 解析结果 |
| ---- | ---- |
| {loop $arr $vo} | `<?php foreach($arr as $vo){ ?>` |
| {loop $arr $key $vo} | `<?php foreach($arr as $key => $vo){ ?>` |
| {/loop} | `<?php } ?>` |
### 加载CSS,JS
* 常规引用
- `<`link href='{=PATH_VIEWS}/dev/assets/home.css' type='text/css' rel='stylesheet'/`>`
- `<`script src='{=PATH_VENDUI}/layer/layer.js'`><`/script`>`
* PHP简写
- 以下代码,要放在php标签里面,`{tpldir}`为当前模板目录,`{mdodir}`为当前模型目录:
- eimp('/~tpl/cinfo.css'); // /views/{tpldir}/assets/cinfo.css
- eimp('/~now/cijs/funcs.js'); // /views/{tpldir}/{mdodir}/cijs/funcs.js
- eimp('/~base/cssjs/cinfo.css'); // /views/base/assets/cssjs/cinfo.css
- eimp('/~base/jslib/jsbase.js'); // /views/base/assets/cssjs/jsbase.js
- eimp('/layer/layer.js','vendui');
* Demo代码效果
- [Demo效果]({=PATH_PROJ}/demo.php?tptag-tpls), [Demo代码]({=PATH_PROJ}/demo.php?home-code&fp=demo/tptag/tpls.htm)
- 提示:查看Demo效果时,请`查看源代码` 对比输出的路径
### 模板包含
* 概述:
- 针对一些如 头尾导航(header,footer,nav) 等公共区块分离出来,给每个文件调用;
- 可以调用当前功能模块的模板区块,可以跨模块调用区块;
- `{`inc:"{subdir}/{fname}"`}`,调用到 /views/{tpldir}/{subdir}/{fname}.htm 区块文件;
- 代码非常简洁!看以下示例:
* {inc}包含.htm模板区块:--- 假如当前模板目录为 demo(文档演示功能模块)
- 调用 /views/demo/\_incs/head.htm 代码为:{inc:"\_incs/head"},`\_incs/`不能省略
- 调用 /views/demo/\_incs/foot.htm 代码为:{inc:"\_incs/foot"}
- 调用 /views/book/\_incs/foot.htm 代码为:{inc:"book:\_incs/foot"} (跨模块调用 book(模块))
* {code}包含.php代码块
- 包含 /views/\_incs/ucode.php 代码块,代码为:{code:"\_incs/ucode"},
- 注意:(前面不要/,后面不要.php)
- 同样可跨模块调用 book(模块):{inc:"book:\_incs/ucode"}
- 当让,完全可以用 php 的 include;但是,这种写法是否更简洁呢?!
* Demo代码效果
- [Demo效果]({=PATH_PROJ}/demo.php?tptag-tpinc), [Demo代码]({=PATH_PROJ}/demo.php?home-code&fp=demo/tptag/tpinc.htm)
- 提示:查看Demo效果时,请`查看源代码` 对比输出的路径
### md文件包含
* 概述:
- 作用:把markdown文件代码,解析出html代码输出;
- 语法:`{`md:"{subdir}/{fname}"`}`,
- 解析输出 /views/{tpldir}/{subdir}/{fname}.md 文件内容;
* 占位符:
- md文件包含可使用 `{mod}`, `{key}` 占位符,这样可使多个页面,公用一个模板;
- Code: `{`md:"{mod}/{key}"`}`, `{`md:"mds/{key}"`}`;
- Demo: 所有 贴心猫文档 的内容页,都是用了同一个模板:
- [本页模板代码]({=PATH_PROJ}/demo.php?home-code&fp=book/home/page.htm),
[本页md文件]({=PATH_PROJ}/demo.php?home-code&fp=book/tptag/tpls.md);
- 效果: 即包含本页在内的,你所有看到类似:/book/xxx-yyy.htm 页面,或 /book.php?xxx-yyy。
### 模板继承
* 概述:
- 如果有一组模板 非常相似,只是中间某一个或几个区块不同;
- 我们把相同部分抽取出来,作为父模板; 子模板 `继承` 父模板,只替换不同区块内容即可;
- --- 这就是模板继承。
* 区块标记:
- 父模板 中,吧不同区块,设置为 区块标记,其它语法,与普通模板一样;
- 语法:`{block:ubid} 默认父模板内容 {/block:ubid}`;
- 其中`ubid`为自定义区块名,字母开头,2-18个字母数字下划线组成;
- 一个模板中,区块名不能重复;
* 引用父模板:
- 假设 有父模板为:`_pub/lay_news.htm`;
- 子模板 中,首先要引用父模板;
- 语法:`{imp:"_pub/lay_news"}`
* 设置区块:
- 子模板 中,只需要重新设置 父模板 区块中的内容即可;
- 语法:`{block:ubid} 新的子模板内容 {/block:ubid}`;
- 如果 父模板 中设置的区块,子模板中没有设置,则使用父模板中的内容;
* 特殊设置
- 导入父模板区块内容:`{block:ubid} 添加前面的信息 {:parent} 添加后面的信息 {/block:ubid}`,
上述代码中,`{:parent}` 位置会把父模板中的区块内容导入过来;
- 清空父模版区块内容:`{block:ubid}{:clear}{/block:ubid}`;
上述代码,吧父模板中的对应区块信息清空。
* Demo代码效果
- [子模板`tptag/imtpl`代码]({=PATH_PROJ}/demo.php?home-code&fp=demo/tptag/imtpl.htm),
[子模板`tptag/imsup`代码]({=PATH_PROJ}/demo.php?home-code&fp=demo/tptag/imsup.htm);
[父模板`tptag/_layout`代码]({=PATH_PROJ}/demo.php?home-code&fp=demo/tptag/_layout.htm),
- [子模板`tptag/imtpl`效果]({=PATH_PROJ}/demo.php?tptag-imtpl),
[子模板`tptag/imsup`效果]({=PATH_PROJ}/demo.php?tptag-imsup);
- 提示:查看Demo效果时,请`查看源代码` 对比输出的路径
-End-