视图与模板布局总结

原创 2018-12-19 10:49:57 201
摘要:一.模板渲染    1.渲染变量  可以将变量直接return  然后在模板文件中使用{变量}调用$name = '黑寡妇'; return $name; /***************/ {$name}    2.display()渲染内容,也可以使

一.模板渲染

    1.渲染变量  可以将变量直接return  然后在模板文件中使用{变量}调用

$name = '黑寡妇';
return $name;
/***************/
{$name}

    2.display()渲染内容,也可以使用视图类View()来渲染,使用静态代理的门面技术来使用 use think\Facade\View 然后使用display渲染

use think\Facade\View
/******************/
$name = '黑寡妇';
return View::display('我的姓名是:<span style="color:rosybrown">'.$name.'</span>');

    3.使用View类的fetch()方法来渲染模板,亦可以控制器类的view属性来调用View类的fetch()方法,这样就不用use think\Facade\View了 ,只需继承Controller父类

        * fetch('模板表达式',['模板变量名'=>'值'])指定一个模板进行内容输出

        * 模板表达式: 模块@控制器/操作方法

        * 模板以模块/view目录为根目录

        * 如果使用默认规则来定位模板可以省略模板表达式

        * 控制器类assign('模板变量名','模板变量值')方法为模板变量赋值

        * 助手函数输出,不依赖任何类 不推荐使用 view()

class Index extends Controller
{
    public function demo1()
    {
        //调用Controller类中的view属性的就是View的实例对象, 
        return $this->view->fetch('index@index/demo1',['name'=>$name]);
        //Controller类的fetch()方法就是调用View类的fetch方法,所以可以越过view属性
        return $this->fetch('index@index/demo1',['name'=>$name]);
        //模板变量赋值
        $this->assign('name',$name);
        //即可省略参数 默认输出模板
        return $this->fetch();
        //助手函数
        return view('demo1',['name'=>$name]);
    }
}

二.模板赋值与过滤

    在上面的操作已经涉及模板赋值

    1.assign(('模板变量名',值)

$name = '钢铁侠';
$this->view->assign('name',$name);
return $this->view->fetch()
//{$name}

    2.传参赋值:fetch('模板',[参数数组])

return $this->view->fetch('index@index/demo1',['name'=>$name]);
//{$name}

    3.对象赋值 $this->view ===View对象  所以直接
    View视图类有一个魔术方法__get 和__set 会将$this->view->变量名直接设置为模板变量保存在 protected $data = []中 

$this->view->salary = 5000;    //{$salary}  5000

    4.模板过滤 就是使用View对象的filter(回调)来实现过滤,回调方法来处理过滤的字符

$this->view->name = '老王';    //模板赋值
$this->view->salary = 8000;    //模板赋值
$filter = function($content){    //回调
    return str_replace('老王','钢铁侠',$content);
};
return $this->view->filter($filter)->fetch()
//也可以直接将回调传入filter中
return $this->view->filter(function($content){
    return str_replace('老王','绿巨人',$content)
})->fetch();

三.模板布局

    1.config/template.php添加配置进行全局配置,所有的模板文件都会有模板布局文件的内容

    //模板布局配置
   'layout_on' => true,    //开启模板布局
    'layout_name' => 'layout'   //指定模板布局文件

    这样就开启了全局模板布局,在指定的模板布局目录中添加layout.html 即view目录下添加, 可以创建两个头部,尾部文件在public文件目录下,然后在模板文件中引用,实现复用,{__CONTENT__}就是对应模板文件自己的内容

{include file="public/header" /}

{__CONTENT__}

{include file="public/footer" /}

    2.模板标签进行配置

        * 标签控制 不依赖与全局配置,在模板中直接用标签控制
        * {layout name = "布局模板"}
        * 关闭布局:{__NOLAYOUT__}

        在需要模板布局的模板文件中使用{layout name="layout" /} 即可引入布局文件

{//layout name="layout" 注释使用双// /}
{layout name="layout" /}
<!-- 模板文件内容 -->

    3.动态配置 使用视图类的engine属性(引擎对象)的layout()方法开启模板布局

        * 不需要再模板配置文件中进行任何配置
        * 不需要再当前模板中添加任何标签

    $this->view->engine->layout(true)    //开启模板布局
    return $this->view->fetch();    //渲染模板

        * 关闭布局

    $this->view->engine->layout(false);
    return $this->view->fetch();

        * 链式调用方便注释    (*需要在fetch方法中传入模板参数,至少给到控制器级别*)

return $this->view      //调用视图对象
    ->engine            //模板对象
    ->layout(true)      //开启模板布局
    ->fetch('index/demo4'); //至少给到控制器   模板渲染

四.模板继承

    1.创建模板继承文件 view/base.html基础模板,供其他子模板进行继承

    2.基础模板中仅允许出现block标签(双标签)    {block name="header"} 内容{/block}

    3.在父模板中写在block以外的标签原样输出

    4.子模板继承base模板 {extend name="base" /}

    5.在子模板中 忽略block区块以外的内容全部忽略

    6.子模板中区块顺序不重要

    7.{__block__}引用基础模板中block内内容

{block name="header"}
    {include file="public/header" /}    {//写在block标签里 子模板可以重写}
{/block}

{block name="content"}
    我是网站主体
{/block}

{block name="course"}<span style="color:darkgreen">课程名称:</span>{/block}

{block name="name"}<span style="color:darkgreen">隔壁老王</span>{/block}

{//在父模板中写在block以外的标签原样输出}
<a href="http://www.php.cn">PHP中文网</a>

{block name="footer"}
    {include file="public/footer" /}
{/block}
{extend name="content" /}
{//将父模版中的main区块进行重写}
{block name="content"}
    <h1 style="text-align: center">我是字模板的网站主体部分</h1>
{/block}

{block name="name"}{/block}{//不重写的话就原样输出父级block块中内容}

{block name="course"}
    {__block__}PHP中文网    
{/block}
<a href="#">asdasdasd</a>




批改老师:天蓬老师批改时间:2018-12-19 10:54:21
老师总结:使用控制器提供的一些快捷方式, 很方便, 但可能得不到IDE的语法提示, 这点要注意, 还有就是助手函数, 除了在模板中, 其它的场景并不推荐使用,

发布手记

热门词条