一 视图
视图功能由\think\View
类配合视图驱动(模板引擎)类一起完成
1 视图实例化
(1) 控制器里调用视图类的方法
如果你的控制器继承了\think\Controller
类的话,则无需自己实例化视图类
return $this->fetch(); // 渲染模板输出
下面的方法可以直接被调用
PS 如果需要在控制器里调用View类的其它方法,可以直接使用 $this->view
得到view对象
(2) 直接实例化视图类(很少使用)
$view = new think\view();
(3) 助手函数view()
return view('hello',['name'=>'thinkphp']);
2 内置模板引擎
配置文件
'template' => [
'type' => 'Think', // 模板引擎类型 支持 php think 支持扩展
'view_path' => './template/', // 模板路径
'view_suffix' => 'html', // 模板后缀
'view_depr' => DS, // 模板文件名分隔符
'tpl_begin' => '{', // 模板引擎普通标签开始标记
'tpl_end' => '}', // 模板引擎普通标签结束标记
'taglib_begin' => '{', // 标签库标签开始标记
'taglib_end' => '}', // 标签库标签结束标记
],
视图文件的根目录默认情况下位于模块的view
目录,每个模块的视图目录可以通过模板参数view_path
自定义
3 模板赋值
$this->assign('name','ThinkPHP'); // 模板变量赋值
return $this->fetch('index', [
'name' => 'ThinkPHP',
]);
或者
return $this->display($content, [
'name' => 'ThinkPHP',
]);
//如果使用view助手函数渲染输出
return view('index', [
'name' => 'ThinkPHP',
//支持在任何地方使用静态方法进行模板变量赋值
think\View::share('name','value');
4 模板渲染
fetch('[模板文件]'[,'模板变量(数组)'])
用法 | 描述 |
---|---|
不带任何参数 | 自动定位当前操作的模板文件 |
[模块@][控制器/][操作] | 常用写法,支持跨模块 |
完整的模板文件名 | 直接使用完整的模板文件名(包括模板后缀) |
自定义模板文件的位置
return $this->fetch('./template/public/menu.html');
这种方式需要带模板路径和后缀指定一个完整的模板文件位置,要注意模板文件位置是相对于应用的入口文件,而不是模板目录。
渲染内容 直接解析内容而不通过模板文件的话
return $this->display($content,$vars);
5 模板输出替换
内置输出替换变量
__ROOT__ __STATIC__ __JS__和__CSS__,__URL__
局部替换 支持对视图输出的内容进行字符替换
public function index()
{
$this->assign('name','thinkphp');
return $this->fetch('index',[],['__PUBLIC__'=>'/public/']);
}
全局替换的话,可以直接在配置文件中添加
'view_replace_str' => [
'__PUBLIC__'=>'/public/',
'__ROOT__' => '/',
]
助手函数view
也支持全局配置参数view_replace_str
的设置
return view('index',['name'=>'thinkphp'],['__PUBLIC__'=>'/public/']);
二 模板
模板文件定义
视图目录/控制器名(小写)/操作名(小写)+模板后缀
模板渲染规则
模板渲染使用\think\View
类的fetch
方法渲染规则为
return $view->fetch(); [模板文件目录]/当前控制器名(小写+下划线)/当前操作名(小写).html
return $view->fetch('add'); [模板文件目录]/当前控制器名(小写+下划线)/add.html
return $view->fetch('user/add'); [模板文件目录]/user/add.html
return $view->fetch('admin@user/add'); 跨模块调用模板
3 变量输出
$view = new View();
$view->name = 'thinkphp';
return $view->fetch();
然后就可以在模板中使用
然后就可以在模板中使用
如果是数组变量
$data['name'] = 'ThinkPHP';
$data['email'] = 'thinkphp@qq.com';
$view->assign('data',$data);
在模板中我们可以用下面的方式输出
Name:{$data.name}
或者
Email:{$data['email']}
如果是一个对象
如果是一个对象
4 系统变量输出
支持输出 $_SERVER
、$_ENV
、 $_POST
、 $_GET
、 $_REQUEST
、$_SESSION
和 $_COOKIE
变量
{$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量
{$Think.session.user_id} // 输出$_SESSION['user_id']变量
{$Think.get.pageNumber} // 输出$_GET['pageNumber']变量
{$Think.cookie.name} // 输出$_COOKIE['name']变量
常量输出
{$Think.const.APP_PATH}
{$Think.APP_PATH}
配置输出
{$Think.config.default_module}
语言变量
{$Think.lang.page_error}
5 请求参数
{$Request.get.id} // 调用Request对象的get方法
{$Request.param.name} // 调用Request对象的param方法
{$Request.param.user.nickname} // 调用Request对象的param方法
{$Request.root} // 调用Request对象的root方法
{$Request.root.true} // 调用Request对象的root方法,并且传入参数true
{$Request.path} // 调用Request对象的path方法
{$Request.module} // 调用Request对象的module方法
{$Request.controller} // 调用Request对象的controller方法
{$Request.action} // 调用Request对象的action方法
{$Request.ext} // 调用Request对象的ext方法
{$Request.host} // 调用Request对象的host方法
{$Request.ip} // 调用Request对象的ip方法
{$Request.header.accept-encoding} // 调用Request对象的header方法
6 使用函数
{$data.name|md5}
{$create_time|date="y-m-d",###}
{$data.name|substr=0,3}
{$name|md5|strtoupper|substr=0,3}
7 使用默认值
{$user.nickname|default="这家伙很懒,什么也没留下"}
{$Think.get.name|getName|default="名称为空"} 默认值和函数可以同时使用
8 使用运算符
我们可以对模板输出使用运算符,包括对“+”“-” “*” “/”和“%”的支持
9 三元运算符
{$status? '正常' : '错误'}
10 原样输出
可以使用literal
标签来防止模板标签被解析
{literal}Hello,{$name}!{/literal} //{$name}标签被literal标签包含,因此并不会被模板引擎解析,而是保持原样输出。
11 模板注释
{/* 注释内容 */ } 或 {// 注释内容 } 单行注释
{/* 这是模板 模板注释在生成编译缓存文件后会自动删除,这一点和Html的注释不同。
注释内容*/ } 多行注释
12 包含文件
模版表达式的定义规则为:模块@控制器/操作
{include file="public/header" /} // 包含头部模版
{include file="public/menu" /} // 包含菜单模版header
{include file="blue/public/menu" /} // 包含blue主题下面的menu模版
{include file="public/header,public/menu" /} // 可以一次包含多个模版
{include file="../application/view/default/public/header.html" /} 直接包含一个模版文件名
{include file="Public/header" title="$title" keywords="开源WEB开发框架" /} 在包含的header.html文件里面使用title和keywords变量
13 内置标签
volist标签
{volist name="list" id="vo"}
{$vo.name}
{/volist}
foreach标签
{foreach $list as $vo}
{$vo.name}
{/foreach}
for标签
{for start="开始值" end="结束值" comparison="" step="步进值" name="循环变量名" }{/for}
比较标签
{eq name="name" value="value"}value{/eq}
{eq name="name" value="value"}相等{else/}不相等{/eq}
switch标签
{switch name="变量" }
{case value="值1" break="0或1"}输出内容1{/case}
{case value="值2"}输出内容2{/case}
{default /}默认情况
{/switch}
if标签
{if condition="($name == 1) OR ($name > 100) "} value1
{elseif condition="$name eq 2"/}value2
{else /} value3
{/if}
in和notin
{in name="id" value="1,2,3"}id在范围内{/in}
between 和notbetween
{between name="id" value="1,10"}输出内容1{/between}
资源文件加载
{load href="/static/js/common.js" /}
{load href="/static/js/common.js,/static/css/style.css" /}
{js href="/static/js/common.js" /}
{css href="/static/css/style.css" /}
使用php标签
{php}echo 'Hello,world!';{/php}
assign标签
{assign name="var" value="123" /}
define标签
{define name="MY_DEFINE_NAME" value="3" /} 用于在模板中定义常量