ThinkPHP5.0教程学习07:TP5 视图与模板

学习教程来源于:
php中文网 ThinkPHP5 视频教程
ThinkPHP5.0完全开发手册

视图实例化的三种方式:动态/静态/助手函数
一、直接实例化视图类

1.视图类:thinkphp/library/think/View.php
2.命名空间:use think/View
3.实例化:动态new View(); 静态View::instance();
4.常用方法:fetch()渲染模板,display()渲染内容,assign()模板赋值

<?php
namespace app\index\controller;
use think\View;

class Index
{
    public function index()
    {
        //1.动态创建
        // $view = new View();
        //2.静态创建
        $view = view::instance();
        //模板赋值
        $view->assign('domain','www.php.cn');
        //渲染模板
        return $view->fetch();
    }
}

二、继承控制器基类Controller(推荐)

1.控制器类:thinkphp/library/think/Controller.php
2.命名空间:use think\Controller
3.实例化:$this->view //可访问View类所以属性或方法
4.常用方法:$this->fetch()渲染模板,$this->display()渲染内容,$this->assign()模板赋值,$this->engine()模板引擎

<?php
namespace app\index\controller;

class Index extends \think\Controller
{
    public function index()
    {
        //$this->view ===> 视图对象
        $this->assign('sitename','php中文网');
        $this->assign('domain','www.php.net');
        //渲染模板
        return $this->fetch();
    }
}
三、助手函数view()

1.不用继承Controller基类,不用实例化View类,都可以使用
2.仅适合模板渲染,功能单一,不用加载配置
3.语法:view('模板文件',[模板变量数组],[模板替换数组]);
4.使用方法实例:view('user',['name'=>'tp5'],['__SITE__'=>'php.cn']);

配置模板引擎的三种方法:Config文件/类实例化传参/config方法
一、通过应用配置文件config.php
<?php
'template' => [
	'type'			=> 'Think',	//模板引擎类型支持php/think支持扩展
	'view_base'		=> '',		//视图基础目录,配置目录为所有模块起始目录
	'view_path'		=> '',		//当前模板视图目录,留空为自动获取
	'view_suffix'	=> 'html',	//模板后缀
	'view_depr'		=> DS,		//模板文件名分隔符
	'tpl_begin'		=> '{',		//模板引擎普通标签开始标记
	'tpl_end'		=> '}',		//模板引擎普通标签结束标记
	'taglib'		=> '{',		//标签库标签开始标记
	'taglib'		=> '}',		//标签库标签结束标记
]
二、实例化View类时传参配置
<?php
$view = new View([
	'type'			=> 'Think',	//模板引擎类型支持php/think支持扩展
	'view_base'		=> '',		//视图基础目录,配置目录为所有模块起始目录
	'view_path'		=> '',		//当前模板视图目录,留空为自动获取
	'view_suffix'	=> 'html',	//模板后缀
	'view_depr'		=> DS,		//模板文件名分隔符
	'tpl_begin'		=> '{',		//模板引擎普通标签开始标记
	'tpl_end'		=> '}',		//模板引擎普通标签结束标记
	'taglib'		=> '{',		//标签库标签开始标记
	'taglib'		=> '}',		//标签库标签结束标记
]);
三、调用View类config()方法进行配置

1.源码:$this->engine->config($name,$value)
2.实际调用的是对应模板引擎类的config方法,支持数组
3.支持所有模板配置项
4.用法:$view->config('配置名','值')->fetch();或者$this->view->config('view_suffix','php')

模板变量赋值的五种方法:方法/传参/对象/静态/助手函数
一、通过assign()方法(推荐方法)

assign()方法即可以用视图类,也可以用控制器调用(继承基类)
1.单独赋值:$this->assign('变量名','值')
$this->assign('domain','php.cn'); //$domain = 'php.cn'

2.批量赋值:$this->assign(['变量名1'=>'值2','变量名2'=>'值2',...])

$this->assign([
	'domain'=>'www.php.cn',
	'siteName'=>'php中文网',
]);
二、fetch()或display()方法传参赋值

