标签:
目录/文件 | 说明 |
---|---|
ThinkPHP.php | 框架入口文件 |
Common | 框架公共文件目录 |
Conf | 框架配置文件目录 |
Lang | 框架系统语言目录 |
Lib | 系统核心基类库目录 |
Tpl | 系统模板目录 |
Extend | 框架扩展目录(关于扩展目录的详细信息请参考后面的扩展章节) |
目录 | 说明 |
---|---|
Common | 项目公共文件目录,一般放置项目的公共函数 |
Conf | 项目配置目录,项目所有的配置文件都放在这里 |
Lang | 项目语言包目录(可选 如果不需要多语言支持 可删除) |
Lib | 项目类库目录,通常包括Action和Model子目录 |
Tpl | 项目模板目录,支持模板主题 |
Runtime | 项目运行时目录,包括Cache(模板缓存)、Temp(数据缓存)、Data(数据目录)和Logs(日志文件)子目录,如果存在分组的话,则首先是分组目录。 |
目录/文件 | 说明 |
---|---|
ThinkPHP | 系统目录(下面的目录结构同上面的系统目录) |
Public | 网站公共资源目录(存放网站的Css、Js和图片等资源) |
Uploads | 网站上传目录(用户上传的统一目录) |
Home | 项目目录(下面的目录结构同上面的应用目录) |
Admin | 后台管理项目目录 |
…… 更多的项目目录 | |
index.php | 项目Home的入口文件 |
admin.php | 项目Admin的入口文件 |
…… 更多的项目入口文件 |
事实上,系统目录和项目目录可以放到非WEB访问目录下面,网站目录下面只需要放置Public公共目录和入口文件,从而提高网站的安全性。
如果希望自己设置目录,可以在入口文件里面更改RUNTIME_PATH常量进行更改,例如:
文件名 | 说明 |
---|---|
config.php | 项目配置文件 |
tags.php | 项目行为配置文件 |
alias.php | 项目别名定义文件 |
debug.php | 项目调试模式配置文件(以及项目设置的APP_STATUS对应的配置文件) |
core.php | 项目追加的核心编译列表文件(不会覆盖核心编译列表) |
类库 | 规则 | 示例 |
---|---|---|
控制器类 | 模块名+Action | 例如 UserAction、InfoAction |
模型类 | 模型名+Model | 例如 UserModel、InfoModel |
行为类 | 行为名+Behavior | 例如CheckRouteBehavior |
Widget类 | Widget名+Widget | 例如BlogInfoWidget |
驱动类 | 引擎名+驱动名 | 例如DbMysql表示mysql数据库驱动、CacheFile表示文件缓存驱动 |
目录 | 调用路径 | 说明 |
---|---|---|
Lib/Core | Think.Core | 核心类库包 |
Lib/Behavior | Think.Behavior | 内置行为类库包 |
Lib/Driver | Think.Driver | 内置驱动类库包 |
Lib/Template | Think.Template | 内置模板引擎类库包 |
类名 | 说明 |
---|---|
Action | 系统基础控制器类 |
App | 系统应用类 |
Behavior | 系统行为基础类 |
Cache | 系统缓存类 |
Db | 系统抽象数据库类 |
Dispatcher | URL调度类 |
Log | 系统日志类 |
Model | 系统基础模型类 |
Think | 系统入口和静态类 |
ThinkException | 系统基础异常类 |
View | 视图类 |
Widget | 系统Widget基础类 |
目录 | 调用路径 | 说明 |
---|---|---|
Lib/Action | @.Action或自动加载 | 控制器类库包 |
Lib/Model | @.Model或自动加载 | 模型类库包 |
Lib/Behavior | 用B方法调用或自动加载 | 应用行为类库包 |
Lib/Widget | 用W方法在模板中调用 | 应用Widget类库包 |
类名 | 规则 | 说明 |
---|---|---|
行为类 | 规则1 | 搜索系统类库目录下面的Behavior目录 |
规则2 | 搜索系统扩展目录下面的Behavior目录 | |
规则3 | 搜索应用类库目录下面的Behavior目录 | |
规则4 | 如果启用了模式扩展,则搜索模式扩展目录下面的Behavior目录 | |
模型类 | 规则1 | 如果启用分组,则搜索应用类库目录的Model/当前分组 目录 |
规则2 | 搜索应用类库下面的Model目录 | |
规则3 | 搜索系统扩展目录下面的Model目录 | |
控制器类 | 规则1 | 如果启用分组,则搜索应用类库目录的Action/当前分组 目录 |
规则2 | 搜索项目类库目录下面的Action目录 | |
规则3 | 搜索系统扩展目录下面的Action目录 |
配置参数 | 说明 |
---|---|
APP_GROUP_LIST | 项目分组列表(配置即表示开启分组) |
DEFAULT_GROUP | 默认分组(默认值为Home) |
TMPL_FILE_DEPR | 分组模板下面模块和操作的分隔符,默认值为“/” |
VAR_GROUP | 分组的URL参数名,默认为g(普通模式URL才需要) |
详情见:http://doc.thinkphp.cn/manual/url_rewrite.html
为了配合所使用的URL模式,我们需要能够动态的根据当前的URL设置生成对应的URL地址,为此,ThinkPHP内置提供了U方法,用于URL的动态生成,可以确保项目在移植过程中不受环境的影响。
U方法的定义规则如下(方括号内参数根据实际应用决定):
如果不定义项目和模块的话 就表示当前项目和模块名称,下面是一些简单的例子:
U方法的第二个参数支持数组和字符串两种定义方式,如果只是字符串方式的参数可以在第一个参数中定义,例如:
三种方式是等效的,都是 生成Blog模块的cate操作 并且cate_id为1 status为1的URL地址
但是不允许使用下面的定义方式来传参数
注意:如果你是在模板文件中直接使用U方法的话,需要采用 {:U(‘参数1‘, ‘参数2‘…)} 的方式,具体参考模板引擎章节的8.3 使用函数内容。
如果你的应用涉及到多个子域名的操作地址,那么也可以在U方法里面指定需要生成地址的域名,例如:
@后面传入需要指定的域名即可。
此外,U方法的第5个参数如果设置为true,表示自动识别当前的域名,并且会自动根据子域名部署设置APP_SUB_DOMAIN_DEPLOY和APP_SUB_DOMAIN_RULES自动匹配生成当前地址的子域名。
如果开启了URL_CASE_INSENSITIVE,则会统一生成小写的URL地址。
就可以实现URL访问不再区分大小写了。
这里需要注意一个地方,如果我们定义了一个UserTypeAction的模块类,那么URL的访问应该是:
利用系统提供的U方法可以为你自动生成相关的URL地址。
如果设置
的话,URL就又变成:
注意:URL不区分大小写并不会改变系统的命名规范,并且只有按照系统的命名规范后才能正确的实现URL不区分大小写。
例如,我们在Index模块调用User模块的操作方法
事实上,A方法还支持跨分组或者跨项目调用,默认情况下是调用当前项目下面的模块。
跨项目调用的格式是:
A(‘[项目名://][分组名/]模块名‘)
例如:
系统的Action类内置了两个跳转方法success和error,用于页面跳转提示,而且可以支持ajax提交。使用方法很简单,举例如下:
$msgTitle | 操作标题 |
$message | 页面提示信息 |
$status | 操作状态 1表示成功 0 表示失败 具体还可以由项目本身定义规则 |
$waitSecond | 跳转等待时间 单位为秒 |
$jumpUrl | 跳转页面地址 |
方法名可以支持:
方法名 | 含义 |
---|---|
_get | 获取GET参数 |
_post | 获取POST参数 |
_param | 自动判断请求类型获取GET、POST或者PUT参数(3.1新增) |
_request | 获取REQUEST 参数 |
_put | 获取PUT 参数 |
_session | 获取 $_SESSION 参数 |
_cookie | 获取 $_COOKIE 参数 |
_server | 获取 $_SERVER 参数 |
_globals | 获取 $GLOBALS参数 |
变量名:(必须)是要获取的系统变量的名称
过滤方法:(可选)可以用任何的内置函数或者自定义函数名,如果没有指定的话,采用默认的htmlspecialchars函数进行安全过滤(由DEFAULT_FILTER 参数配置),参数就是前面方法名获取到的值,也就是说如果调用:
最终调用的结果就是 htmlspecialchars($_GET["name"]),如果要改变过滤方法,可以使用:
默认值:(可选)是要获取的参数变量不存在的情况下设置的默认值,例如:
如果$_GET["id"] 不存在的话,会返回0。
如果没有设置任何默认值的话,系统默认返回NULL。
也可以支持多函数过滤。
例如,可以设置:
那么在控制器类如果调用
的话,会依次对$_GET[‘id‘] 变量进行htmlspecialchars和strip_tags方法过滤后返回结果。
下面调用方式也同样支持:
其他变量获取方法用法相同。
支持获取全部变量,例如:
表示获取$_GET变量值。
如果不希望过滤某个参数,可以使用
第二个参数使用false或者空字符串则表示不作任何过滤处理,即使我们有配置默认的过滤方法。
如果我们忽略第二个参数调用的话
则表示调用默认的过滤方法(由DEFAULT_FILTER参数进行配置)。
3.1版本开始,Action类增加_param方法,可以自动根据当前请求类型(例如GET POST)获取参数。
例如:
当前为get方式提交的时候,就是获取$_GET[‘id‘](进行默认过滤后)的值
当前为post方式提交的时候,就是获取$_POST[‘id‘](进行默认过滤后)的值
还可以用_param方法获取URL中的参数
系统Action类内置了一些判断方法用于判断请求类型,包括:
方法 | 说明 |
---|---|
isGet | 判断是否是GET方式提交 |
isPost | 判断是否是POST方式提交 |
isPut | 判断是否是PUT方式提交 |
isDelete | 判断是否是DELETE方式提交 |
isHead | 判断是否是HEAD提交 |
使用举例如下:
status | 操作状态 |
info | 提示信息 |
data | 返回数据 |
如果需要改变Ajax返回的数据格式,可以在控制器Action中增加ajaxAssign方法定义,定义格式如下:
3.1版本以后,ajaxReturn方法可以更加灵活的进行ajax传值,并且废弃了ajaxAssign方法扩展。能够完全定义传值的数组和类型,例如:
data传值数组可以随意定义。
改进后的ajaxReturn方法也兼容之前的写法:
系统会自动把info和1两个参数并入$data数组中,等同于赋值
模型名(类名) | 约定对应数据表(假设数据库的前缀定义是 think_) |
---|---|
UserModel | think_user |
UserTypeModel | think_user_type |
属性 | 说明 |
---|---|
tableName | 不包含表前缀的数据表名称,一般情况下默认和模型名称相同,只有当你的表名和当前的模型类的名称不同的时候才需要定义。 |
trueTableName | 包含前缀的数据表名称,也就是数据库中的实际表名,该名称无需设置,只有当上面的规则都不适用的情况或者特殊情况下才需要设置。 |
dbName | 定义模型当前对应的数据库名称,只有当你当前的模型类对应的数据库名称和配置文件不同的时候才需要定义。 |
模型类的实例化方法有三个参数,第一个参数是模型名称,第二个参数用于设置数据表的前缀(留空则取当前项目配置的表前缀),第三个参数用于设置当前使用的数据库连接信息(留空则取当前项目配置的数据库连接信息),例如:
D方法还可以支持跨项目和分组调用,需要使用:
如果需要显式获取当前数据表的字段信息,可以使用模型类的getDbFields方法来获取当前数据对象的全部字段信息,例如:
如果不希望依赖字段缓存或者想提高性能,也可以在模型类里面手动定义数据表字段的名称,可以避免IO加载的效率开销,在模型类里面添加fields属性即可,定义格式如下:
ThinkPHP的模型对象实例本身也是一个数据对象,可以支持对象和数组两种方式来访问数据属性,例如下面的方式采用数据对象的方式来访问User模型的属性:
除了find方法会产生数据对象属性外,data方法和create方法也会产生数据对象,例如:
常用的配置方式是在项目配置文件中添加下面的参数:
或者采用如下配置
第二种 在模型类里面定义connection属性
如果在某个模型类里面定义了connection属性的话,则实例化该自定义模型的时候会采用定义的数据库连接信息,而不是配置文件中设置的默认连接信息,通常用于某些数据表位于当前数据库连接之外的其它数据库,例如:
也可以采用DSN方式定义,例如:
如果我们已经在配置文件中配置了额外的数据库连接信息,例如:
那么,我们可以把模型类的属性定义改为:
只需要调用Model类的db方法,用法:
数据库编号用数字格式,对于已经调用过的数据库连接,是不需要再传入数据库连接信息的,系统会自动记录。对于默认的数据库连接,内部的数据库编号是0,因此为了避免冲突,请不要再次定义数据库编号为0的数据库配置。
数据库配置的定义方式和模型定义connection属性一样,支持数组、字符串以及调用配置参数三种格式。
Db方法调用后返回当前的模型实例,直接可以继续进行模型的其他操作,所以该方法可以在查询的过程中动态切换,例如:
该方法添加了一个编号为1的数据库连接,并自动切换到当前的数据库连接。
当第二次切换到相同的数据库的时候,就不需要传入数据库连接信息了,可以直接使用:
如果需要切换到默认的数据库连接,只需要调用:
如果我们已经在项目配置中定义了其他的数据库连接信息,例如:
我们就可以直接在db方法中调用配置进行连接了:
如果切换数据库之后,数据表和当前不一致的话,可以使用table方法指定要操作的数据表:
我们也可以直接用M方法切换数据库,例如:
或者
ThinkPHP内置了分布式数据库的支持,包括主从式数据库的读写分离,但是分布式数据库必须是相同的数据库类型。配置DB_DEPLOY_TYPE 为1 可以采用分布式数据库支持。如果采用分布式数据库,定义数据库配置信息的方式如下:
注意:主从数据库的数据同步工作不在框架实现,需要数据库考虑自身的同步或者复制机制。
很简单的例子:
Create方法支持从其它方式创建数据对象,例如,从其它的数据对象,或者数组等
甚至还可以支持从对象创建新的数据对象
安全提示:
create方法如果没有传值,默认取$_POST数据,如果用户提交的变量内容,含有可执行的html代码,请进行手工过滤。
非法html代码可以使用htmlspecialchars进行编码,以防止用户提交的html代码在展示时被执行,以下是两种安全处理方法。
连贯操作 | 作用 | 支持的参数类型 |
---|---|---|
where | 用于查询或者更新条件的定义 | 字符串、数组和对象 |
table | 用于定义要操作的数据表名称 | 字符串和数组 |
alias | 用于给当前数据表定义别名 | 字符串 |
data | 用于新增或者更新数据之前的数据对象赋值 | 数组和对象 |
field | 用于定义要查询的字段(支持字段排除) | 字符串和数组 |
order | 用于对结果排序 | 字符串和数组 |
limit | 用于限制查询结果数量 | 字符串和数字 |
page | 用于查询分页(内部会转换成limit) | 字符串和数字 |
group | 用于对查询的group支持 | 字符串 |
having | 用于对查询的having支持 | 字符串 |
join* | 用于对查询的join支持 | 字符串和数组 |
union* | 用于对查询的union支持 | 字符串、数组和对象 |
distinct | 用于查询的distinct支持 | 布尔值 |
lock | 用于数据库的锁机制 | 布尔值 |
cache | 用于查询缓存 | 支持多个参数 |
relation | 用于关联查询(需要关联模型支持) | 字符串 |
为了保证数据库的安全,避免出错更新整个数据表,如果没有任何更新条件,数据对象本身也不包含主键字段的话,save方法不会更新任何数据库的记录。
因此下面的代码不会更改数据库的任何记录
除非使用下面的方式:
如果id是数据表的主键的话,系统自动会把主键的值作为更新条件来更新其他字段的值。
还有一种方法是通过create或者data方法创建要更新的数据对象,然后进行保存操作,这样save方法的参数可以不需要传入。
使用create方法的例子:
使用示例:
setField方法支持同时更新多个字段,只需要传入数组即可,例如:
示例如下:
delete方法可以用于删除单个或者多个数据,主要取决于删除条件,也就是where方法的参数,也可以用order和limit方法来限制要删除的个数,例如:
一、创建数据
如果使用了create方法创建数据对象的话,仍然可以在创建完成后进行赋值
用AR模式的话可以直接写成:
如果要根据某个字段查询,例如查询姓名为ThinkPHP的可以用:
如果要查询数据集,可以直接使用:
三、更新记录
在完成查询后,可以直接修改数据对象然后保存到数据库。
上面这种方式仅仅是示例,不代表保存操作之前一定要先查询。因为下面的方式其实是等效的:
四、删除记录
可以删除当前查询的数据对象
或者直接根据主键进行删除
大多数情况下面,数据对象是由表单提交的$_POST数据创建。需要使用系统的自动验证功能,只需要在Model类里面定义$_validate属性,是由多个验证因子组成的二维数组。
验证因子格式:
示例:
当使用系统的create方法创建数据对象的时候会自动进行数据验证操作,代码示例:
通常来说,每个数据表对应的验证规则是相对固定的,但是有些特殊的情况下面可能会改变验证规则,我们可以动态的改变验证规则来满足不同条件下面的验证:
手动验证
3.1版本开始,可以使用validate方法实现动态和批量手动验证,例如:
其中$validate变量的规范和_validate属性的定义规则一致,而且还可以支持函数调用(由于PHP本身的限制,在类的属性定义中不能调用函数)。
通过这一改进,以前需要支持数据自动验证,必须定义模型类的情况已经不再出现,你完全可以通过M方法实例化模型类后使用动态设置完成自动验证操作。
另外还有一个check方法,用于对单个数据的手动验证,支持部分自动验证的规则,用法如下:
验证类型支持 in between equal length regex expire ip_allow ip_deny,默认为regex
结果返回布尔值
最简单的调用方式就直接调用某个命名范围,例如:
生成的SQL语句分别是:
系统支持默认命名范围功能,如果你定义了一个default命名范围,例如:
那么调用default命名范围可以直接使用:
如果你需要在normal命名范围的基础上增加额外的调整,可以使用:
生成的SQL语句是:
当然,也可以在两个命名范围的基础上进行调整,例如:
生成的SQL是:
在Model类定义 $_auto 属性,可以完成数据自动处理功能,用来处理默认值、数据过滤以及其他系统写入字段。$_auto属性是由多个填充因子组成的数组。
填充因子格式:
和自动验证一样,自动完成机制需要使用create方法才能生效。并且,也可以在操作方法中动态的更改自动完成的规则。
最后生成的SQL语句是
表达式 | 含义 |
---|---|
EQ | 等于(=) |
NEQ | 不等于(<>) |
GT | 大于(>) |
EGT | 大于等于(>=) |
LT | 小于(<) |
ELT | 小于等于(<=) |
LIKE | 模糊查询 |
[NOT] BETWEEN | (不在)区间查询 |
[NOT] IN | (不在)IN 查询 |
EXP | 表达式查询,支持SQL语法 |
方法 | 说明 |
---|---|
Count | 统计数量,参数是要统计的字段名(可选) |
Max | 获取最大值,参数是要统计的字段名(必须) |
Min | 获取最小值,参数是要统计的字段名(必须) |
Avg | 获取平均值,参数是要统计的字段名(必须) |
Sum | 获取总分,参数是要统计的字段名(必须) |
ThinkPHP支持定位查询,但是要求当前模型必须继承高级模型类才能使用,可以使用getN方法直接返回查询结果中的某个位置的记录。例如:
获取符合条件的第3条记录:
获取符合条件的最后第二条记录:
获取第一条记录:
获取最后一条记录:
query 执行SQL查询操作 | |
---|---|
用法 | query($sql,$parse=false) |
参数 | query(必须):要查询的SQL语句 parse(可选):是否需要解析SQL |
返回值 |
如果数据非法或者查询错误则返回false 否则返回查询结果数据集(同select方法) |
execute用于更新和写入数据的sql操作 | |
---|---|
用法 | execute($sql,$parse=false) |
参数 | query(必须):要执行的SQL语句 parse(可选):是否需要解析SQL |
返回值 | 如果数据非法或者查询错误则返回false 否则返回影响的记录数 |
支持连贯操作和SQL解析
新版对query和execute两个原生SQL操作方法增加第二个参数支持, 表示是否需要解析SQL (默认为false 表示直接执行sql ),如果设为true 则会解析SQL中的特殊字符串 (需要配合连贯操作)。
例如,支持 如下写法:
其中query方法中的%FIELD%、%TABLE%和%WHERE%字符串会自动替换为同名的连贯操作方法的解析结果SQL,支持的替换字符串包括:
替换字符串 | 对应连贯操作方法 |
---|---|
%FIELD% | field |
%TABLE% | table |
%DISTINCT% | distinct |
%WHERE% | where |
%JOIN% | join |
%GROUP% | group |
%HAVING% | having |
%ORDER% | order |
%LIMIT% | limit |
%UNION% | union |
借助PHP5语言的特性,ThinkPHP实现了动态查询,包括下面几种:
方法名 | 说明 | 举例 |
---|---|---|
getBy | 根据某个字段的值查询数据 | 例如,getByName,getByEmail |
getFieldBy | 根据某个字段查询并返回某个字段的值 | 例如,getFieldByName |
top | 获取前多少条记录(需要高级模型支持) | 例如,top8,top12 |
三、top动态查询
ThinkPHP还提供了另外一种动态查询方式,就是获取符合条件的前N条记录(和定位查询一样,也要求当前模型类必须继承高级模型类后才能使用)。例如,我们需要获取当前用户中积分大于0,积分最高的前5位用户 :
要获取积分的前8位可以改成:
ThinkPHP支持查询或者更新的锁定,只需要在查询或者更新之前使用lock方法即可。
查询锁定使用:
更新锁定使用:
要切换模型,可以使用:
上面的写法也可以改成
如果要传递参数,可以使用:
如果要动态赋值,可以使用:
如果要同时输出多个模板变量,可以使用下面的方式:
模板变量赋值后,怎么在模板文件中输出,需要根据选择的模板引擎来用不同的方法,如果使用的是内置的模板引擎,请参考后面的模板指南部分。如果你使用的是PHP本身作为模板引擎的话 ,就可以直接在模板文件里面输出了,如下:
如果要获得全部的模板变量,可以调用View类的get方法支持获取全部模板变量的值,例如:
格式:display(‘模块名:操作名‘)
例如,当前是User模块,我们需要调用Member模块的read操作模版 ,使用:
Action类的display方法如果传入第四个参数,表示不读取模板文件而是直接解析内容。例如:
会在页面输出: Hello,ThinkPHP!
直接输出的内容仍然支持模板布局功能。
show方法也可以支持指定编码和输出格式,例如:
事实上,display方法还有其他的参数和用法。
有时候某个模板页面我们需要输出指定的编码,而不是默认的编码,可以使用:
或者输出的模板文件不是text/html格式的,而是XML格式的,可以用:
如果你的网站输出编码不是默认的编码,可以使用:
如果要输出XML格式的,可以用:
普通标签 | 主要用于输出变量和做一些基本的操作 |
XML标签 | 主要完成一些逻辑判断、控制和循环输出,并且可扩展 |
普通标签默认开始标记是 {,结束标记是 }。也可以通过设置TMPL_L_DELIM和TMPL_R_DELIM进行更改。例如,我们在项目配置文件中定义:
那么,上面的变量输出标签就应该改成:
如果TMPL_VAR_IDENTIFY留空的话,系统会自动判断要输出的变量是数组还是对象,这种方式会一定程度上影响效率,而且只支持二维数组和两级对象属性。
如果是多维数组或者多层对象属性的输出,可以使用下面的定义方式:
或者使用
用法 | 含义 | 例子 |
---|---|---|
$Think.server | 获取$_SERVER | {$Think.server.php_self} |
$Think.get | 获取$_GET | {$Think.get.id} |
$Think.post | 获取$_POST | {$Think.post.name} |
$Think.request | 获取$_REQUEST | {$Think.request.user_id} |
$Think.cookie | 获取$_COOKIE | {$Think.cookie.username} |
$Think.session | 获取$_SESSION | {$Think.session.user_id} |
$Think.config | 获取系统配置参数 | {$Think.config.app_status} |
$Think.lang | 获取系统语言变量 | {$Think.lang.user_type} |
$Think.const | 获取系统常量 | {$Think.const.app_name}或{$Think.APP_NAME} |
$Think.env | 获取环境变量 | {$Think.env.HOSTNAME} |
$Think.version | 获取框架版本号 | {$Think.version} |
$Think.now | 获取当前时间 | {$Think.now} |
$Think.template | 获取当前模板 | {$Think.template} |
$Think.ldelim | 获取模板左界定符 | {$Think.ldelim} |
$Think.rdelim | 获取模板右界定符 | {$Think.rdelim} |
4、配置参数:输出项目的配置参数值
输出的值和C(‘db_charset‘) 的返回结果是一样的。
也可以输出二维的配置参数,例如:
编译后的PHP代码就是:
注意函数的定义和使用顺序的对应关系,通常来说函数的第一个参数就是前面的变量或者前一个函数调用的返回结果,如果你的变量并不是函数的第一个参数,需要使用定位符号,例如:
编译后的PHP是:
并且还提供了在模板文件中直接调用函数的快捷方法,这种方式更加直接明了,而且无需通过模板变量,包括两种方式:
1、执行函数并输出返回值:
格式:{:function(…)}
例如,输出U函数的返回值:
编译后的PHP代码是
2、执行函数但不输出:
格式:{~function(…)}
例如,调用say_hello函数:
编译后的PHP代码是:
系统内置标签库的所有标签无需引入标签库即可直接使用。XML标签有两种,包括闭合标签和开放标签,一个标签在定义的时候就已经决定了是否是闭合标签还是开放标签,不可混合使用,例如:
闭合标签:
开放标签:
内置支持的标签和属性列表如下:
标签名 | 作用 | 包含属性 |
---|---|---|
include | 包含外部模板文件(闭合) | file |
import | 导入资源文件(闭合 包括js css load别名) | 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代码 | 无 |
可以使用Include标签来包含外部的模板文件,使用方法如下:
include标签(包含外部模板文件) | |
---|---|
闭合 | 闭合标签 |
属性 | file(必须):要包含的模板文件,支持变量 |
1、 使用完整文件名包含
格式:<include file="完整模板文件名" />
2、包含当前模块的其他操作模板文件
格式:<include file="操作名" />
操作模板无需带后缀。
4、包含其他模板主题的模块操作模板
格式:<include file="主题名:模块名:操作名" />
3.1版本开始,include标签支持导入多个模板,用逗号分割即可,例如:
import标签(包含外部模板文件) | |
---|---|
闭合 | 闭合标签 |
属性 | file(必须):要包含的模板文件,支持变量 |
导入外部CSS文件必须指定type属性的值,例如:
上面的方式默认的import的起始路径是网站的Public目录,如果需要指定其他的目录,可以使用basepath属性,例如:
load标签(采用url方式引入资源文件) | |
---|---|
闭合 | 闭合标签 |
属性 | href(必须):要引入的资源文件url地址,支持变量 |
系统还提供了两个标签别名js和css 用法和load一致,例如:
Volist标签主要用于在模板中循环输出数据集或者多维数组。
volist标签(循环输出数据) | |
---|---|
闭合 | 非闭合标签 |
属性 |
name(必须):要输出的数据模板变量 id(必须):循环变量 offset(可选):要输出数据的offset length(可选):输出数据的长度 key(可选):循环的key变量,默认值为i mod(可选):对key值取模,默认为2 empty(可选):如果数据为空显示的字符串 |
通常模型的select方法返回的结果是一个二维数组,可以直接使用volist标签进行输出。
在Action中首先对模版赋值:
在模版定义如下,循环输出用户的编号和姓名:
输出循环变量
如果没有指定key属性的话,默认使用循环变量i,例如:
如果要输出数组的索引,可以直接使用key变量,和循环变量不同的是,这个key是由数据本身决定,而不是循环控制的,例如:
从2.1版开始允许在模板中直接使用函数设定数据集,而不需要在控制器中给模板变量赋值传入数据集变量,如:
foreach标签(循环输出数据) | |
---|---|
闭合 | 非闭合标签 |
属性 | name(必须):要输出的数据模板变量 item(必须):循环单元变量 key(可选):循环的key变量,默认值为key |
For标签用于实现for循环,格式为:
for标签(循环输出数据) | |
---|---|
闭合 | 非闭合标签 |
属性 | start(必须):循环变量开始值 end(必须):循环变量结束值 name(可选):循环变量名,默认值为i step(可选):步进值,默认值为1 comparison(可选):判断条件,默认为lt |
解析后的代码是
其中name属性可以使用函数以及系统变量,例如:
对于case的value属性可以支持多个条件的判断,使用”|”进行分割,例如:
Case标签还有一个break属性,表示是否需要break,默认是会自动添加break,如果不要break,可以使用:
系统支持的比较标签以及所表示的含义分别是:
eq或者 equal | 等于 |
neq 或者notequal | 不等于 |
gt | 大于 |
egt | 大于等于 |
lt | 小于 |
elt | 小于等于 |
heq | 恒等于 |
nheq | 不恒等于 |
例如,要求name变量的值等于value就输出,可以使用:
当name变量的值不小于5就输出
当vo对象的属性(或者数组,或者自动判断)等于5就输出
而且还可以支持对变量使用函数
当vo对象的属性值的字符串长度等于5就输出
变量名可以支持系统变量的方式,例如:
Range标签用于判断某个变量是否在某个范围之内:
范围判断标签(包括innotinbetween notbetween) | |
---|---|
闭合 | 非闭合标签 |
属性 | name(必须):变量名 value(必须):要比较的范围值,支持变量 |
可以使用in标签来判断模板变量是否在某个范围内,例如:
如果判断不再某个范围内,可以使用:
可以把上面两个标签合并成为:
可以使用present标签来判断模板变量是否已经赋值,
present标签和notpresent标签 | |
---|---|
闭合 | 非闭合标签 |
属性 | name(必须):变量名 |
配合 | 可以结合else标签一起使用 |
如果判断没有赋值,可以使用:
可以把上面两个标签合并成为:
可以使用empty标签判断模板变量是否为空,
empty标签和notempty标签 | |
---|---|
闭合 | 非闭合标签 |
属性 | name(必须):变量名 |
配合 | 可以结合else标签一起使用 |
如果判断没有赋值,可以使用:
可以把上面两个标签合并成为:
可以使用defined标签判断常量是否已经有定义:
defined标签和notdefined标签 | |
---|---|
闭合 | 非闭合标签 |
属性 | name(必须):变量名 |
如果判断没有被定义,可以使用:
可以把上面两个标签合并成为:
defined标签和notdefined标签 | |
---|---|
闭合 | 闭合标签 |
属性 | name(必须):常量名 value(必须):常量值,支持变量 |
配合 | 可以结合else标签一起使用 |
assign标签(在模板中给变量赋值) | |
---|---|
闭合 | 闭合标签 |
属性 | name(必须):模板变量名 value(必须):变量值,支持变量 |
用法示例:
除此之外,我们可以在condition属性里面使用php代码,例如:
注意:php标签或者php代码里面就不能再使用标签(包括普通标签和XML标签)了,因此下面的几种方式都是无效的:
下面就是基础模板中的一个典型的区块设计(用于设计网站标题):
block标签必须指定name属性来标识当前区块的名称,这个标识在当前模板中应该是唯一的,block标签中可以包含任何模板内容,包括其他标签和变量,例如:
你甚至还可以在区块中加载外部文件:
literal标签(保持原样输出) | |
---|---|
闭合 | 非闭合标签 |
属性 | 无 |
要更改普遍模板的起始标签和结束标签,请使用下面的配置参数:
例如在项目配置文件中增加下面的配置:
普通模板标签主要用于模板变量输出和模板注释。如果要使用其它功能,请使用XML模板标签。XML模板标签可以用于模板变量输出、文件包含、条件控制、循环输出等功能,而且完全可以自己扩展功能。如果你觉得XML标签无法在正在使用的编辑器里面无法编辑,还可以更改XML标签库的起始和结束标签,请修改下面的配置参数:
例如在项目配置文件中增加下面的配置:
EMERG | 严重错误,导致系统崩溃无法使用 |
ALERT | 警戒性错误, 必须被立即修改的错误 |
CRIT | 临界值错误, 超过临界值的错误 |
ERR | 一般性错误 |
WARN | 警告性错误, 需要发出警告的错误 |
NOTICE | 通知,程序可以运行但是还不够完美的错误 |
INFO | 信息,程序输出信息 |
DEBUG | 调试,用于调试信息 |
SQL | SQL语句,该级别只在调试模式开启时有效 |
要开启日志记录,必须在配置中开启LOG_RECORD参数,以及可以在项目配置文件中配置需要记录的日志级别,例如:
记录方式 | 说明 | 常量标识 |
---|---|---|
SYSTEM | 日志发送到PHP的系统日志记录 | 0 |
日志通过邮件方式发送 | 1 | |
FILE | 日志通过文件方式记录(默认方式) | 3 |
SAPI | 日志通过SAPI方式记录 | 4 |
默认采用文件方式记录日志信息,日志文件的命名格式是:年(简写)_月_日.log,例如:
同样也可以使用throw 关键字来抛出异常,下面的写法是等效的:
如果需要,我们建议在项目的类库目录下面增加Exception目录用于专门存放异常类库,以更加精确地定位异常。
异常模板中可以使用的异常变量有:
设置之后,所有的异常页面只会显示“发生错误!”这样的提示信息,但是日志文件中仍然可以查看具体的错误信息。新版如果关闭调试模式的话,为了安全起见,默认就是关闭异常信息提示。
如果不在当前域名,还可以指定域名:
注意ERROR_PAGE所指向的页面不能再使用异常的模板变量了。
标签:
原文地址:http://www.cnblogs.com/echohao/p/4715421.html