热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

8.ThinkPHP视图

视图的组成此处所说的视图就是MVC中所说的V层,视图层也要展示层。thinkphp中视图层是由HTML模板文件组成的。也可以说视图跟模板一个意思模板的定义为了对模板文件更加有效的管

视图的组成

此处所说的视图就是MVC中所说的V层,视图层也要展示层。thinkphp中视图层是由HTML模板文件组成的。

也可以说视图跟模板一个意思


模板的定义

为了对模板文件更加有效的管理,ThinkPHP对模板文件进行目录划分,默认的模板文件定义规则是:视图目录(view)/控制器名(小写)/方法名(小写)+ 模板后缀(框架的默认视图文件后缀是.html)

image-20200524163106784


模板渲染

注意:在控制器中使用视图

渲染模板最常用的是控制器类在继承系统控制器基类(\think\Controller)后调用fetch方法,调用格式:


方式一:fetch() 的方式

return $this->fetch('[模板文件]'[,'模板变量(数组)']);

模板文件的写法支持下面几种:























用法描述
不带任何参数自动定位当前操作的模板文件
[模块@]/[控制器]/[操作]常用写法,支持跨模块
完整的模板文件名直接使用完整的模板文件名(包括模板后缀)

例:

application\index\view\index\index.html文件中写入如下内容








模板渲染....




application\index\controller\Index.php文件中写入如下内容

namespace app\index\controller;
use think\Controller;
//需要继承think\Controller
class Index extends Controller
{
public function index() {
// 不带任何参数 自动定位当前操作的模板文件
// 控制器路径: application\index\controller\Index.php
// 模板文件路径: application\index\view\index\index.html
//return $this->fetch();
//return $this->fetch('index@/index/index');
//这种默认路径就已经在application\index\view 目录下 后缀也不用写了
return $this->fetch('index/index');
}
}

运行结果

image-20200524172557062


方式二:助手函数view()

推荐使用这种,不用引入,不用继承

#这里view里面的参数跟方式一写法一样
return view('[模板文件]'[,'模板变量(数组)']); # 辅助函数
# 针对于自定义路由,使用这种
return view('index@index/index');

例:

定义如下路由:

//定义控制器路由 模块/类名/方法名 路由别名
Route::get('index', 'index/index/index')->name('indexr');

注意使用模板渲染的使用访问不能使用路由别名,如上面的路由应该是/index

application\index\controller\Index.php文件中写入如下内容

namespace app\index\controller;
class Index
{
public function index() {

return view('index@index/index');
}
}

运行结果

image-20200524173910382


模板赋值

在模板文件中








模板渲染....



姓名:{$name}


年龄:{$age}


email:{$email}





方式一:$this->assign()

例:

在控制器中

namespace app\index\controller;
//需要继承\think\Controller
class Index extends \think\Controller
{
public function index() {
//单个赋值
$this->assign('name', 'makalo');
// 或者批量赋值
$this->assign([
'age' => '18',
'email' => 'makalo@qq.com'
]);
return view('index@index/index');
}
}

方式二:助手函数view()

例:

在控制器中

namespace app\index\controller;
class Index
{
public function index() {
return view('index@index/index',['name' => 'makalo','age' => '18' ,'email' => 'makalo@qq.com']);
}
}

两种方式运行结果

image-20200524175941365


方式三:view()+compact () 推荐这种

模板文件如下:








模板渲染....


姓名:{$name}


年龄:{$arr['age']}


email:{$arr['email']}




控制器:

namespace app\index\controller;
class Index
{
public function index() {
$name = 'makalo';
$arr = ['age' => '18' ,'email' => 'makalo@qq.com'];
return view('index@index/index',compact('name','arr'));
}
}

运行结果

image-20200524180856395


全局赋值

注意:上面的三种赋值方式只能在自己的模板内使用,那么可不可以赋值给所有模板公用?答案是可以的。

如果需要在控制器之外进行模板变量赋值,可以使用视图类的share静态方法进行全局公共模板变量赋值,例如:

use think\facade\View;
// 赋值全局模板变量
View::share('name','value');
// 或者批量赋值
View::share(['name1'=>'value','name2'=>'value2']);

全局静态模板变量最终会和前面使用方法赋值的模板变量合并。


模板中使用函数

需要对模板输出使用函数进行过滤或其它处理的时候,就可以使用一下函数来解决。

{$password|md5}

当然也可以写成如下的写法,推荐

{:md5($password)}

注:不但可以用用php系统提供函数,还可以用tp提供的函数,还可以用户在tp规定的文件中定义的写的函数

例:








模板渲染....


姓名:{$name}


年龄:{$arr['age']}


email:{$arr['email']}



//使用函数示例

加密:{$name|md5}


加密:{:md5('aaa')}




运行结果

image-20200524185909911


模板原样输出

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

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

上面的{$name}标签被literal标签包含,因此并不会被模板引擎解析,而是保持原样输出。

literal标签还可以用于页面的JS代码外层,确保JS代码中的某些用法和模板引擎不产生混淆。

