ThinkPHP3.2学习笔记2——视图
ThinkPHP中的视图
什么是视图
视图就是MVC三大组成部分中V(View)主要是负责信息的输出和展示。
视图的创建
创建的位置需要是在分组目录下的View目录下与控制器同名的目录中。
例如:Test控制器中的login方法,需要有一个模板,则该模板文件login.html需要放到View/Test/login.html
如果有多个模板文件,则按照上面的要求进行创建。
模板的展示display()
在smarty中展示模板使用的方法是display,在thinkPHP中同样也是display方法。
语法格式:
展示当前控制器下与当前请求方法名称一致的模板文件:$this->display();
展示当前控制器下指定的模板文件:$this->display('模板文件名[不带后缀]');
展示指定控制器目录下的指定模板文件:$this->display('View目录下的目录名/模板文件名[不带后缀]');
模板内容获取方法fetch()
语法格式:$this->fetch();
在thinkPHP中系统封装好了一个友好的打印方法dump(),封住在系统的函数库文件function.php中
语法格式:dump(需要打印的变量)
//模板常量的展示
public function test10(){
$str=$this->fetch();
dump($str);
}
比较:
- display方法:替换模板中的常量/变量->获取模板内容->输出模板内容
- fetch方法:替换模板中的常量/变量->获取模板内容
- display方法的前两步的操作实际上是通过fetch方法来实现
视图中的注释
视图中的注释特指thinkPHP中视图的注释。
1.普通注释:
<!--普通注释-->
2.在thinkPHP中视图注释:
- 行注释:
{//行注释}
- 块注释:
{/*块注释*/}
区别:
普通的HTML注释属于客户端注释,会在浏览器的源代码中输出;
而thinkPHP中的模板注释则属于服务器端的注释,不会被浏览器输出。
<body>
<!--这是普通注释-->
ThinkPHP中的行注释:{//行注释}<br>
ThinkPHP中的块注释:{/*块注释*/}
</body>
显示效果如下:
注意:
- 行注释不要当做块注释来写(横跨多行);
- 在行注释和块注释当中(大括号里面)不要再出现大括号(模板变量);
变量分隔符
在thinkPHP中默认的左右变量分隔符是 {
和 }
,其是可以被更改的,可以在配置文件中找到具体配置项。
模板常量的替换机制
替换机制:可以查看行为文件ThinkPHP/Library/Behavior/ContentReplace.Behavior.class.php
在thinkPHP中系统默认给我们提供一下几个常用的模板常量:
__MODULE__
:表示从域名后面一直到分组名结束的路由;
__CONTROLLER__
:表示从域名后面开始一直到控制器结束的路由;
__ACTION__
:表示从域名后面开始后一直到方法名结束的路由;
__PUBLIC__
:表示站点根目录下public目录的路由
__SELF__
:表示从域名后面开始一直到路由结束
为了后期使用的方便,我们可以在配置文件中定义一个自定义的模板常量;
- 在开发的时候,不到万不得已不要去修改系统配置文件。可以将需要的配置项在分组/应用级别的配置文件去添加。
Application/Common/Conf/config.php
<?php
return array(
//'配置项'=>'配置值'
//模板常量
'TMPL_PARSE_STRING'=>array(
'__ADMIN__'=>__ROOT__.'/Public/Admin'
),
);
变量分配(初阶)
在实际开发时不仅仅只是展示模板这么简单,往往还需要展示数据,这个时候变量还在控制器的方法中,需要将数据传递到模板中并且展示,这个过程叫变量分配。
在thinkPHP中系统封装了一个变量的分配方法,这个方法叫做assign;
- 语法格式:
$this->assign('模板中变量名',$php中的变量名);
- 一般情况下,两个参数的变量名一样。
- 在模板中展示数据(默认):
{$模板中的变量名}
例子:
//简单变量分配
public function test9(){
//定义变量
$var =date('Y-m-d H:i:s',time());
//变量分配
$this->assign('var',$var);
//展示模板
$this->display();
}
<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
现在是北京时间:{$var}
</body>
</html>
变量分配(进阶)
在thinkPHP中变量的分配(不考虑变量类型)都是使用assign语法格式:$this->assign('模板中的变量',php中变量);
一维数组
关于数组在模板中输出的语法格式:
- 支持中括号形式:
{$array[key]}
- 支持点形式:
{$array.key}
例子:
- 在控制器中定义一个一维数组,将其分配到模板中:
//一维 变量的输出
public function test12(){
$array=array(1,2,3,4,5);
$this->assign('array',$array);
$this->display();
}
- 定义模板并输出:
<body>
{$array[0]}<br>
{$array.1}<br>
</body>
效果如下:
二维数组
例子:
- 在控制器中定义一个二维数组,将其分配到模板中:
//二维数组 变量的输出
public function test12(){
$arrays=array(
array(1,2,3,4),
array(11,12,13,14)
);
$this->assign('arrays',$arrays);
$this->display();
}
- 定义模板并输出 :
<body>
{$arrays[0][1]}<br>
{$arrays.1.0}<br>
</body>
效果如下:
对象变量
关于对象的属性在模板中输出的语法格式:
- 支持箭头形式:
{$obj->attr}
- 支持冒号形式:
{$obj:attr}
例子:
- 在控制器的同级目录下,创建对象:
<?php
namespace Admin\Controller;
class Student{
}
- 类的实例化,给类的属性赋值,将对象分配到模板中去展示
//对象 变量分配
public function test13(){
$stu=new Student();
$stu->id=100;
$stu->name='马冬梅';
$this->assign('stu',$stu);
$this->display();
}
- 定义模板并输出
<body>
{$stu->id}
{$stu:name}
</body>
效果如下:
系统变量
在thinkPHP中系统提供以下几个系统级别的变量(超全局变量在模板中的使用):
$Think.server
等价于$_SERVER
,获取服务器的相关信息$Think.get
等价于$_GET
,获取get请求信息$Think.post
等价于$_POST
,获取post请求的信息$Think.request
等价于$_REQUESTZ
,获取get和post中的信息$Think.cookie
等价于$_COOKIE
,获取cookie中的信息$Think.session
等价于$_SESSION
,获取session中的信息$Think.condig
获取ThinkPHP中所有配置文件的一个总和,如果后面指定了元素,则获取指定的配置
语法格式:{$Think.xxx.具体的元素下标}
例如:需要获取get请求中的id,则可以写成{$Think.get.id}
例子:
<body>
$Think.server.path:{$Think.server.path}<br/>
$Think.get.id:{$Think.get.id}<br/>
$Think.request.pid:{$Think.request.pid}<br/>
$Think.cookie.PHPSESSID:{$Think.cookie.PHPSESSID}<br/>
$Think.config.DEFAULT_MODEULE:{$Think.config.DEFAULT_MODULE}<br/>
视图中使用函数
语法格式:{$变量|函数名1|函数名2=参数=1,参数=2}
参数说明:
1. $变量
:模板变量
2. |
:变量修饰符
3. 函数名1
:表示需要使用的第一个函数
4. 函数名2
:表示需要使用的第二个函数
5. =
:表示该函数有参数
6. 参数1
、参数2
:函数2的参数
7. ###
:表示变量自身
特别说明:
- 当需要使用的函数只有一个参数且只参数是变量自身时,###可省略不写;
- 当需要使用的函数有多个参数,但其第一个参数是变量自身时,###可省略不写;
- 关于函数名的说明:函数名对应的函数必须是PHP内置函数或是在函数库定义好的函数,其他主观臆造的函数不能使用。
例子:时间戳的格式化
//模板中函数的使用
public function test15(){
$time=time();
$this->assign('time',$time);
$this->display();
}
分析:格式化时间戳使用的函数是date,语法格式是date('Y-m-d H:i:s',时间戳);
<body>
{$time|date='Y-m-d H:i:s',###};
</body>
默认值
默认值:就是当某个变量不存在或为空的时候,就会显示默认的字符,默认的字符就是变量的默认值。
语法格式:{$变量名|default=默认值}
-结合视图中使用函数的语法格式,可以得知default其实是thinkPHP中封装的一个函数,默认值是函数的参数。
例子:
//默认值
public function test16(){
$str2='';
$this->assign('str2',$str2);
$this->display();
}
<body>
个性签名1:{$str1|default='这个家伙很懒,什么都没留下'}<br/>
个性签名2:{$str2|default='这个家伙很懒,什么都没留下'}
</body>
运算符
在thinkPHP中同样支持在模板中对变量进行运算。
例子:
//运算符
public function test17(){
$a=1;
$b=2;
$this->assign('a',$a);
$this->assign('b',$b);
$this->display();
}
<body>
a={$a}
b={$b}<br>
a+b={$a+$b}<br>
a-b={$a-$b}<br>
a*b={$a*$b}<br>
a/b={$a/$b}<br>
a%b={$a%$b}<br>
a++={$a++}<br>
a--={$a--}<br>
--a={--$a}<br>
++a={++$a}<br>
</body>
运行结果如下:
文件的包含
在thinkPHP中系统提供了一个模板标签,可以让我们引入一些公共部分的代码文件,这个标签就是include标签。
语法格式1:<include file='需要引入的模板文件' />
- 路径可以是相对路径,但 是相对于入口文件的。
语法格式2:<include file='View 目录名/模板文件名' />
除了使用include标签来引入文件之外,include标签还有另外一个用法,用来传递参数给引入的模板文件。
语法格式3:<include file='需要引入的模板文件' 参数名='参数值' />
在目标文件中使用参数的位置写成:[参数名]
- 如果目标文件中的参数[]不存在,则[]会被原样输出在浏览器上。
例子:
//文件包含 include标签
public function test18(){
$this->display();
}
- test18.html
<body>
<include file="Application/Admin/View/Test/head.html"/>
<div>test18内容</div>
<include file="Application/Admin/View/Test/foot.html"/>
<br>
<include file="Test/head"/>
<div>test18内容</div>
<include file="Test/foot" title='标题'/>
<br>
</body>
- Application/Admin/View/Test/head.html
<body>
-----头部-----
</body>
- Application/Admin/View/Test/foot.html
<body>
-----尾部[title]-----
</body>
显示效果:
循环遍历
在thinkPHP中系统提供了2个标签来实现数组在模板中的遍历:volist标签、foreach标签。
volist语法:
<volist name='需要遍历的模板变量名' id='当前遍历到的元素'>
循环体
</volist>
foreach语法:
<foreach name='需要遍历的模板变量名' item='当前遍历到的元素'>
循环体
</foreach>
例子:
//循环遍历 volist foreach
public function test19(){
$arr=array(1,2,3,4,5);
$this->assign('arr',$arr);
$this->display();
}
<body>
<volist name='arr' id='vol'>
{$vol},
</volist>
<hr>
<foreach name='arr' item='for'>
{$for}-
</foreach>
</body>
if标签
在thinkPHP中if标签用于流程控制。
语法格式:
<if condition='条件表达式1'>
输出结果1
<elseif condition='条件表达式2'>
<elseif condition='条件表达式3'>
...
<else />
最后一个输出结果
</if>
例子:
//if标签
public function test20(){
$a=10;
$this->assign('a',$a);
$this->display();
}
<body>
<if condition="$a lt 0">
a<0
<elseif condition="$a==1"/>
a=1
<else/>
a={$a}
</if>
</body>
php标签
php标签就是指在模板中使用PHP语法格式。
模板中的php标签支持2种形式:
语法格式1:<?php PHP代码段?>
语法格式2: PHP代码段
- 在实际开发中一般情况下不建议在模板中使用PHP标签,在配置项中有一个配置项可以禁用php标签,配置项叫做:TMPL_DENY_PHP;
- 禁用php标签之后,只是禁用原始的php标签,并不会禁用thinkPHP封装的php标签;但是不建议禁用,原因是系统的跳转方法的模板文件使用了原生的php标签。
例子:
//PHP标签
public function test21(){
$this->display();
}
<body>
原始的PHP标签:<?php echo 'hello php';?><br>
thinkPHP封装的PHP标签:<php> echo 'hello thinkPHP';</php><br>
</body>
效果如下: