视图模板

视图

视图功能由\think\View类配合视图驱动(模板引擎)类一起完成,目前的内置模板引擎包含PHP原生模板和Think模板引擎。

因为新版的控制器可以无需继承任何的基础类,因此在控制器中如何使用视图取决于你怎么定义控制器。

如果你的控制器继承了\think\Controller类的话,则无需自己实例化视图类,可以直接调用控制器基础类封装的相关视图类的方法。

 // 渲染模板输出
return $this->fetch('hello',['name'=>'thinkphp']);

下面的方法可以直接被调用:

方法 说明
fetch 渲染模板输出
display 渲染内容输出
assign 模板变量赋值
engine 初始化模板引擎

如果需要调用View类的其它方法,可以直接使用$this->view 对象:

助手函数

如果你只是需要渲染模板输出的话,可以使用系统提供的助手函数view,可以完成相同的功能:

return view('hello',['name'=>'thinkphp']);

模板赋值

namespace index\app\controller;

class Index extends \think\Controller
{
    public function index()
    {
        // 模板变量赋值
        $this->assign('name','ThinkPHP');
        $this->assign('email','thinkphp@qq.com');
        // 或者批量赋值
        $this->assign([
            'name'  => 'ThinkPHP',
            'email' => 'thinkphp@qq.com'
        ]);
        // 模板输出
        return $this->fetch('index');
    }
}

模板渲染

// 不带任何参数 自动定位当前操作的模板文件
return $this->fetch();

表示系统会按照默认规则自动定位模板文件,其规则是:
当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html

// 指定模板输出 表示调用当前控制器下面的edit模板
return $this->fetch('edit'); 

表示调用Member控制器下面的read模板。
return $this->fetch('member/read');

跨模块渲染模板
return $this->fetch('admin@member/edit');

模板标签

要更改普通标签的起始标签和结束标签,可以更改下面的配置参数:

'template'      => [
    // 模板引擎
    'type'   => 'think',
    //标签库标签开始标签 
    'taglib_begin'  =>  '<',
    //标签库标签结束标记
    'taglib_end'    =>  '>',     
],

输出模板标签就需要改成

<eq name="name" value="value">
相等
<else/>
不相等
</eq>

变量输出

$view = new View();
$view->name = 'thinkphp';
return $view->fetch();

Hello,{$name}!

系统变量输出

{$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量
{$Think.session.user_id} // 输出$_SESSION['user_id']变量
{$Think.get.pageNumber} // 输出$_GET['pageNumber']变量
{$Think.cookie.name}  // 输出$_COOKIE['name']变量

请求参数

模板支持直接输出Request请求对象的方法参数,用法如下:

// 调用Request对象的get方法 传入参数为id
{$Request.get.id}
// 调用Request对象的param方法 传入参数为name
{$Request.param.name}
// 调用Request对象的param方法 传入参数为user.nickname
{$Request.param.user.nickname}
// 调用Request对象的root方法
{$Request.root}
// 调用Request对象的root方法,并且传入参数true
{$Request.root.true}
// 调用Request对象的path方法
{$Request.path}
// 调用Request对象的module方法
{$Request.module}
// 调用Request对象的controller方法
{$Request.controller}
// 调用Request对象的action方法
{$Request.action}
// 调用Request对象的ext方法
{$Request.ext}
// 调用Request对象的host方法
{$Request.host}
// 调用Request对象的ip方法
{$Request.ip}
// 调用Request对象的header方法
{$Request.header.accept-encoding}

使用函数

我们往往需要对模板输出变量使用函数,可以使用:
{$data.name|md5} 

编译后的结果是:
<?php echo (md5($data['name'])); ?>

{$data.name|substr=0,3}


如果函数有多个参数需要调用,则使用:
{$create_time|date="y-m-d",###}

还可以支持多个函数过滤,多个函数之间用“|”分割即可,例如:
{$name|md5|strtoupper|substr=0,3}

使用默认值

给变量输出提供默认值,例如:
{$user.nickname|default="这家伙很懒,什么也没留下"}

系统变量依然可以支持默认值输出,例如:
{$Think.get.name|default="名称为空"}

默认值和函数可以同时使用,例如:
{$Think.get.name|getName|default="名称为空"}

三元运算

{$status? '正常' : '错误'}
{$info['status']? $info['msg'] : $info['error']}
{$info.status? $info.msg : $info.error }

原样输出

可以使用literal标签来防止模板标签被解析,例如:

{literal}
    Hello,{$name}!
{/literal}

模板注释

单行注释
{/* 注释内容 */ } 或 {// 注释内容 } 

多行注释
{/* 这是模板
注释内容*/ }

模板布局

全局配置方式

'template'  =>  [
    'layout_on'     =>  true,
    'layout_name'   =>  'layout',
]

首先会渲染application/index/view/layout.html 模板,布局模板的写法和其他模板的写法类似,本身也可以支持所有的模板标签以及包含文件,区别在于有一个特定的输出替换变量{__CONTENT__},例如,下面是一个典型的layout.html模板的写法:

{include file="public/header" /}
 {__CONTENT__}
{include file="public/footer" /}

包含文件

在当前模版文件中包含其他的模版文件使用include标签,标签用法:
{include file='模版文件1,模版文件2,...' /}

使用模版表达式
{include file="public/header" /} // 包含头部模版header
{include file="public/menu" /} // 包含菜单模版menu
{include file="blue/public/menu" /} // 包含blue主题下面的menu模版

内置标签

标签名 作用 包含属性
include 包含外部模板文件(闭合) file
load 导入资源文件(闭合 包括js css import别名) 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代码
powered by GitbookEdit Time: 2023-04-08 10:28:32