总之,所有可能和内置模板引擎的解析规则冲突的地方都可以使用literal标签处理。

例:

image-20200524190159655


模板内置标签

变量输出使用普通标签就足够了,但是要完成其他的控制、循环和判断功能,就需要借助模板引擎的标签库功能了,系统内置标签库的所有标签无需引入标签库即可直接使用。

内置标签主要包括:


























































































































标签名作用包含属性
include包含外部模板文件(闭合)file
load导入资源文件(闭合 包括js css import别名)file,href,type,value,basepath
volist循环数组数据输出name,id,offset,length,key,mod
foreach数组或对象遍历输出name,item,key
forFor循环数据输出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代码

循环标签

格式示例:

# foreach 【推荐写法】
{foreach $list as $key=>$vo }
{$vo.id}:{$vo.name}
{/foreach}
或者
# volist
{volist name="list" id="vo"}
{$vo.id}:{$vo.name}

{/volist}

例:

模板文件









    {volist name="data" id="vo"}
  • {$vo.id} --- {$vo.name}

  • {/volist}
    {foreach $data as $val}
  • {$val.id} --- {$val.name}

  • {/foreach}



控制器

namespace app\index\controller;
use think\Controller;
class Tt extends Controller
{
public function index(){
$data = [
['id' => 1, 'name' => '张三'],
['id' => 2, 'name' => '李四'],
['id' => 3, 'name' => '王五'],
['id' => 4, 'name' => '赵六'],
];
$age = 10;
return view('index@tt/index',compact('data','age'));
}
}

运行结果

image-20200524201230949


条件判断标签

格式示例:

{if ( $name == 1) OR ( $name > 100) } value1
{elseif $name == 2 /} value2
{else /} value3
{/if}

例:

模板文件








条件判断



{if $age <10} 儿童
{elseif $age<30 /} 青年
{else /} 老年
{/if}



控制器

namespace app\index\controller;
use think\Controller;
class Tt extends Controller
{
public function index(){
$data = [
['id' => 1, 'name' => '张三'],
['id' => 2, 'name' => '李四'],
['id' => 3, 'name' => '王五'],
['id' => 4, 'name' => '赵六'],
];
$age = 10;
return view('index@tt/index',compact('data','age'));
}
}

运行结果

image-20200524201748618


模板继承

模板继承其实并不难理解,就好比类的继承一样,模板也可以定义一个基础模板(或者是布局),并且其中定义相关的区块(block),然后继承(extend)该基础模板的子模板中就可以对基础模板中定义的区块进行重载。

image-20200524203407729

先定义一个基础模板

例:在application\index\view\common\base.html 模板文件中写入







{block name="menu"}菜单{/block}
{block name="left"}左边分栏{/block}
{block name="main"}主内容{/block}
{block name="right"}右边分栏{/block}
{block name="footer"}底部{/block}


父模板

image-20200524204757761

然后我们在子模板(其实是当前操作的入口模板)中使用继承:

application\index\view\index\ext.html 中


{extend name="common/base" /}
{block name="title"}子模板标题{/block}
{block name="left"}{/block}
{block name="main"}
子模板主内容
{/block}
{block name="right"}
子模板右边分栏
{/block}
{block name="footer"}
{__block__}
--->继承父模板,并追加的内容
{/block}

子模板继承

image-20200524205125208

控制器

namespace app\index\controller;
use think\Controller;
class Tt extends Controller
{
public function ext(){
return View('index@/index/ext');
}
}

运行结果

image-20200524205504993



推荐阅读
  • 本文探讨了2019年前端技术的发展趋势,包括工具化、配置化和泛前端化等方面,并提供了详细的学习路线和职业规划建议。 ... [详细]
  • 深入分析十大PHP开发框架
    随着PHP技术的发展,各类开发框架层出不穷,成为了开发者们热议的话题。本文将详细介绍并对比十款主流的PHP开发框架,旨在帮助开发者根据自身需求选择最合适的工具。 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
  • 本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 在寻找轻量级Ruby Web框架的过程中,您可能会遇到Sinatra和Ramaze。两者都以简洁、轻便著称,但它们之间存在一些关键区别。本文将探讨这些差异,并提供详细的分析,帮助您做出最佳选择。 ... [详细]
  • springMVC JRS303验证 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 深入解析Spring Boot自动配置机制
    本文旨在深入探讨Spring Boot的自动配置机制,特别是如何利用配置文件进行有效的设置。通过实例分析,如Http编码自动配置,我们将揭示配置项的具体作用及其背后的实现逻辑。 ... [详细]
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • 本文深入探讨了JavaScript中实现继承的四种常见方法,包括原型链继承、构造函数继承、组合继承和寄生组合继承。对于正在学习或从事Web前端开发的技术人员来说,理解这些继承模式对于提高代码质量和维护性至关重要。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 本文探讨了Java编程中MVC模式的优势与局限,以及如何利用Java开发一款基于鸟瞰视角的赛车游戏。 ... [详细]
author-avatar
xao
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有