thinkphp5学习笔记(六)视图

在控制器中使用视图的三种方法

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__"来引用父模板中原区块内容
模板继承.png

循环标签

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}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容