TP5日记(2)

视图和模板

Posted by Heber on December 21, 2017

视图view和fetch、assign、display

在TP5中,它为我们提供了一个可以直接调用的助手函数view,如果调用时,没有为它配置,它会默认到同一模块下寻找view文件夹里的与调用它的控制器名及方法名相对的文件夹和html文件。例如,我在index/controller/index.php的index方法中使用了return view();那么它会寻找index/view/index/index.html文件,找不到会直接报错。除此之外,还可以为它设置参数。

view() -> index/view/index/index.html
view('test') -> index/view/index/test.html
view('heber/test') -> index/view/heber/test.html

如果是view(‘./test.html’)(注意有.html)则会跳转到入口文件index.php同级的地方去寻找test.html文件

view()有第二个参数,作用是往调用的html文件里传参

<?php
    namespace app\index\controller;

    class Index{
        public function index(){
            $data = [
                'email' => '77766@qq.com',
                'name' => 'heber'
            ];
            return view('',$data);
        }
    }

在index.html中,我们可以直接通过{$email}来使用这个变量。

但通常,我们是直接使用视图类里的$this->fetch(),它的用法和view()基本一样

<?php
    namespace app\index\controller;
    use think\Controller;

    class Index extends Controller{
        public function index(){
        	$this->assign('sex','18');
            $data = [
                'email' => '77766@qq.com',
                'name' => 'heber'
            ];
            return $this->fetch('',$data);
        }
    }

除此之外,我们还可以用$this->assign(‘name’,’heber’)来传参。第一个是键(name),第二个是键值(heber)。在前端页面调用的方法也和view()一样.

除此之外,还有$this->display(),他可以用来直接输出内容,包括文字和变量,例如

return $this->display(‘worinidaye{$sex}’,[‘sex’ => ‘male’]);

这句话会在前台展示一串字符”worinidayemale”,我们也可以先用$this->assign()方法先定义好变量,再用$this->display()来输出,$this->display()比较适用于测试,它方便,但没有实现前后端分离。

变量输出、赋值和替换

在上面,我们有说到,前端页面使用{$name}这个形式来使用$name变量,在配置中,我们也可以更改花括号以其他字符来替代,以配合其他框架的使用。在/thinkphp/convention.php中,找到’trmplate’,它的’tpl_begin’以及’tpl_end’就是用来设置开始和结束标记符的。

    'template'               => [
        // 模板引擎类型 支持 php think 支持扩展
        'type'         => 'Think',
        // 视图基础目录,配置目录为所有模块的视图起始目录
        'view_base'    => '',
        // 当前模板的视图目录 留空为自动获取
        'view_path'    => '',
        // 模板后缀
        'view_suffix'  => 'html',
        // 模板文件名分隔符
        'view_depr'    => DS,
        // 模板引擎普通标签开始标记
        'tpl_begin'    => '{',
        // 模板引擎普通标签结束标记
        'tpl_end'      => '}',
        // 标签库标签开始标记
        'taglib_begin' => '{',
        // 标签库标签结束标记
        'taglib_end'   => '}',
    ],

我们可以用fetch()、view()的第三个参数来替换变量

$this->fetch(‘index’,[],[‘static’ => ‘happy’]); view(‘’,[],[‘move’ => ‘bad’]);

这样,前端文件中的所有”static”,”move“都会被替换成”happy”和”bad”。TP5默认把’JS‘和’CSS‘替换成’/static/js’和’/static/css’,这样方便了我们后期的路径变更,我们可以在’view_replace_str’ => [],这里修改’JS‘和’CSS‘的替换值。

系统变量原生标签

在上面我们有提到,在前端页面使用{$name}这样的格式来输出变量,现在,我们要换种方式。

//输出session里的name
{$Think.session.name}
//输出cookie里的sex
{$Think.cookie.sex}
//输出get里的id
{$Think.get.id}
以此类推,不再赘述

变量输出调节器

假设我们需要输出一个经过md5加密的字符串,则可以再前端页面直接使用调节器来更改

//以md5方式加密$email
{$email|md5}

//截取$email的前五位数字
{$email|substr=0,5}

