视图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}
除此之外,还有
{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}
yes
{else/}no
{/defined} ```