学习教程来源于:
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 | / | 应用入口/项目根目录 |
URL | module/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
参数可选,无参则直接输出结果,通常仅输出第一个参数
用函数处理模板中的变量:变量调节器的作用
变量调节器:对模板中的变量使用函数进行处理
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}