在控制器中使用视图的三种方法
1.直接实例化视图类
-> 视图类:thinkphp/library/think/View.php
-> 命名空间:use think\View;
-> 实例化:动态 new View(); 静态 View::instance();
-> 常用方法:fetch()渲染模板,display()渲染内容,assign()模板赋值
eg:
class Index
{
public function index()
{
//动态创建
//$view = new View();
//静态创建
$view = View::instance();
//模板赋值
$view->assign('name','haha');
//渲染模板
return $view->fetch();
}
}
2.继承控制器基类Controller
-> 控制器类:thinkphp/library/think/Controller.php
-> 命名空间:use think\Controller;
-> 实例化:$this->view; //可访问View类所有属性或方法
-> 常用方法:$this->fetch()渲染模板,$this->display()渲染内容,$this->assign()模板赋值
$this->engine()模板引擎 //这些方法都封装到controller类中
eg:
class Index extends \think\Controller
{
public function index()
{
// $this->view 视图对象
//$this->view->assign('name','haha');
$this->assign('name','haha');
//渲染模板
//return $this->view->fetch();
return $this->fetch();
}
}
3.助手函数view()
* 不用继承Controller基类,不用实例化View类,都可以使用
* 仅适合于模板渲染,功能单一,不能加载配置
* 语法:view([模板文件],[模板变量数组],[模板替换数组]);
* 使用方法实例:view('user',['name'=>'tp5'],['__SITE__'=>'site.cn']);
eg:
class Index
{
public function index()
{
return view('index',[
'name'=>'haha',
'site'=>'site'
]);
}
}
4.控制器使用视图调用模板,三种方法:实例化试图类的规范模式,基类继承的经典模式,
助手函数的快捷模式,实例化视图类是发展趋势。
模板引擎的配置
1.通过应用配置文件config.php
'template'=>[
'type' => 'Think', //模板引擎类型 支持php think 支持扩展
'view_base' => '', //视图基础目录,配置目录为所有模块的视图起始目录
'view_path' => '', //当前模板的视图目录 留空为自动获取
'view_suffix' => 'html', //模板后缀
'view_depr' => DS, //模板文件名分隔符
'tpl_begin' => '{', //模板引擎普通标签开始标记
'tpl_end' => '}', //模板引擎普通标签结束标记
'taglib_begin' => '{' //标签库标签开始标记
'taglib_end' => '}' //标签库标签结束标记
];
2.实例化View类时传参配置
$view = new View([
'type' => 'Think', //模板引擎类型 支持php think 支持扩展
'view_base' => '', //视图基础目录,配置目录为所有模块的视图起始目录
'view_path' => '', //当前模板的视图目录 留空为自动获取
'view_suffix' => 'html', //模板后缀
'view_depr' => DS, //模板文件名分隔符
'tpl_begin' => '{', //模板引擎普通标签开始标记
'tpl_end' => '}', //模板引擎普通标签结束标记
'taglib_begin' => '{' //标签库标签开始标记
'taglib_end' => '}' //标签库标签结束标记
]);
3.调用View类config()方法进行配置
* 源码:$this->engine->config($name,$value);
* 实际上调用的是对应模板引擎的config方法,支持数组
* 支持所有模板配置项
* 用法:$view->confg('配置名','值')->fetch();
或者:$this->view->config('view_suffix','php');
4.模板引擎配置,通常是在开发之前都已经配置好了,在开发过程中,如果要改变,可以
采用动态配置,这样仅影响到当前操作,对全局不影响。
模板赋值的五种方法
1.通过assign()方法
* assign()方法即可以用视图类,也可以用控制器调用(继承基类)
* 单独赋值:$this->assign('变量名','值');
* 批量赋值:$this->assign(['变量名1'=>'值1','变量名2'=>'值2']);
2.fetch()或display()方法传参赋值
* $this->fetch('模板文件',['变量名1'=>'值1','变量名2'=>'值2']);
* $this->display('内容',['变量名1'=>'值1','变量名2'=>'值2']);
3.给视图对象添加属性的方式赋值
* 先获取视图对象,通过给它动态添加属性方式给模板赋值
* 继承基类:$this->view->$name = $value;
eg:
$this->view->name = 'php';
return $this->fetch();
* 视图类:\think\View::instance()->$name = $value;
eg:
\think\View::instance()->name = 'php';
return \think\View::instance()->fetch();
4.用share()方法给模板添加静态变量
* 支持在任何地方使用静态方法进行模板变量赋值
* 视图类调用:\think\View::share($name,$value);
* 控制器继承调用:$this->view->share($name,$value); //不推荐
* 全局静态模板变量最终会和前面使用方法赋值的模板变量合并
5.用助手函数view()向模板赋值
* view()不依赖控制器继承和视图类,可随时调用
* 批量赋值:view('模板名',['变量名1'=>'值1','变量名2'=>'值2']);
视图渲染方法
1.语法:fetch('模板文件',[模板变量数组]);
2.模板定位规则:当前模块/默认视图目录/当前控制器/当前操作.html
eg:index模块/user控制器/edu操作.html(默认模板后缀)
3.模板文件语法:
用法 描述 举例
不带任何参数 自动定位模板 $this->fetch()
[控制器/][操作] 跨控制器调用模板 $this->fetch('user/index')
[模块@][控制器/][操作] 跨模块调用模板 $this->fetch('admin@user/index')
完整模板文件名 决定地址(加后缀) $this->fetch('/public/tp/user/login.html');
4.视图渲染注意事项
* 模板文件可以不依赖与控制器操作而独立存在:fetch('目录/模板文件');
* 渲染模板时,可以同时给模板传入变量:fetch('模板文件',[变量数组]);
* 可以读取视图根目录view下的模板:/模板文件
* 可以直接访问应用入口目录public/下面的模板: ./目录/模板文件.html
* 注意:只要访问的模板不是在视图目录下,必须加后缀的完整模板文件名称。
模板输出替换
1.替换内容(thinkphp目录中view.php中定义的)
* __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/']);
* 全局替换:通过应用配置文件中'view_replace_str'数组进行替换
'view_replace_str'=>[
'__PUBLIC__'=>'/public/',
'__ROOT__'=>'/',
];
eg:
return $this->fetch('',[],[
'www.baidu.com'=>'百度',
]);
变量输出
1.普路变量
* 语法:{$变量名称} //{}与内容之间不能有空格
2.复合变量
* 符合变量主要值数组和对象
* 数组使用点语法或方括号来访问:{$user.id} {$user['id']}
* 对象使用冒号或指向符来访问:{$book:name} {$book->name}
3.系统变量
* 系统变量不需要赋值,可以直接在模板中输出
* 系统变量都是以$Think开头
* 语法:格式: $Think.类型.参数
-> 类型:$_SERVER $_ENV $_POST $_GET $_REQUEST $_SESSION $_COOKIE const config
-> 参数:根据类型定,通常只输出第一个参数
4.获取请求参数
* 不必通过控制器,可以在模板中直接获取请求信息
* 请求变量必须以$Request开头,首字母大写
* 语法格式:$Request.方法.参数
* 方法:param get/post path/pathinfo module controller action ext host ip
* 参数:可选,无参则直接输出结果,通常仅输出第一个参数
5.变量调节器
* 对模板中的变量使用函数进行处理
* 一个参数:{$变量|函数} eg:{$pwd|md5}
* 两个及以上参数:{$变量|函数="参数1,###, ..."} // ### 占位符
eg: {$birthday|date="y-m-d,###"}
* 直接处理:{:函数名(参数)}
eg:{:substr(strtoupper(md5($name)),0,3)}
6.默认值与运算符
* 自定义变量设置默认值
eg:{$name|default=""}
* 系统变量设置默认值
eg:{$Thnk.get.id|default=100}
* 变量的函数与默认值可以同时使用
eg: //getHiredate是一个根据id查找表中某条记录的日期函数
{$Think.get.id|getHiredate|date='Y/m/d',###|default='2017/12/20'}
7.原样输出与模板注释
* 原样输出
{literal}
模板标签,例如:hello{$name} //{$name}不会被解析
{/literal}
* 需要注意的是配置 'view_replace_str'替换参数,会替换掉literal标签内的内容,可以配置
'template.tpl_repalce_string'避免替换掉literal标签内的内容。
* 模板注释
* 单行注释
-> {/*注释内容*/} 或 {//注释内容}
* 多行注释
{/*
注释内容
*/}
* 生成缓存文件时会自动删除注释
模板布局和常用标签
1.公共模板文件
* 很多页面中,总有一些共同的部分:头部,尾部,侧边栏等
* 我们可以将他们剥离出来,制作公共文件,需要时在导入
* 这样实现了代码共享,无论是创建新页面,还是更新都很方便
* 这样的公共文件,我们叫公共模板文件
* ThinkPHP5针对这类需求,是用模板布局来解决的
2.全局配置
'template'=>[
'layout_on' => true, //开启模板布局
'layout_name' => 'layout', //设置布局模板文件名称
'layout_item' => '{__REPLACE__}' //设置布局模板中的替换字符串 默认{__CONTENT__}
];
3.模板里配置
* 必须关闭模板布局全局配置:防止布局循环
* 在view目录下创建自定义布局文件
* 在模板中使用
{layout name="Layout/newlayout" replace="[__REPLACE__]" /} 导入布局文件内容
4.在控制器中配置
* $this->view->engine->layout(参数);
* 参数:
-> true:采用默认布局模板:layout.html
-> false:临时关闭当前模板布局功能
-> 文件名:用户自定义布局模板名称
5.全局配置和控制器配置,是在程序中实现模板布局,模板中配置是单纯通过模板标签实现
在模板中使用布局。
模板继承
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='比较关系' step='步进值' name='循环变量名'}
4.全部是闭合标签,结尾要加:{/标签名}
比较标签
1.比较标签仅用于模板变量与普通值之间的简单比较,它包括一组标签,用法基本一致:
2.用法:
{比较标签 name='变量' value='值'}
内容
{else /} //可选
内容
{/比较标签}
3.支持的关系包括:
eq等于,neq不等于,gt大于,egt大于等于,lt小于,elt小于等于,heq恒等于,nheq不恒等于
eg:
{volist name="user" id="vo"}
{egt name="vo.age" value="18"}
成年
{else /}
未成年
{/egt}
{/volist}
条件判断标签
1.if条件判断标签
{if condition='条件,支持原生'} 内容1
{elseif condition="条件2" /} 内容2
{else /} 内容3
{/if}
2.switch多分支条件判断标签
{switch name="模板变量"}
{case value="值" break="0|1"}内容1{/case}
{case value="值" break="0|1"}内容2{/case}
....
{/switch}
3.范围判断标签
{range name="模板变量" value="范围" type="类型"}内容1
{else /}内容2
{/range}
* 范围类型快捷标签:
-> {in/noin name="模板变量" value="范围"}内容{/in/noin}
-> {between/nobetween name="模板变量" value="范围"}
内容
{/between/nobetween}
4.存在或控制判断
* 变量是否定义:{present name="模板变量"}内容{/present}
* 变量是否未定义:{nopresent name="模板变量"}内容{/nopresent}
* 变量是否为空:{empty name="模板变量"}内容{/empty}
* 变量是否不为空:{noempty name="模板变量"}内容{/noempty}
* 常量是否定义:{defined name="常量名"}内容{/defined}
* 常量是否未定义:{nodefined name="常量名"}内容{/nodefined}
PHP原生标签
{php}
代码
{/php}