1.$this->fetch('模板文件',['变量名1'=>'值1','变量名2'=>'值2',...])
return $this->fetch('index',['name'=>'Peter','age'=>28]);

2.$this->display('内容',['变量名1'=>'值1','变量名2'=>'值2',...])
return $this->display('姓名:{$name},年龄:{$age}',[ 'name'=>'Peter', 'age'=>28, ]);

三、给视图对象添加属性的方式赋值

1.先获取视图对象,通过给它动态添加属性的方式给模板赋值
2.继承基类:$this->view->$name=$value
3.视图类:\think\View::instance()->$name=$value

<?php
namespace app\index\controller;


// class Index extends \think\Controller
class Index
{
    public function index()
    {
        // $this->view->name = '朱老师';
        \think\View::instance()->name = '朱老师';
        // $this->view->lesson = 'javascript';
        \think\View::instance()->lesson = 'HTML5';
        return \think\View::instance()->fetch();
    }
}
四、用share()方法给模板添加静态变量

1.支持在任何地方使用静态方法进行模板变量赋值
2.视图类调用:\think\View::share($name,$value);
3.控制器继承调用:$this->view->share($name,$value); //不推荐
4.全局静态模板变量最终会和前面使用方法赋值的模板变量合并

<?php
namespace app\index\controller;

class Index
{
    public function index()
    {
        // $this->view->name = '朱老师';
        \think\View::instance()->name = '朱老师';
        // $this->view->lesson = 'javascript';
        \think\View::instance()->lesson = 'HTML5';
        \think\View::share('siteName','php中文网');
        return \think\View::instance()->fetch();
    }
}

五、用助手函数view()向模板赋值

1.view()不依赖控制器继承和视图类,可随时调用
2.单独赋值:view($name,$value)
3.批量赋值:view('模板文件',['key1'=>'value1','key2'=>'value2',...]);

<?php
namespace app\index\controller;

class Index
{
    public function index()
    {
        return view('index',[
            'name'=>'张老师',
            'lesson'=>'css',
            'siteName'=>'www.css.net',
        ]);
    }
}

模板的七种渲染方法:默认/跨控制器和模块/任意位置/视图目录/应用入口

1.语法:fetch('模板文件',[模板变量数组]);
2.模板定位规则:当前模块/默认视图目录/当前控制器/当前操作.html
举例:index模块/user控制器/edu操作.html(默认模板后缀)
3.模板文件语法:

用法描述举例
不带任何参数自动定位模板$this->fetch()
[控制器/][操作]跨控制器调用模板$this->fetch('user/index')
[模块@][控制器/][操作]跨模块调用模板$this->fetch('admin@user/index')
完整模板文件名绝对地址(加后缀)$this->fetch('/public/tpl/user/login.hrml')

视图渲染注意事项

1.模板文件可以不依赖于控制器操作而独立存在:fetch('目录/模板文件');
2.渲染模板时,可以同时给模板传入变量:fetch('模板文件',[变量数组]);
3.可以读取视图根目录view下的模板:/模板文件;
4.可以直接访问应用入口目录public/下面的模板:./目录/模板文件.html
5.只要访问的模板不是在视图目录下,就必须用加后缀的完整模板文件名称

<?php
namespace app\index\controller;


class Index extends \think\Controller
{
    public function index()
    {
        // return $this->fetch();
        // return $this->fetch('user/login');
        // return $this->fetch('admin@index/demo');
        // return $this->fetch('/test');
        return $this->fetch('./tpl/demo.html');
    }
}
模板内容替换:局部与全局配置
1.替换内容
预定义对应目录描述
ROOT/应用入口/项目根目录
URLmodule/controller当前访问地址
STATIC/public/static/应用静态资源目录
CSS/static/css应用的CSS文件目录
JS/static/js应用的JavaScript文件目录
2.替换方式

①单独替换:通过fetch方法或助手函数view()对当前模板进行替换

return $this->fetch('index',[模板变量数组(不可不写)],['__PUBLIC__'=>'/public/']);
return view('index',[],['__PUBLIC__'=>'/public/']);
<?php
namespace app\index\controller;