//格式化UNIX时间戳,###是占位符
{$time|date="Y-m-d H:i:s",###}

//在md5加密后再转换成大写字母(两个操作)
{$email|md5|strtoupper}

//定义默认值,如果后台没有提前为这个变量赋值,则使用默认值
{$name|default='heber'}

//还可以进行加减乘除四位运算与自加,自减等操作,就不再赘述

在开发过程中,我们可以使用标签,这个标签的作用是使标签内的程序不被解析。

循环模板标签

我们可以用来循环输出

//在后台定义好一个名为$list的二维数组,这个标签类似foreach
    {volist name="list" id="vo"}
     <p>{$vo.age}</p>
    {/volist}

//它还有一个参数offset,用来决定从哪儿开始遍历,2表示从第三个开始
    {volist name="list" id="vo" offset="2"}
     <p>{$vo.age}</p>
    {/volist}

//它还有一个参数length,用来决定遍历的长度
    {volist name="list" id="vo" offset="2" length="1"}
     <p>{$vo.age}</p>
    {/volist}

//它还有一个参数,用来返回数组不存在时的输出,empty的值可以为变量
    {volist name="list" id="vo" offset="2" length="1" empty="数组为空"}
     <p>{$vo.age}</p>
    {/volist}

它还有一个参数key,默认key="i",而$i表示这是第几次循环,从1开始
    {volist name="list" id="vo" offset="2" length="1" empty="数组为空" key="s"}
     <p>{$s}:{$vo.age}</p>
    {/volist}

我们还可以用来循环输出,它的用法和类似。

//在后台定义好一个名为$list的二维数组
    {foreach name="list" item="vo"}
     <p>{$vo.age}</p>
    {/foreach}

//或者
    {foreach list as vo}
     <p>{$vo.age}</p>
    {/foreach}

//它有一个参数key,它和<volist>的key的用法一样,不同的是它用来表示数组的下标,且它的默认值不是i,而是key
    {foreach name="list" item="vo"}
     <p>{$key}:{$vo.age}</p>
    {/foreach}

    {foreach name="list" item="vo" key="s"}
     <p>{$s}:{$vo.age}</p>
    {/foreach}

除此之外,我们还可以使用for来循环输出

//在后台定义好一个名为$list的二维数组
    {for start="1" end="12"}
     <p>{$i}</p>
    {/for}

//或者想每次加2
    {for start="1" end="12" step="2"}
     <p>{$i}</p>
    {/for}

//或者你不想使用$i,可以再name设置
    {for start="1" end="12" step="2" name="k"}
     <p>{$k}</p>
    {/for}

比较标签

比较标签用来进行两个数的对比,基本等同于正常语法里的if——else语句,value的值可以为变量。如value=”$a”

    {eq name="num" value="2"}
    <p>yes</p>
    {else/}
    <p>no</p>
    {/eq}

我们还可以用,它可以看成是的别名

    {equal name="num" value="2"}
    <p>yes</p>
    {else/}
    <p>no</p>
    {/equal}

除此之外,还有,它的全称是”not equal”,也就是不等于的意思。会获得和相反的结果

    {neq name="num" value="2"}
    <p>yes</p>
    {else/}
    <p>no</p>
    {/neq}

以及

    {notequal name="num" value="2"}
    <p>yes</p>
    {else/}
    <p>no</p>
    {/notequal}

以上都是等于,既然有等于,那肯定有大于和小于

,判断name所代表的值是否大于value的值

    {gt name="num" value="2"}
    <p>yes</p>
    {else/}
    <p>no</p>
    {/gt}

,判断name所代表的值是否大于等于value的值

    {egt name="num" value="2"}
    <p>yes</p>
    {else/}
    <p>no</p>
    {/egt}

,判断name所代表的值是否小于value的值

    {lt name="num" value="2"}
    <p>yes</p>
    {else/}
    <p>no</p>
    {/lt}

,判断name所代表的值是否小于等于value的值

{elt name="num" value="233"}
    <p>yes</p>
    {else/}
    <p>no</p>
    {/elt}

条件判断标签

{switch}{/switch}用法于PHP中用法类似,将name与value比对,对号入座。如果想为两个value执行同一个操作,则使用4|5这样的写法如果没有找到对应的value则执行default的内容。

{switch name="Think.get.level"}
    {case value="1"}<p>Level 1</p>{/case}
    {case value="2"}<p>Level 2</p>{/case}
    {case value="3"}<p>Level 3</p>{/case}
    {case value="4|5"}<p>Level 4</p>{/case}
    {default/}<p>poor guy</p>
{/switch}

用于判断name里的值是否在value里,如果在,执行else前面的内容。当type=”notin”,则相反。

{range name="Think.get.level" value="1,2,3,4,5" type="in"}
    <p>yes</p>
{else/}
    <p>no</p>
{/range}

以及,这是的简化版,效果一样

{in name="Think.get.level" value="1,2,3,4,5"}
    <p>yes</p>
{else/}
    <p>no</p>
{/in}

以及,这是的简化版,效果一样

{notin name="Think.get.level" value="1,2,3,4,5"}
    <p>yes</p>
{else/}
    <p>no</p>
{/notin}

的type=”between”,顾名思义,判断name的值是否在value里。type=”notbetwwen”,效果相反。

{range name="Think.get.level" value="1,5" type="between"}
    <p>yes</p>
{else/}
    <p>no</p>
{/range}

以及简化版

{between name="Think.get.level" value="1,5"}
    <p>yes</p>
{else/}
    <p>no</p>
{/between}

{notbetween name="Think.get.level" value="1,5"}
    <p>yes</p>
{else/}
    <p>no</p>
{/notbetween}
</defined>,判断是否已经定义 ```objc {defined name="Think.get.level"}

yes

{else/}

no

{/defined} ```