视图模板

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

模板渲染

以下模板渲染的方法,除了助手函数,其他的都需要继承了 \think\Controller

默认的视图目录是模块的view目录

<?php
namespace app\home\controller;

use think\Controller;

class Index extends Controller
{
    // 定义属性
    protected $BusinessModel = null; 

    // 控制器初始化
    public function _initialize()
    {
        // 实例化模型
        $this->BusinessModel = model('Business.Business');
    }

    // 查询数据
    public function index()
    {

        /* 
            不带任何参数 自动定位当前操作的模板文件

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

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

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

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

        // 助手函数
        return view();

        // 调用this->view对象 如果需要调用View类的其它方法,可以直接使用$this->view对象
        return $this->view->fetch();
    }
}

模板赋值

除了系统变量和配置参数输出无需赋值外,其他变量如果需要在模板中输出必须首先进行模板赋值操作

<?php
namespace app\home\controller;

use think\Controller;

class Index extends Controller
{
    // 定义属性
    protected $BusinessModel = null; 

    // 控制器初始化
    public function _initialize()
    {
        // 实例化模型
        $this->BusinessModel = model('Business.Business');
    }

    // 查询数据
    public function index()
    {

        // 模板变量赋值
        $this->assign('name','ThinkPHP');
        $this->assign('email','thinkphp@qq.com');

        // 或者批量赋值
        $this->assign([
            'name'  => 'ThinkPHP',
            'email' => 'thinkphp@qq.com'
        ]);

        // 在fetch这个方法里模板赋值
        return $this->fetch('',[
            'name'  => 'ThinkPHP',
            'email' => 'thinkphp@qq.com'
        ]);

        // 助手函数
        return view('',[
            'name'  => 'ThinkPHP',
            'email' => 'thinkphp@qq.com'
        ]);
    }
}

变量输出

在模板中输出在控制器赋值的变量或者系统变量

控制器代码

<?php
namespace app\home\controller;

use think\Controller;

class Index extends Controller
{
    // 定义属性
    protected $BusinessModel = null; 

    // 控制器初始化
    public function _initialize()
    {
        // 实例化模型
        $this->BusinessModel = model('Business.Business');
    }

    // 查询数据
    public function index()
    {
        // 用户数据
        $data = [
            'name' => 'demo',
            'email' => 'demo@qq.com'
        ];

        // 多维数组
        $UserData = [
            [
                'id' => 1,
                'name' => 'demo',
                'age' => 18,
                'sex' => 1
            ],
            [
                'id' => 2,
                'name' => 'admin',
                'age' => 22,
                'sex' => 2
            ],
            [
                'id' => 3,
                'name' => 'test',
                'age' => 28,
                'sex' => 2
            ]
        ];

        // 模板赋值
        $this->assign([
            'name'  => 'ThinkPHP',
            'email' => 'thinkphp@qq.com',
            'user' => $data,
            'UserData' => $UserData
        ]);

        // 模板渲染
        return $this->fetch();
    }
}

HTML代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>测试</title>
</head>
<body>
    <!--
        输出$name
        注意模板标签的{和$之间不能有任何的空格,否则标签无效
    -->
    {$name}

    <!--
        单行注释
    -->
    {// $email}
    {/* $email */}

    <!-- 多行注释 -->
    {/*
        这里内容不会在页面显示
        第二行也是    
    */}

    <!-- 输出一维数组 -->
    {$user.name}
    {$user['name']}

    <!-- 循环输出多维数组 -->
    <table>
        <tr>
            <th>ID</th>
            <th>名字</th>
            <th>年龄</th>
            <th>性别</th>
        </tr>
        <!-- foreach 标签 -->
        {foreach $UserData as $item}
            {/*
                if 标签
                {if (条件)}
                    条件成立时所执行的代码
                {else /}
                    条件不成立时所执行的代码
                {/if}    
            */}

            <!-- 只输出年龄大于18的数据 -->
            {if($item['age'] > 18)}
                <tr>
                    <td>{$item['id']}</td>
                    <td>{$item['name']}</td>
                    <td>{$item['age']}</td>
                    <!-- 三元运算符 -->
                    <td>{$item['sex'] == 1 ? '男' : '女'}</td>
                </tr>
            {/if}
        {/foreach}
    </table>
</body>
</html>

系统变量输出

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>测试</title>
</head>
<body>
    <!-- 输出$_SERVER['SCRIPT_NAME']变量 -->
    {$Think.server.script_name}

    <!-- 输出$_SESSION['user_id']变量 -->
    {$Think.session.user_id}

    <!-- 输出$_GET['pageNumber']变量 -->
    {$Think.get.pageNumber}

    <!-- 输出$_COOKIE['name']变量 -->
    {$Think.cookie.name}
</body>
</html>

常量输出

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>测试</title>
</head>
<body>
    <!-- 第一种写法 -->
    {$Think.const.APP_PATH}

    <!-- 第二种写法 -->
    {$Think.APP_PATH}
</body>
</html>

配置输出

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>测试</title>
</head>
<body>
    {$Think.config.default_module}
    {$Think.config.default_controller}
</body>
</html>

使用函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>测试</title>
</head>
<body>
    <!-- 使用md5函数 -->
    {$data.name|md5}

    <!--
        函数有多个参数需要调用
        date函数传入两个参数,每个参数用逗号分割,这里第一个参数是y-m-d,第二个参数是前面要输出的create_time变量,因为该变量是第二个参数,因此需要用###标识变量位置
    -->
    {$create_time|date="y-m-d",###}

    <!-- 如果觉得这样写起来比较麻烦,也可以直接这样写 -->
    {:date('Y-m-d',1685723898)}
</body>
</html>

模板布局

全局配置方式

application\config.php

模块配置方式

application\home\config.php

<?php

return [
    ...
    // 模板设置
    'template'  =>  [
        // 开启模板布局
        'layout_on'     =>  true,
        // 布局文件名称
        'layout_name'   =>  'layout',
    ]
    ...
]

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

layout.html 模板的写法:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>layout</title>
</head>
<body>
    <!-- 引入公共头部 -->
    {include file='common/header' /}

    <!-- 输出替换变量 -->
    {__CONTENT__}

    <!-- 引入公共底部 -->
    {include file='common/footer' /}
</body>
</html>
powered by GitbookEdit Time: 2024-06-06 18:25:40