Thinkphp3 第3章 视图View Thinkphp3 第3章 视图View

2018-02-08

一、视图

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".";
    }
}
测试标签

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开微信扫一扫,即可进行扫码打赏哦

阅读 3376