热门标签 | 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



推荐阅读
  • XAMPP 遇到 404 错误:无法找到请求的对象
    在使用 XAMPP 时遇到 404 错误,表示请求的对象未找到。通过详细分析发现,该问题可能由以下原因引起:1. `httpd-vhosts.conf` 文件中的配置路径错误;2. `public` 目录下缺少 `.htaccess` 文件。建议检查并修正这些配置,以确保服务器能够正确识别和访问所需的文件路径。 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • JavaScript 跨域解决方案详解
    本文详细介绍了JavaScript在不同域之间进行数据传输或通信的技术,包括使用JSONP、修改document.domain、利用window.name以及HTML5的postMessage方法等跨域解决方案。 ... [详细]
  • 本文探讨了如何在 Spring MVC 框架下,通过自定义注解和拦截器机制来实现细粒度的权限管理功能。 ... [详细]
  • HTML前端开发:UINavigationController与页面间数据传递详解
    本文详细介绍了如何在HTML前端开发中利用UINavigationController进行页面管理和数据传递,适合初学者和有一定基础的开发者学习。 ... [详细]
  • Django与Python及其他Web框架的对比
    本文详细介绍了Django与其他Python Web框架(如Flask和Tornado)的区别,并探讨了Django的基本使用方法及与其他语言(如PHP)的比较。 ... [详细]
  • ThinkPHP RBAC 实战:登录验证详解
    本文将详细介绍 ThinkPHP 框架中的 RBAC(角色基础访问控制)系统,特别是登录验证部分。我们将通过实际代码示例,展示如何实现用户登录验证、验证码生成及验证、以及登录后的权限管理。 ... [详细]
  • 本文详细介绍了如何在PHP中记录和管理行为日志,包括ThinkPHP框架中的日志记录方法、日志的用途、实现原理以及相关配置。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 系统数据实体验证异常:多个实体验证失败的错误处理与分析
    在使用MVC和EF框架进行数据保存时,遇到了 `System.Data.Entity.Validation.DbEntityValidationException` 错误,表明存在一个或多个实体验证失败的情况。本文详细分析了该错误的成因,并提出了有效的处理方法,包括检查实体属性的约束条件、调试日志的使用以及优化数据验证逻辑,以确保数据的一致性和完整性。 ... [详细]
  • 在 .NET Core MVC 应用中,某页面在使用 IIS Express 和 IIS 进行调试时均能正常运行,但在发布后出现了 500 内部服务器错误。尽管在代码中添加了异常处理逻辑,但在 `return View(department)` 时并未捕获到任何异常,仅显示 500 错误,且没有任何其他详细的错误信息。这可能与发布环境的配置或依赖项有关,建议检查日志文件和配置设置以进一步诊断问题。 ... [详细]
  • ThinkPHP框架中的惯例配置文件 `/Common/convention.php` 包含了多个重要的默认设置,如 `DEFAULT_MODULE` 和 `DEFAULT_ACTION`。这些配置项用于定义系统的默认模块和默认操作,确保在没有明确指定的情况下,系统能够正确地加载和执行相应的模块和动作。通过合理配置这些参数,开发者可以简化项目的初始化过程,并提高系统的灵活性和可维护性。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 实现Nginx对ThinkPHP URL重写及PATHINFO支持的详细方法解析【PHP开发】
    在PHP后端开发中,实现Nginx对ThinkPHP的URL重写及PATHINFO支持是一项常见的需求。本文详细解析了经过多次尝试和研究,最终找到的一种有效配置方法,能够确保URL_MODERewrite功能正常运行,并提供稳定的服务。此外,文章还探讨了相关配置项的具体作用及其优化建议,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • 本指南详细介绍了如何从零开始搭建ThinkPHP项目环境。首先,我们将创建一个名为“test”的PHP项目,并导入ThinkPHP框架。接下来,配置单入口文件,确保项目能够正确运行。ThinkPHP作为一个基于单一入口模式的PHP框架,简化了开发流程。通过本文,读者将学会如何高效地设置和测试ThinkPHP项目。 ... [详细]
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社区 版权所有