脚注 [^RUNOOB]。
[^RUNOOB]: 跳至顶部
**内置标签包括:**
| 标签名 | 作用 | 包含属性 | 标签分类|
| --- | --- | --- | --- |
| [include](#include) | 包含外部模板文件(闭合) | file |
| [load ](#load)| 导入资源文件(闭合 包括js css import别名) | file,href,type,value,basepath |
| [volist](#volist)| 循环数组数据输出 | name,id,offset,length,key,mod |循环输出|
| [foreach ](#foreach)| 数组或对象遍历输出 | name,item,key |循环输出|
| [for](#for)| For循环数据输出 | name,from,to,before,step |循环输出|
| [switch](#switch)| 分支判断输出 | name |条件判断|
| case| 分支判断输出(必须和switch配套使用) | value,break |
| default | 默认情况输出(闭合 必须和switch配套使用) | 无 |
| [range](#range) | 范围判断输出(包括in notin between notbetween别名) | name,value,type |条件判断|
| [present](#present) | 判断是否赋值 | name |条件判断|
| [notpresent](#notpresent) | 判断是否尚未赋值 | name |条件判断|
| [empty](#empty) | 判断数据是否为空 | name |条件判断|
| [notempty](#notempty) | 判断数据是否不为空 | name |条件判断|
| [defined](#defined) | 判断常量是否定义 | name |条件判断|
| [notdefined](#notdefined) | 判断常量是否未定义 | name |
| [define](#define) | 常量定义(闭合) | name,value |定义标签|
| [assign](#assign) | 变量赋值(闭合) | name,value |定义标签|
|[if](#if)|条件判断输出|condition|件判断|
| elseif | 条件判断输出(闭合 必须和if标签配套使用) | condition |
| else | 条件不成立输出(闭合 可用于其他标签) | 无 |
| [php](#php) | 使用php代码 | 无 |
| [compare](#compare) | 比较输出:eq或者 equal(等于)、neq 或者notequal(不等于)、gt(大于)、egt(大于等于)、lt(小于)、elt(小于等于)、heq(恒等于)、nheq(不恒等于) | name,value,type |比较标签|
模板引擎支持标签的多层嵌套功能,可以对标签库的标签指定可以嵌套。
系统内置的标签中,volist、switch、if、elseif、else、foreach、compare(包括所有的比较标签)、(not)present、(not)empty、(not)defined等标签都可以嵌套使用。例如:
~~~
{volist name="list" id="vo"}
{volist name="vo['sub']" id="sub"}
{$sub.name}
{/volist}
{/volist}
~~~
# **循环输出标签**
## <span id="volist">**VOLIST标签**</span>
volist标签通常用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数组,可以直接使用volist标签进行输出。 在控制器中首先对模版赋值:
~~~
$list = User::all();
$this->assign('list',$list);
~~~
在模版定义如下,循环输出用户的编号和姓名:
~~~
{volist name="list" id="vo"}
{$vo.id}:{$vo.name}<br/>
{/volist}
~~~
Volist标签的name属性表示模板赋值的变量名称,因此不可随意在模板文件中改变。id表示当前的循环变量,可以随意指定,但确保不要和name属性冲突,例如:
~~~
{volist name="list" id="data"}
{$data.id}:{$data.name}<br/>
{/volist}
~~~
支持输出查询结果中的部分数据,例如输出其中的第5~15条记录
~~~
{volist name="list" id="vo" offset="5" length='10'}
{$vo.name}
{/volist}
~~~
输出偶数记录
~~~
{volist name="list" id="vo" mod="2" }
{eq name="mod" value="1"}{$vo.name}{/eq}
{/volist}
~~~
Mod属性还用于控制一定记录的换行,例如:
~~~
{volist name="list" id="vo" mod="5" }
{$vo.name}
{eq name="mod" value="4"}<br/>{/eq}
{/volist}
~~~
为空的时候输出提示:
~~~
{volist name="list" id="vo" empty="暂时没有数据" }
{$vo.id}|{$vo.name}
{/volist}
~~~
empty属性不支持直接传入html语法,但可以支持变量输出,例如:
~~~
$this->assign('empty','<span class="empty">没有数据</span>');
$this->assign('list',$list);
~~~
然后在模板中使用:
~~~
{volist name="list" id="vo" empty="$empty" }
{$vo.id}|{$vo.name}
{/volist}
~~~
输出循环变量:
~~~
{volist name="list" id="vo" key="k" }
{$k}.{$vo.name}
{/volist}
~~~
如果没有指定key属性的话,默认使用循环变量i,例如:
~~~
{volist name="list" id="vo" }
{$i}.{$vo.name}
{/volist}
~~~
如果要输出数组的索引,可以直接使用key变量,和循环变量不同的是,这个key是由数据本身决定,而不是循环控制的,例如:
~~~
{volist name="list" id="vo" }
{$key}.{$vo.name}
{/volist}
~~~
模板中可以直接使用函数设定数据集,而不需要在控制器中给模板变量赋值传入数据集变量,如:
~~~
{volist name=":fun('arg')" id="vo"}
{$vo.name}
{/volist}
~~~
## <span id="foreach">**FOREACH标签**</span>
foreach标签类似与volist标签,只是更加简单,没有太多额外的属性,最简单的用法是:
~~~
{foreach $list as $vo}
{$vo.id}:{$vo.name}
{/foreach}
~~~
该用法解析后是最简洁的。
也可以使用下面的用法:
~~~
{foreach name="list" item="vo"}
{$vo.id}:{$vo.name}
{/foreach}
~~~
name表示数据源 item表示循环变量。
可以输出索引,如下:
~~~
{foreach name="list" item="vo" }
{$key}|{$vo}
{/foreach}
~~~
也可以定义索引的变量名
~~~
{foreach name="list" item="vo" key="k" }
{$k}|{$vo}
{/foreach}
~~~
## <span id="for"> **FOR标签**</span>
用法:
~~~
{for start="开始值" end="结束值" comparison="" step="步进值" name="循环变量名" }
{/for}
~~~
开始值、结束值、步进值和循环变量都可以支持变量,开始值和结束值是必须,其他是可选。comparison 的默认值是lt,name的默认值是i,步进值的默认值是1,举例如下:
~~~
{for start="1" end="100"}
{$i}
{/for}
~~~
解析后的代码是
~~~
for ($i=1;$i<100;$i+=1){
echo $i;
}
~~~
# **比较标签**
## <span id="compare">**compareb标签**</span>
>[info]比较标签用于简单的变量比较,复杂的判断条件可以用if标签替换,比较标签是一组标签的集合,基本上用法都一致,
所有的比较标签可以统一使用compare标签(其实所有的比较标签都是compare标签的别名)
例如: 当name变量的值等于5就输出
~~~
{compare name="name" value="5" type="eq"}value{/compare}
~~~
等效于
~~~
{eq name="name" value="5" }value{/eq}
~~~
其中type属性的值就是上面列出的比较标签名称
compare标签的别名 基本上用法都一致
如下:
~~~
{比较标签 name="变量" value="值"}
内容
{/比较标签}
~~~
系统支持的比较标签以及所表示的含义分别是:
| 标签 | 含义 |
| --- | --- |
| eq或者 equal | 等于 |
| neq 或者notequal | 不等于 |
| gt | 大于 |
| egt | 大于等于 |
| lt | 小于 |
| elt | 小于等于 |
| heq | 恒等于 |
| nheq | 不恒等于 |
他们的用法基本是一致的,区别在于判断的条件不同,并且所有的比较标签都可以和else标签一起使用。
例如,要求name变量的值等于value就输出,可以使用:
~~~
{eq name="name" value="value"}value{/eq}
~~~
或者
~~~
{equal name="name" value="value"}value{/equal}
~~~
也可以支持和else标签混合使用:
~~~
{eq name="name" value="value"}
相等
{else/}
不相等
{/eq}
~~~
当 name变量的值大于5就输出
~~~
{gt name="name" value="5"}value{/gt}
~~~
当name变量的值不小于5就输出
~~~
{egt name="name" value="5"}value{/egt}
~~~
比较标签中的变量可以支持对象的属性或者数组,甚至可以是系统变量,例如: 当vo对象的属性(或者数组,或者自动判断)等于5就输出
~~~
{eq name="vo.name" value="5"}
{$vo.name}
{/eq}
~~~
当vo对象的属性等于5就输出
~~~
{eq name="vo:name" value="5"}
{$vo.name}
{/eq}
~~~
当$vo\['name'\]等于5就输出
~~~
{eq name="vo['name']" value="5"}
{$vo.name}
{/eq}
~~~
而且还可以支持对变量使用函数 当vo对象的属性值的字符串长度等于5就输出
~~~
{eq name="vo:name|strlen" value="5"}{$vo.name}{/eq}
~~~
变量名可以支持系统变量的方式,例如:
~~~
{eq name="Think.get.name" value="value"}相等{else/}不相等{/eq}
~~~
通常比较标签的值是一个字符串或者数字,如果需要使用变量,只需要在前面添加“$”标志: 当vo对象的属性等于$a就输出
~~~
{eq name="vo:name" value="$a"}{$vo.name}{/eq}
~~~
# **条件判断**
## <span id="switch">**SWITCH标签**</span>
用法:
~~~
{switch name="变量" }
{case value="值1" break="0或1"}输出内容1{/case}
{case value="值2"}输出内容2{/case}
{default /}默认情况
{/switch}
~~~
使用方法如下:
~~~
{switch name="User.level"}
{case value="1"}value1{/case}
{case value="2"}value2{/case}
{default /}default
{/switch}
~~~
其中name属性可以使用函数以及系统变量,例如:
~~~
{switch name="Think.get.userId|abs"}
{case value="1"}admin{/case}
{default /}default
{/switch}
~~~
对于case的value属性可以支持多个条件的判断,使用”|”进行分割,例如:
~~~
{switch name="Think.get.type"}
{case value="gif|png|jpg"}图像格式{/case}
{default /}其他格式
{/switch}
~~~
表示如果$\_GET\["type"\] 是gif、png或者jpg的话,就判断为图像格式。
Case标签还有一个break属性,表示是否需要break,默认是会自动添加break,如果不要break,可以使用:
~~~
{switch name="Think.get.userId|abs"}
{case value="1" break="0"}admin{/case}
{case value="2"}admin{/case}
{default /}default
{/switch}
~~~
也可以对case的value属性使用变量,例如:
~~~
{switch name="User.userId"}
{case value="$adminId"}admin{/case}
{case value="$memberId"}member{/case}
{default /}default
{/switch}
~~~
> 使用变量方式的情况下,不再支持多个条件的同时判断。
简洁的用法
~~~
{switch $User.userId}
{case $adminId}admin{/case}
{case $memberId}member{/case}
{/switch}
~~~
## <span id="if">**IF标签**</span>
用法示例:
~~~
{if condition="($name == 1) OR ($name > 100) "} value1
{elseif condition="$name eq 2"/}value2
{else /} value3
{/if}
~~~
除此之外,我们可以在condition属性里面使用php代码,例如:
~~~
{if condition="strtoupper($user['name']) neq 'THINKPHP'"}ThinkPHP
{else /} other Framework
{/if}
~~~
condition属性可以支持点语法和对象语法,例如: 自动判断user变量是数组还是对象
~~~
{if condition="$user.name neq 'ThinkPHP'"}ThinkPHP
{else /} other Framework
{/if}
~~~
或者知道user变量是对象
~~~
{if condition="$user:name neq 'ThinkPHP'"}ThinkPHP
{else /} other Framework
{/if}
~~~
由于if标签的condition属性里面基本上使用的是php语法,尽可能使用**判断标签和Switch标签**会更加简洁,原则上来说,能够用switch和比较标签解决的尽量不用if标签完成。因为switch和比较标签可以使用变量调节器和系统变量。如果某些特殊的要求下面,IF标签仍然无法满足要求的话,可以使用原生php代码或者PHP标签来直接书写代码。
简洁的用法
~~~
{if condition="表达式"}
{if (表达式)}
{if 表达式}
~~~
这三种写法结果是一样的
判断集合是否为空
```
{if condition="empty($list) neq true" /}
集合不为空
{else /}
集合为空
{/if}
```
## <span id="present">**PRESENT 标签**</span>
present标签用于判断某个变量是否已经定义,用法:
~~~
{present name="name"}
name已经赋值
{/present}
~~~
## <span id="notpresent">**NOTPRESENT 标签**</span>
如果判断没有赋值,可以使用:
~~~
{notpresent name="name"}
name还没有赋值
{/notpresent}
~~~
可以把上面两个标签合并成为:
~~~
{present name="name"}
name已经赋值
{else /}
name还没有赋值
{/present}
~~~
present标签的name属性可以直接使用系统变量,例如:
~~~
{present name="Think.get.name"}
$_GET['name']已经赋值
{/present}
~~~
## <span id="empty">**EMPTY 标签**</span>
empty标签用于判断某个变量是否为空,用法:
~~~
{empty name="name"}
name为空值
{/empty}
~~~
## <span id="notempty">**NOTEMPTY 标签**</span>
如果判断没有赋值,可以使用:
~~~
{notempty name="name"}
name不为空
{/notempty}
~~~
可以把上面两个标签合并成为:
~~~
{empty name="name"}
name为空
{else /}
name不为空
{/empty}
~~~
name属性可以直接使用系统变量,例如:
~~~
{empty name="Think.get.name"}
$_GET['name']为空值
{/empty}
~~~
## <span id="defined">**DEFINED 标签**</span>
DEFINED标签用于判断某个常量是否有定义,用法如下:
~~~
{defined name="NAME"}
NAME常量已经定义
{/defined}
~~~
> name属性的值要注意严格大小写
如果判断没有被定义,可以使用:
~~~
{notdefined name="NAME"}
NAME常量未定义
{/notdefined}
~~~
可以把上面两个标签合并成为:
~~~
{defined name="NAME"}
NAME常量已经定义
{else /}
NAME常量未定义
{/defined}
~~~
## 范围判断
## <span id="range">**RANGE标签**</span>
范围判断标签包括in notin between notbetween四个标签,都用于判断变量是否中某个范围。
也可以直接使用range标签,替换in notin between notbetween四个标签
用法:
~~~
{range name="id" value="1,2,3" type="in"}
输出内容1
{/range}
~~~
其中type属性的值可以用in/notin/between/notbetween,其它属性的用法和IN或者BETWEEN一致。
## IN和NOTIN
用法: 假设我们中控制器中给id赋值为1:
~~~
$id = 1;
$this->assign('id',$id);
~~~
我们可以使用in标签来判断模板变量是否在某个范围内,例如:
~~~
{in name="id" value="1,2,3"}
id在范围内
{/in}
~~~
最后会输出:`id在范围内`。
如果判断不在某个范围内,可以使用notin标签:
~~~
{notin name="id" value="1,2,3"}
id不在范围内
{/notin}
~~~
最后会输出:`id不在范围内`。
可以把上面两个标签合并成为:
~~~
{in name="id" value="1,2,3"}
id在范围内
{else/}
id不在范围内
{/in}
~~~
name属性还可以支持直接判断系统变量,例如:
~~~
{in name="Think.get.id" value="1,2,3"}
$_GET['id'] 在范围内
{/in}
~~~
> 更多的系统变量用法可以参考[系统变量](https://www.kancloud.cn/manual/thinkphp5/125004)部分。
value属性也可以使用变量,例如:
~~~
{in name="id" value="$range"}
id在范围内
{/in}
~~~
$range变量可以是数组,也可以是以逗号分隔的字符串。
value属性还可以使用系统变量,例如:
~~~
{in name="id" value="$Think.post.ids"}
id在范围内
{/in}
~~~
## BETWEEN 和 NOTBETWEEN
可以使用between标签来判断变量是否在某个区间范围内,可以使用:
~~~
{between name="id" value="1,10"}
输出内容1
{/between}
~~~
同样,也可以使用notbetween标签来判断变量不在某个范围内:
~~~
{notbetween name="id" value="1,10"}
输出内容2
{/notbetween}
~~~
也可以使用else标签把两个用法合并,例如:
~~~
{between name="id" value="1,10"}
输出内容1
{else/}
输出内容2
{/between}
~~~
当使用between标签的时候,value只需要一个区间范围,也就是只支持两个值,后面的值无效,例如
~~~
{between name="id" value="1,3,10"}
输出内容1
{/between}
~~~
实际判断的范围区间是`1~3`,而不是`1~10`,也可以支持字符串判断,例如:
~~~
{between name="id" value="A,Z"}
输出内容1
{/between}
~~~
name属性可以直接使用系统变量,例如:
~~~
{between name="Think.post.id" value="1,5"}
输出内容1
{/between}
~~~
value属性也可以使用变量,例如:
~~~
{between name="id" value="$range"}
输出内容1
{/between}
~~~
变量的值可以是字符串或者数组,还可以支持系统变量。
~~~
{between name="id" value="$Think.get.range"}
输出内容1
{/between}
~~~
# **资源文件加载**
## <span id="load">**load 标签**</span>
传统方式的导入外部`JS`和`CSS`文件的方法是直接在模板文件使用:
~~~
<script type='text/javascript' src='/static/js/common.js'>
<link rel="stylesheet" type="text/css" href="/static/css/style.css" />
~~~
系统提供了专门的标签来简化上面的导入:
~~~
{load href="/static/js/common.js" /}
{load href="/static/css/style.css" /}
~~~
并且支持同时加载多个资源文件,例如:
~~~
{load href="/static/js/common.js,/static/css/style.css" /}
~~~
系统还提供了两个标签别名`js`和`css`用法和`load`一致,例如:
~~~
{js href="/static/js/common.js" /}
{css href="/static/css/style.css" /}
~~~
## <span id="include">**include 标签**</span>
用于在模版中加载其他的模板
模版表达式的定义规则为:**模块@控制器/操作**
>[danger]包含的模板文件中不能再使用模板布局或者模板继承。
~~~
{include file="public/header" /}
~~~
可以一次包含多个模版,例如:
~~~
{include file="public/header,public/menu" /}
~~~
可以直接包含一个模版文件名(包含完整路径),例如:
~~~
{include file="../application/view/default/public/header.html" /}
~~~
## 传入参数
无论你使用什么方式包含外部模板,Include标签支持在包含文件的同时传入参数,例如,下面的例子我们在包含header模板的时候传入了`title`和`keywords`参数:
~~~
{include file="Public/header" title="$title" keywords="开源WEB开发框架" /}
~~~
就可以在包含的header.html文件里面使用title和keywords变量,如下:
~~~
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>[title]</title>
<meta name="keywords" content="[keywords]" />
</head>
~~~
上面title参数传入的是个变量$title,模板内的\[title\]最终会替换成$title的值,当然$title这个变量必须要存在。
**包含文件中可以再使用include标签包含别的文件,但注意不要形成A包含A,或者A包含B而B又包含A这样的死循环。**
> 注意:由于模板解析的特点,从入口模板开始解析,如果外部模板有所更改,模板引擎并不会重新编译模板,除非在调试模式下或者缓存已经过期。如果部署模式下修改了包含的外部模板文件后,需要把模块的缓存目录清空,否则无法生效。
# **原生PHP**
Php代码可以和标签在模板文件中混合使用,可以在模板文件里面书写任意的PHP语句代码 ,包括下面两种方式:
## <span id="php">**php 标签**</span>
例如:
~~~
{php}echo 'Hello,world!';{/php}
~~~
我们建议需要使用PHP代码的时候尽量采用php标签,因为原生的PHP语法可能会被配置禁用而导致解析错误。
## 使用原生php代码
~~~
<?php echo 'Hello,world!'; ?>
~~~
注意:php标签或者php代码里面就不能再使用标签(包括普通标签和XML标签)了,因此下面的几种方式都是无效的:
~~~
{php}{eq name='name'value='value'}value{/eq}{/php}
~~~
Php标签里面使用了`eq`标签,因此无效
~~~
{php}if( {$user} != 'ThinkPHP' ) echo 'ThinkPHP' ;{/php}
~~~
Php标签里面使用了`{$user}`普通标签输出变量 ,因此无效。
~~~
{php}if( $user.name != 'ThinkPHP' ) echo 'ThinkPHP' ;{/php}
~~~
Php标签里面使用了`$user.name`点语法变量输出 ,因此无效。
> 简而言之,在PHP标签里面不能再使用PHP本身不支持的代码。
如果设置了`tpl_deny_php`参数为true,就不能在模板中使用原生的PHP代码,但是仍然支持PHP标签输出。
# **定义标签**
## <span id="assign">**ASSIGN标签**</span>
ASSIGN标签用于在模板文件中定义变量,用法如下:
~~~
{assign name="var" value="123" /}
~~~
在运行模板的时候,赋值了一个`var`的变量,值是`123`。
value属性也支持变量,例如:
~~~
{assign name="var" value="$val" /}
~~~
或者直接把系统变量赋值给var变量,例如:
~~~
{assign name="var" value="$Think.get.name" /}
~~~
相当于,执行了:`$var = $_GET['name'];`
## <span id="define">**DEFINE标签**</span>
DEFINE标签用于中模板中定义常量,用法如下:
~~~
{define name="MY_DEFINE_NAME" value="3" /}
~~~
在运行模板的时候,就会定义一个`MY_DEFINE_NAME`的常量。
value属性可以支持变量(包括系统变量),例如:
~~~
{define name="MY_DEFINE_NAME" value="$name" /}
~~~
或者
~~~
{define name="MY_DEFINE_NAME" value="$Think.get.name" /}
~~~
- 空白目录
- php语法结构
- 安装与更新
- 开启调试模式及代码跟踪器
- 架构
- 源码分析
- 应用初始化
- 请求流程
- 中间件源码分析
- 请求处理源码分析
- Request源码分析
- 模板编译流程
- 路由与请求流程
- 容器
- 获取目录位置
- 入口文件
- 多应用模式及URL访问
- 依赖注入与容器
- 容器属性及方法
- Container
- App
- facade
- 中间件(middleware)
- 系统服务
- extend 扩展类库
- 笔记
- 配置
- env配置定义及获取
- 配置文件的配置获取
- 单应用模式-(配置)文件目录结构(默认)
- 多应用模式(配置)文件目录结构(配置文件)
- 配置文件
- 应用配置:app.php
- 缓存配置: cache.php
- 数据库配置:database.php
- 路由和URL配置:route.php
- Cookie配置:cookie.php
- Session配置:session.php
- 命令行配置:console.php
- 多语言配置:lang.php
- 日志配置:log.php
- 页面Trace配置:trace.php
- 磁盘配置: filesystem.php
- 中间件配置:middleware.php
- 视图配置:view.php
- 改成用yaconf配置
- 事件
- 例子:省略事件类的demo
- 例子2:完整事件类
- 例子3:事件订阅,监听多个事件
- 解析
- 路由
- 路由定义
- 路由地址
- 变量规则
- MISS路由
- URL生成
- 闭包支持
- 路由参数
- 路由中间件
- 路由分组
- 资源路由
- 注解路由
- 路由绑定
- 域名路由
- 路由缓存
- 跨域路由
- 控制器
- 控制器定义
- 空控制器、空操作
- 空模块处理
- RESTFul资源控制器
- 控制器中间件
- 请求对象Request(url参数)
- 请求信息
- 获取输入变量($_POST、$_GET等)
- 请求类型的获取与伪装
- HTTP头信息
- 伪静态
- 参数绑定
- 请求缓存
- 响应对象Response
- 响应输出
- 响应参数
- 重定向
- 文件下载
- 错误页面的处理办法
- 应用公共文件common.php
- 模型
- 模型定义及常规属性
- 模型数据获取与模型赋值
- 查询
- 数据集
- 增加
- 修改
- 删除
- 条件
- 查询范围scope
- 获取器
- 修改器
- 搜索器
- 软删除
- 模型事件
- 关联预载入
- 模型关联
- 一对一关联
- 一对多关联
- 多对多关联
- 自动时间戳
- 事务
- 数据库
- 查询构造器
- 查询合集
- 子查询
- 聚合查询
- 时间查询
- 视图查询(比join简单)
- 获取查询参数
- 快捷方法
- 动态查询
- 条件查询
- 打印sql语句
- 增
- 删
- 改
- 查
- 链式操作
- 查询表达式
- 分页查询
- 原生查询
- JSON字段
- 链接数据库配置
- 分布式数据库
- 查询事件
- Db获取器
- 事务操作
- 存储过程
- Db数据集
- 数据库驱动
- 视图
- 模板
- 模板配置
- 模板位置
- 模板渲染
- 模板变量与赋值(assign)
- 模板输出替换
- url生成
- 模板详解
- 内置标签
- 三元运算
- 变量输出
- 函数输出
- Request请求参数
- 模板注释及原样输出
- 模板继承
- 模板布局
- 原生PHP
- 模板引擎
- 视图过滤
- 视图驱动
- 验证
- 验证进阶之最终版
- 错误和日志
- 异常处理
- 日志处理
- 调试
- 调试模式
- Trace调试
- SQL调试
- 变量调试
- 远程调试
- 杂项
- 缓存
- Session
- Cookie
- 多语言
- 上传
- 扩展说明
- N+1查询
- TP类库
- 扩展类库
- 数据库迁移工具
- Workerman
- think助手工具库
- 验证码
- Swoole
- request
- app
- Response
- View
- Validate
- Config
- 命令行
- 助手函数
- 升级指导(功能的添加与删除说明)
- siyucms
- 开始
- 添加页面流程
- 列表页加载流程
- 弹出框
- 基础控制器
- 基础模型
- 快速构建
- 表单form构建
- 表格table构建
- MakeBuilder
- 前端组件
- 日期组件
- layer 弹层组件
- Moment.js 日期处理插件
- siyucms模板布局
- 函数即其变量
- 前端页面
- $.operate.方法
- $.modal.方法:弹出层
- $.common.方法:通用方法
- 被cms重写的表格options
- 自定义模板
- 搜索框
- 自定义form表单
- 获取表单搜索参数并组装为url字符串