class Index extends \think\Controller
{
    public function index()
    {
        // return $this->fetch('index',[],[
        //     'www.php.cn'=>'php中文网',
        //     '__CSS__'=>'/static/css',
        // ]);
        
        return view('index',[],[
            'www.php.cn'=>'php中文网',
            '__CSS__'=>'/static/css',
        ]);
    }
}

②全局替换:通过应用配置文件中view_replace_str数组进行替换

'view_replace_str'=>[
	'__PUBLIC__'=>'/public/',
	'__ROOT__'=>'/',
];

模板内容个替换通常是导入外部模板文件是,要做的第一件事,可以通过批量替换方式,大大提高页面静态资源引入速度,提高吸纳灌木的规范与可维护性

模板自定义变量的输出:标量/数组/对象
一、普通变量

1.自定义变量:用户在控制器创建的变量
2.普通变量又叫单值变量和标量
3.语法:{$变量名称} //{}与内容之间不能有空格

二、复合变量

1.复合变量主要是指数组和对象
2.数组使用点语法或方括号来访问:{$user.id},{$user['email']}
3.对象使用冒号或指向符来访问:{$book:name},{$book->price}

模板中系统变量的输出:$Think开头的变量

1.系统变量不需要赋值,可直接在模板中输出
2.系统变量都是以$Think开头
语法格式:$Think.类型.参数

常用类型:$_SERVER/$_ENV/$_POST/$_GET/$_REQUEST/$_SESSION/$_COOKIE/const/config

模板中请求变量的输出:$Request.方法.参数

1.不必同控制器,可以在模板中直接获取请求信息
2.请求变量必须以$Request开头,首字母大写
语法格式:$Request.方法.参数

常用方法有:param/get/post/root/path/pathinfo/module/controller/action/ext/host/ip
参数可选,无参则直接输出结果,通常仅输出第一个参数

用函数处理模板中的变量:变量调节器的作用

参考:ThinkPHP5.0 模板 使用函数

变量调节器:对模板中的变量使用函数进行处理

