1、视图模板布局
a、模板替换
// 视图输出字符串内容替换 'view_replace_str' => [ '__HOME__' => '/static/home/public', '__ADMIN__'=> '/static/admin/public' ],
这是全局定义,如果需要局部定义,那么可以使用以下的方法
public function index(){ //这里的第一个参数是指定模板,第二个参数是进行传值, 第三个参数是指定局部的静态常量 $this->fetch('index', ['name' => 'aa', 'age'=> 20], ['__HOME__' => '/static/home/public', '__ADMIN__' => '/static/admin/public']); }
b、模板传值
public function index(){ //方法一 $this->assign('name', 'bbb'); $this->assign(['name' => 'aaa', 'age' => 20]); $this->fetch(); //方法二 $this->fetch('index', ['name' => 'ccc', 'age'=> 30]); //注意渲染模板的方法在笔记一 }
c、指定模板
注意: 一般情况下,引擎会自动查找指定目录下的html后缀的文件,当如果是php的情况,那么就需要修改局部的php引擎,可以使用$this->engine('php')来修改同时如果需要访问别的目录下的文件,那么可以使用以下的语句进行指定
return $this->engine('php')->fetch('test/abc'); //表示的是test文件夹下的abc.php文件
如果需要跨模块调用的情况下,可以使用以下的方法
return $view->fetch('admin@user/add');
2、模板标签
包含文件
{include file="Public/header" title="$title" keywords="开源WEB开发框架" /} //public 表示模块文件夹, 需要填写
模板布局的模板页面
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> {include file='common/first'} {__CONTENT__} {include file='common/second'} </body> </html>
文件部份
{layout name='common/all'} //表示在common文件夹下面的all.html <div>this is index html content</div>
3、模板继承
common/main.html总模板下的内容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {block name='first'}{/block} <hr> {block name='second'}{/block} <hr> {block name='third'}{/block} </body> </html>
模板内需要替换的内容
{extend name='common/main'} {//继承了common文件夹下面的main.html} {block name='first'}<h3>这个是替换first部份的内容</h3>{/block} {block name='second'}<div>这个是替换second部份的内容</div>{/block} {block name='third'}<b>这个是替换third部份的内容{$name}{$age}</b>{/block}
注意:模板可以多级继承,比如B继承了A,而C又继承了B,最终C中的区块会覆盖B和A中的同名区块,但C和B中的区块必须是A中已定义过的。子模板中的区块定义顺序是随意的,模板继承的用法关键在于基础模板如何布局和设计规划了,如果结合原来的布局功能,则会更加灵活。
4、模板的基本语法
<!--输出变量--> <span>{$name}{$age}</span> <!--如果是数组的情况--> <span>{$data.name}{$data.age}</span> <!--也可以使用另外一种数组表示方式--> <span>{$data['name']}{$data['age']}</span> <!--系统变量的输出--> {$Think.server.script_name} <!--输出$_SERVER['SCRIPT_NAME']变量--> {$Think.session.user_id}<!--输出$_SESSION['user_id']变量--> {$Think.get.pageNumber}<!--输出$_GET['pageNumber']变量--> {$Think.cookie.name}<!--输出$_COOKIE['name']变量--> <!--常量的输出--> {$Think.const.APP_PATH} <!--配置的输出--> {$Think.config.default_module} {$Think.config.default_controller} <!--语言的输出--> {$Think.lang.page_error} {$Think.lang.var_error} <!--请求参数的输出--> <!--调用Request对象的get方法 传入参数为id--> {$Request.get.id} <!--调用Request对象的param方法 传入参数为name--> {$Request.param.name} <!--调用Request对象的param方法 传入参数为user.nickname--> {$Request.param.user.nickname} <!--调用Request对象的root方法--> {$Request.root} <!--、调用Request对象的root方法,并且传入参数true--> {$Request.root.true} <!--调用Request对象的path方法--> {$Request.path} <!--调用Request对象的module方法--> {$Request.module} <!--调用Request对象的controller方法--> {$Request.controller} <!--调用Request对象的action方法--> {$Request.action} <!--调用Request对象的ext方法--> {$Request.ext} <!--调用Request对象的host方法--> {$Request.host} <!--调用Request对象的ip方法--> {$Request.ip} <!--调用Request对象的header方法--> {$Request.header.accept-encoding} <!--使用函数--> {:substr(strtoupper(md5($name)),0,3)} <span>{:request()->isGet()}</span> <!--如果使用url可以用--> <a href="{:url('index/index')}">this is index</a> <!--使用默认值--> {$user.nickname|default="这家伙很懒,什么也没留下"} <!--原样输出--> {literal} Hello,{$name}! {/literal} <!--模板注释--> {/* 注释内容 */ } 或 {// 注释内容 }
5、常用的内置标签
a、volist
<!--<?php foreach($data as $key => $val):?>--> <!-- <p><?php echo $key?><?php echo $val['id']?><?php echo $val['name']?></p>--> <!--<?php endforeach?>--> {volist name='data', id='val'} <p>{$key}{$val.id}{$val.name}{$val.sex}</p> {/volist} <!--以上两种示例的结果是一样的volist name是表示输出的变量, id则相当于foreach里的$val-->
如果需要在volist中进行取余操作
{volist name='data' id='val', mod=2} {eq name='mod' value='0'}<div>{$val.name}</div>{/eq} {eq name='mod' value='1'}<div>{$val.sex}</div>{/eq} {/volist}
如果需要在volist中进行截取指定的数组长度那么可以采用以下的方法,添加offset, length
{volist name='data' id='val' mod='2' offset='3' length='2'} {eq name='mod' value='0'}<div>{$val.name}</div>{/eq} {eq name='mod' value='1'}<div>{$val.sex}</div>{/eq} {/volist}
volist为空时候的输出
<!--为空的时候输出提示:--> {volist name="list" id="vo" empty="暂时没有数据" } {$vo.id}|{$vo.name} {/volist} <!--empty属性不支持直接传入html语法,但可以支持变量输出,例如:--> $this->assign('empty','<span class="empty">没有数据</span>'); $this->assign('list',$list);
name 需要遍历的数据
id 类似于foreach中 value
offset 截取数据起始位置
length 截取数据的个数
mod 奇偶数
empty 数据为空的使用
key 编号
b、比较标签符,例子同上
{比较标签 name="变量" value="值"}
内容
{/比较标签}
在模板视图中,不能出来> = < == != 等符号,需要用标签来替代
{for start='0' end='10' name='i'} {egt name='i' value='5'}这个是大于等于5的值{$i}<br/>{/egt} {lt name='i' value='5'}这个是小于5的值{$i}<br/>{/lt} {/for
标签 | 含义 |
---|---|
eq或者 equal | 等于 |
neq 或者notequal | 不等于 |
gt | 大于 |
egt | 大于等于 |
lt | 小于 |
elt | 小于等于 |
heq | 恒等于 |
nheq | 不恒等于 |
c、foreach循环
<!--name表示数据 item相当于key key相当于$key,也可以直接$key进行调用--> {foreach name='data' item='val' key='k'} <div>{$k}---{$val.id}{$val.name}{$val.age}</div> {/foreach}
name 需要遍历的数据
item 类似于foreach中的value
key 类似于foreach中的key
d、for循环
start 开始值 end 结束值 comparison 比较条件 step 步数 name 循环变量名 默认 i, 相当于php中的$i {for start="0" end="10" comparison="elt" step="2" name="abc"} <p>{$abc}</p> {/for} {for start="10" end="0" comparison="gt" step="-1"} <p>{$i}</p> {/for}
f、witch标签
{switch 变量 } {case value1 }输出内容1{/case} {case value2}输出内容2{/case} {default /}默认情况 {/switch} <!--示例--> {switch User.level} {case 1}value1{/case} {case 2}value2{/case} {default /}default {/switch}
g、if标签
{if 表达式}value1 {elseif 表达式 /}value2 {else /}value3 {/if} <!--示例--> {if ( $name == 1) OR ( $name > 100) } value1 {elseif $name == 2 /}value2 {else /} value3 {/if} <!--也可以使用php的代码--> {if strtoupper($user['name']) == 'THINKPHP' }ThinkPHP {else /} other Framework {/if}
h、empty标签
empty标签用于判断某个变量是否为空,用法:
{empty name="name"}
name为空值
{/empty}
如果判断没有赋值,可以使用:
{notempty name="name"}
name不为空
{/notempty}