一、视图
1.1、模板定义
默认的模板文件定义规则是:视图目录/[模板主题]/控制器名/操作名+模板后缀
$this->display() //渲染模板输出
"DEFAULT_V_LATER"=>"Templdate" //修改模板的视图目录,默认View
"TMPL_TEMPLATE_SUFFIX"=>".tpl" //修改模板中文件的后缀,默认是.html
"TMPL_FILE_DEPR"=>"_" //用下划线替代目录层次,User_index.tpl
"VIEW_PATH"=>"./Public/" //设置外部模板目录
’DEFAULT_THEME‘=>"default" //设置默认主题目录
$this->theme("blue")->display() //切换主题
1.2、赋值和渲染
$this->assign("username","鲁鲁槟"); //这个方法必须在display()之前使用
{$username}
display([模板文件],[字符编码utf-8],[文件类型text/xml]) //如果不传递参数,按照默认目录定位模板的位置:当前模块/默认视图目录/当前控制器/当前操作.html
$this->display("Bbb/add");
$this->display("Admin@Bbb/add"); //在Admin目录下找模板文件
$this->display(’./Templdate/Public/add.tpl"); //自定义模板
1.3、模板地址 T([资源://][模板@][主题/][控制器/]操作,[视图分层])
echo T(); //输出当前模板
T("Public/add");
T("Admin@add");
T("Admin@Public/add","Template");
$this->display(T()) //直接使用T函数输出
1.4、获取内容:fetch()——主要是可以处理和过滤更加复杂的内容,处理后再由show()方法输出
display() 相当于下面两个函数
$content =$this->fetch(); //获取模板里的内容
$this->show($content); //通过内容再渲染输出
二、模板
变量输出、系统变量、使用函数、使用运算符、包含文件、模板注释、模板继承、模板布局、模板替换
tp 内置了一个基于XML的模板引擎 ThinkTempldate,使用动态编译和缓存技术,支持自定义标签库
2.1、变量输出:$this->assign('username','鲁鲁槟')
①、简单例子
视图中: {$username}
注意: $符号和定界符之间不能有空格
②、修改定界符
"TMPL_L_DELIM"=>""}>"
③、传递数组
$this->assign("data", ["username"=>"鲁鲁槟"]);
在视图中:{$data["username"]} 或者 {$data.username}
④、传递对象
$data = new \stdClass();
$data->username = "鲁鲁槟";
$this->assign("data",$data);
在视图中:{$data->username} 或者 {$data:username}
2.2、系统变量
①、输出PHP系统变量
{$Think.server.script_name} //$_SERVER["SCRIPT_NAME"]
{$Think.session.name} //$_SESSION["name"]
{$Think.cookie.name} //$_COOKIE["name"]
{$Think.get.name} //$_GET["name"]
{$Think.post.name} //$_POST["name"]
{$Think.request.name} //$_REQUEST["name"]
②、ThinkPHP的系统变量
{$Think.const.APP_PATH} //目录
{$Think.config.url_model} //URL模式
{$Think.lang.var_error} //语言变量
2.3、在模板中使用函数
①、参数不是第一个,需要用###表示占位
{$date|date="Y-m-d H:i:s",###}
②、参数是第一个的,不需要用###
{$password|md5}
{$username|mb_substr=0,3,"UTF-8"}
③、多个函数用 “|” 隔开
{$username|mu_substr=0,3,"UTF-8"|md5|sha1}
也可以这样写:
{:md5(mb_substr($username,0,3,"UTF-8"))}
④、空值
{$username|default="没有数据"}
2.4、使用运算符:+、-、*、/、%、--、++
①、{$data['num']+10}
{$data["num"]+getNum()}
②、在使用函数时,不再支持.语言和常规的函数用法:
{$data.num+10} //错误的
{$data["num"]+getNum} //错误,少了括号
③、三元运算符
{$username?"有值":"无值"}
2.5、包含文件
在一个系统中,可以包含通用的头文件:header和footer。
在 View 目录下 default 主题目录下创建一个 Public 目录,专门用于存放公共调用模板文件
也可用绝对地址
同时调用多个模板文件
2.6、模板注释:提供制作人参考
{//这是注释}
{/*这也是注释*/}
{/*这是
多行注释*/}
2.7、模板继承:类似于子类继承父类
①、基础模板需要子模板修改的部分可用包含,并且设置 name 值
主要内容
//子模板只要按相同的方法,修改内部的值既可完成修改
修改了
②、创建Public下base.html模板基页
{$title} 主要内容
//使用导入模板基页,name为路径,和include 导入方法一致
修改了
2.8、模板布局
①、全局配置方式
"LAYOUT_ON" => true,
"LAYOUT_NAME"=>"Public/layout", //layout.html文件
标题 {__CONTENT__}
‘TMPL_LAYOUT_ITEM’=>"{__REPLACE__}" //替换变量可以更为{__REPLACE__}
//子模板不需要载入模板基页,可以在开头加上 {__NOLAYOUT__}
②、模板标签方式:在视图中使用
//子模板引入模板资源
//替换变量的方法
③、layout 控制布局:在控制器中使用
layout(true);//开启布局,并引入默认地址基页
layout("Public/layout"); //开启布局,并引入输入的地址基页
layout(false); //关闭布局
2.9、模板替换
在模板渲染之前,系统会对读取的模板内容进行一些特殊字符串的替换操作,也就实现了模板输出的替换和过滤。
__ROOT__:会替换当前网站的地址(不含域名)
__APP__:会替换成当前应用的URL地址(不含域名)
__MODULE__:会替换成当前模块的URL地址(不含域名)
__CONTROLLER__(或者__URL__ 兼容考虑):会替换成当前控制器的URL地址(不含域名)
__ACTION__:会替换成当前操作的URL地址(不含域名)
__SELF__:会替换成当前的页面的URL
__PUBLIC__:会替换成当前网站的公共目录,通常是 /Public/
"TMPL_PARSE_STRING"=>[
"__PUBLIC"=>"/Common", //更改默认的 /Public 替换规则
"__UPLOAD"=>"/Upload"" //增加新的上传路径替换规则
]
PS: __PUBLIC__ 改成 --PUBLIC-- 同样也可以
三、内置标签:判断比较、遍历循环、其他标签
模板引擎提供的一组可以完成控制、循环和判断功能的类似 HTML 语言的标签
3.1、判断比较
3.1.1、 IF
槟 小新 错误
PS:condition 属性中支持 eq 等判断表达式,由于会导致模板解析混淆,所以不支持 > < 等表达式
①、condition 条件里可以使用 PHP 函数
②、condition 条件里使用点语法,智能判断数组或对象
③、condition 条件里使用冒号语法,直接使用对象
④、condition 条件使用系统变量
3.1.2、switch 标签
槟小新错误
//默认加上break,去除break
槟
3.1.3、简单比较标签:可以加else(可以加else)
eq/equal、neq/notequal、gt、egt、lt、elt、heq恒等于、nheq小新
比较标签还提供一个统一标签 compare,比较类型通过type属性完成
槟
3.1.4、范围判断标签:in、notin、between、notbetween
id在范围内id在范围内id在范围内 id在范围内 id不在范围内
范围标签还提供一个统一标签 range,范围类型通过type属性完成
槟
3.1.5、判断变量是否已赋值,空字符串也算赋值,编译后是isset:present、notpresent:也可以用else
username已经赋值
3.1.6、判断变量是否为空 empty、notempty:支持else
username为空值
3.1.7、判断常量是否定义 defined
APP_PATH常量已定义
3.2、遍历循环:volist、foreach、for
3.2.1、voilst 通常用于查询数据集的结果输出,通过select()方法返回的是一个二维数组,可以直接使用volist标签输出
{$arr.id}
①、offset、length
{$arr.id}
②、mod求当前余数,当前index(从 0 开始)除以2余1,输出偶数
{$arr.id}
③、没有数据的情况下,使用empty填充
{$arr.id}
注意:empty属性不支持 html 直接输入,但可以通过变量输出
$this->assign("empty","没有任何数据");
④、通过 key 输出循环遍历的变量,从 1 开始
{$k}
没有指定 key,也可用 i 输出变量
{$i}
key变量,可以直接输出索引值,从0开始
{$key}
3.2.2、foreach 标签和 volist 标签类似,只不过 foreach 标签更加简单,没有额外属性:只支持key属性
{$arr.id}
3.2.3、for 就是简单的循环标签
{$i}
除了start和end必须值,还有三个可选:comparison是大于还是小于(默认小于)、name 是循环变量名,默认值为i、step 是步进值,默认为1
{$k}
3.3、其他标签
3.3.1、assign在模板中定义变量、define在模板中定义常量
{$var}{$Think.const.MY_NAME}
3.3.2、使用 import 导入js、css
//这里的js是目录 //这里的css是目录
使用basepath修改默认路径
3.3.3、使用load 加载标签可以智能加载js和css
3.3.4、系统还提供了专门加载 css、js 的标签
3.3.5、在模板文件中使用php 代码
①、使用 php 标签
$a = 1;
$b = 2;
echo $a+$b;
②、使用 php 语言
③、原样输出标签及内容,用 literal 标签
echo 123;
四、标签库:内置标签、扩展标签
4.1、内置标签
在 Think/Library/Think/Template/TagLib 下有标签库。
在完整版中提供两个类文件:Cx.class.php(内置标签核心类)、Html.class.php(html扩展标签
4.2、扩展标签
4.2.1、如果要使用 Html.class.php 的扩展标签,那么首先导入这个标签:
在使用标签的时候,前面需要加上 html:表示这个是 html 标签库
4.2.2、将 Cx 和 html 都设置为内置标签
"TAGLIB_BUILD_IN"=>"cx,html"
设置成为内置标签,就不需要 html 了:
注意:设置为内置标签有一定的危险性,因为可能会出现标签的重复导致冲突。
我们也可以预加载内置标签,这样不用每次都导入:'TAGLIB_PRE_LOAD'=>'html'
4.23、扩展标签
①、在 Think/Library/Think/Template/TagLib 下创建一个 Test.class.php
namespace Think\Template\TagLib;
use Think\Template\TagLib;
define("THINK_PATH") or exit();
class Test extends TagLib{
//标签定义
proteced $tags = [
"mytest"=>["attr"=>"color,border","close"=>1]
];
//$tag 是 ["color"=>red,"border"=>5]
//$content 是 “测试标签”
public function _mytest($tag,$content){
$color = "";
$border = "";
if(isset($tag["color"])){
$color = "color:".$tag["color"].";";
}
if(isset($tag["border"])){
$border = "border:".$tag["border"]."px solid #ccc;";
}
$css = $color.$border;
return "."$content".";
}
}
测试标签