even

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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}
posted on 2019-09-24 23:43  even_blogs  阅读(337)  评论(0编辑  收藏  举报