美文网首页
thinkphp5学习笔记(六)视图

thinkphp5学习笔记(六)视图

作者: 阿泽453 | 来源:发表于2017-12-21 11:30 被阅读0次

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

    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中定义的)
        *       对应目录 /                  描述:应用入口/项目目录
        * /index       对应目录 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/',
                ''=>'/',
            ];
        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}

    相关文章

      网友评论

          本文标题:thinkphp5学习笔记(六)视图

          本文链接:https://www.haomeiwen.com/subject/gunowxtx.html