1.一个参数:{$变量|函数} 例如:{$pass|md5}
2.俩个及以上参数,{$变量|函数="参数1",###}
如果函数有多个参数需要调用,则使用:
{$create_time|date="y-m-d",###}
表示date函数传入两个参数,每个参数用逗号分割,这里第一个参数是y-m-d,第二个参数是前面要输出的create_time变量,因为该变量是第二个参数,因此需要用###标识变量位置,编译后的结果是:
<?php echo (date("y-m-d",$create_time)); ?>
3.直接处理:{:函数名(参数)}
例:{:substr(stroupper(md5($name)),0,3)}

<p>$domain的md5加密:{$domain|md5}</p>
<p>$birthday格式化输出:{$birthday|date='Y/m/d',###}</p>
<p>www.php.cn从第四个字符开始到结束:{$domain|substr=###,4}</p>
<p>www.php.cn从第四个字符开始到结束:{$domain|substr=4}</p>
<p>去掉域名后缀:{$domain|substr=4,3}</p>
<p>函数的直接调用,即域名后缀:{:substr($domain,-2,2)}</p>
<p>管道调用:{:md5(substr($domain,-2,2))}</p>
模板默认值与运算符:无值也可以输出
一、模板变量的默认值

1.自定义变量设置默认值
2.系统变量设置默认值
3.变量的函数与默认值可以同时使用

二、模板变量的算术运算符
运算符示例说明
+{$x+$y}加法
-{$x-$y}减法
*{$x*$y}乘法
/{$x/$y}除法
%{$x%$y}取模
++/–{$x++}/{$y--}自增/自减
四则{$x+10*$y}综合
原样输出与模板注释
一.原样输出
{literal}
	模板标签,例如:hello{$name}	//不会被解析
{/literal}

需要注意的是配置view_replace_str替换参数,会替换掉lieral标签内的内容,可以配置template.tpl_replace_string避免替换掉literal标签内的内容

二、模板注释

1.单行注释:
{/*注释内容*/}{//注释内容}

2.多行注释

{/*
	注释内容
*/}

生成缓存文件时会自动删除注释

模板布局:全局配置/模板配置/控制器配置
一、全局配置

公共模板文件

1.很多页面中,总有一些共同的部分:头部,尾部,侧边栏等
2.将这些页面剥离出来,制作公共文件,需要时再导入
3.这样就实现了代码共享,无论是创建新页面,还是更新都很方便
4.这样的公共文件就叫作公共模板文件
5.ThinkPHP5中,针对这类需求,是用模板布局进行解决的

'template' => [
	'layout_on' => true,				//开启模板布局
	'layout_name' => 'layout',			//设置布局模板文件名称
	'layout_item' => '{__REPLACE__}',	//设置布局模板中的替换字符串
										//默认{__CONTENT__}
]

渲染流程:控制器->布局模板->用户模板

二、模板里配置

1.必须关闭模板布局全局配置:防止布局循环
2.在view目录下创建自定义布局文件
3.在模板中使用:
{layout name="Layout/newlayout" replace="[__REPLACE__]"/}
导入布局文件内容

在控制器中动态的控制模板布局

$this->view->engine->layout(参数)
参数可取值:
①true:采用默认布局模板:layout.html
②false:临时关闭当前模板布局功能
③文件名:用户自定义布局模板名称

模板继承

参考:(ThinkPHP5.0 模板继承)https://www.kancloud.cn/manual/thinkphp5/125014

语法
1.在父模板中用{block}内容{/block}来为子模板内容预留位置
2.子模板必须将父模板中预留位置(区块)全部用代码实现
3.子模板中{block}中内容留空,将会删除对应区块
4.区块中可以使用模板变量,也可以导入外部文件
5.子模板可用__BLOCK__来引用父模板中原区块内容

模板继承演示图
在这里插入图片描述

循环标签:大量数据输出工具

语法:
1.volist
{volist name='模板变量' id='临时变量' offset='索引' length='数量' key='循环变量' empty='提示信息'}

2.foreach
{foreach name='模板变量' item='临时变量'}

3.for
{for start='开始值' end='结束值' comparison='比较关系It' step='步进值1' name='循环变量名i'}

全部都是闭合标签,结尾要加:{/标签名}

volist适合输出格式较为复杂的数据,foreach语法简单,适合输出简单数据,for标签适合输出大量重复样式,不适合数据输出

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<p>index模块下index控制器index操作对应模板</p>
	<table border="1" cellpadding="2" cellspacing="0" width="40%">
		<caption style="font-size: 22px; font-weight:bold ">员工信息表</caption>
		<tr>
			<th>编号</th>
			<th>姓名</th>
			<th>性别</th>
			<th>年龄</th>
			<th>工资</th>
		</tr>
		<!-- volist循环 -->
		{volist name='user' id='vo' key='k' offset="2" length="5" empty="数据为空"}
		<!-- <tr>
			<td>{$k}</td>
			<td>{$vo.name}</td>
			<td>{$vo.sex}</td>
			<td>{$vo.age}</td>
			<td>{$vo.salary}</td>
		</tr> -->
		{/volist}
		<!-- foreach循环 -->
		{foreach name='user' item='value'}
		<!-- <tr>
			<td>{$key}</td>
			<td>{$value.name}</td>
			<td>{$value.sex}</td>
			<td>{$value.age}</td>
			<td>{$value.salary}</td>
		</tr> -->
		{/foreach}
		<!-- for循环 -->
		{for start='0' end='10' comparison='lt' name='i' step='1'}
			<tr>
				{for start='0' end='5' comparison='lt' name='j' step='1'}
					<td>{$j*5+$i}</td>
				{/for}
			</tr>
		{/for}
	</table>
</body>
</html>
比较标签

1.比较标签仅用于模板变量与普通值之间的简单比较,其包括一组标签,用法基本一致
2.语法

{比较标签 name="变量" value="值"}
	内容
{else/}//可选
内容
{/比较标签}

3.支持的关系包括
eq->等于 ,neq->不等于,gt->大于,egt->大于等于,lt->小于,elt->小于等于,heq->恒等于,nheq->不恒等于

所有的比较标签可以统一使用compare标签(其实所有的比较标签都是compare标签的别名),例如: 当name变量的值等于5就输出
{compare name="name" value="5" type="eq"}value{/compare}
等效于
{eq name="name" value="5" }value{/eq}
其中type属性的值就是上面列出的比较标签名称

条件判断标签:双分支/多分支/范围
一、if条件判断标签

condition属性中支持原始PHP代码

{if condition="($name == 1) OR ($name > 100) "} value1
{elseif condition="$name eq 2"/}value2
{else /} value3
{/if}
二、switch多分支条件判断标签
{switch name="变量" }
    {case value="值1" break="0或1"}输出内容1{/case}
    {case value="值2"}输出内容2{/case}
    {default /}默认情况
{/switch}

对于case的value属性可以支持多个条件的判断,使用”|”进行分割,例如:

{switch name="Think.get.type"}
    {case value="gif|png|jpg"}图像格式{/case}
    {default /}其他格式
{/switch}

Case标签还有一个break属性,表示是否需要break,默认是会自动添加break,如果不要break,可以使用:

{switch name="Think.get.userId|abs"}
    {case value="1" break="0"}admin{/case}
    {case value="2"}admin{/case}
    {default /}default
{/switch}

也可以对case的value属性使用变量,例如:

{switch name="User.userId"}
    {case value="$adminId"}admin{/case}
    {case value="$memberId"}member{/case}
    {default /}default
{/switch}

使用变量方式的情况下,不再支持多个条件的同时判断。

三、范围判断标签

范围判断标签包括in notin between notbetween四个标签,都用于判断变量是否中某个范围。

{range name="模板变量" value="范围" type="类型"}内容1
{else/}内容2
{/range}

范围类型快捷标签:
1.{in/noin name="模板变量" value="范围"}内容{/in/noin}
2.{between/nobetween name="模板变量" value="范围"}内容{between/nobetween}
3.也可以直接使用range标签,替换前面的判断用法:

{range name="id" value="1,2,3" type="in"}
输出内容1
{/range}

其中type属性的值可以用in/notin/between/notbetween,其它属性的用法和IN或者BETWEEN一致。

四、存在或空值判断

present标签用于判断某个变量是否已经定义,用法:

{present name="name"}
name已经赋值
{/present}

如果判断没有赋值,可以使用:

{notpresent name="name"}
name还没有赋值
{/notpresent}

empty标签用于判断某个变量是否为空,用法:

{empty name="name"}
name为空值
{/empty}

如果判断没有赋值,可以使用:

{notempty name="name"}
name不为空
{/notempty}

DEFINED标签用于判断某个常量是否有定义,用法如下:

{defined name="NAME"}
NAME常量已经定义
{/defined}

name属性的值要注意严格大小写

如果判断没有被定义,可以使用:

{notdefined name="NAME"}
NAME常量未定义
{/notdefined}

以上标签都适用于合并写法:

{defined name="NAME"}
NAME常量已经定义
{else /}
NAME常量未定义
{/defined}

实例:

{foreach name='user' item='value'}
<tr>
	<td>{$key}</td>
	<td>{$value.name}</td>
	<td>{$value.sex}</td>
	{egt name='value.age' value='$age'}
		<td>成年</td>
	{else /}
		<td>未成年</td>
	{/egt}
	{between name='value.salary' value='3000,5000'}
		<td>中等收入</td>
	{else/}
		<td>高收入</td>
	{/between}
	{switch name='value.level'}
	{case value='1'}<td>砖石</td>{/case}
	{case value='2'}<td>金牌</td>{/case}
	{case value='3'}<td>银牌</td>{/case}
	{case value='4'}<td>铜牌</td>{/case}
	{/switch}
	{if condition='$value.home==1'}
		<td>安徽</td>
	{elseif condition='$value.home==2'}
		<td>外省</td>
	{else/}
		<td>外国人</td>
	{/if}
</tr>
{/foreach}
原生标签

<?php //代码 ?>->{php}//代码{/php}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值