视图和模板
视图和模板
[TOC]
控制器(在php文件)使用模板:
VIew模板输出:
$this->assign('name','value'); //定义view里的变量$name的值
return $this->fetch('index/index');//参数为空时默认当前控制器对应的view
相应的html文件下使用name变量:{$name}
<span style='color:#fb7299'>eg1:展示用户数据</span>
输出用户列表
控制器中:<a name='con'></a>
$list = User::all(); //返回User对象数组
$this->assign('list',$list);
$this->assign('count',count($list));
return $this->fetch('index/index');//参数为空时默认当前控制器对应的view
模板视图:
<h1>用户列表 {$count}</h1>
{volist name="list" id="user"}
<!--name="list"将$list数组传了过来,$user是每次遍历的数组的元素-->
<div class="container" style="border: 1px black dashed">
<ul>
<li>id:{$user.id}</li>
<li>名字:{$user.name}</li>
<li>生日:{$user.birthday}</li>
<li>邮箱:{$user.email}</li>
</ul>
</div>
{/volist}
渲染模板是会在runtime的temp生成临时文件
对应生成的临时文件片段:
<?php if(is_array($list) || $list instanceof \think\Collection || $list instanceof \think\Paginator): $i = 0; $__LIST__ = $list;if( count($__LIST__)==0 ) : echo "" ;else: foreach($__LIST__ as $key=>$user): $mod = ($i % 2 );++$i;?>
<!--name="list"将$list数组传了过来,$user是每次遍历的数组的元素-->
<div class="container" style="border: 1px black dashed">
<ul>
<li>id:<?php echo $user['id']; ?></li>
<li>名字:<?php echo $user['name']; ?></li>
<li>生日:<?php echo $user['birthday']; ?></li>
<li>邮箱:<?php echo $user['email']; ?></li>
</ul>
</div>
<?php endforeach; endif; else: echo "" ;endif; ?>
<span style='color:#fb7299'>eg2:分页展示用户数据</span>
在以上的 控制器代码中,将第一行改为:
$list = User::paginate(2); //每页展示两条数据
view在{/volist}
末尾加:
{$list->render()}
会在下面生成页面跳转底部导航
另一种方式:$page = $list->render();
临时文件:
<?php echo $list->render(); ?>
url会在后面自动加上?page=1
?page=2
...
最后生成的html元素:
<ul class="pagination">
<li class="disabled"><span>«</span></li>
<li class="active"><span>1</span></li>
<li><a href="/tp5_02/public/index?page=2">2</a></li>
<li><a href="/tp5_02/public/index?page=2">»</a></li>
</ul>
配置文件中对于分页的配置在代码最下面:
//分页配置
'paginate' => [
'type' => 'bootstrap',
'var_page' => 'page',
'list_rows' => 15,
其实的type是指分页的样式文件在这个文件夹下
"D:\code\phpSstudy\WWW\tp5_02\thinkphp\library\think\paginator\driver\Bootstrap.php"
官方关于分页的文档:https://www.kancloud.cn/manual/thinkphp5/154294
一个分页样式:http://www.thinkphp.cn/code/3000.html
<div style='border: 1px black dashed;'>
1.假设这里有3数据,当前展示第一页时,paginate获取的是前两条数据,因此count为2,页面就显示:用户列表 2
当前展示第二页时页面就显示:用户列表 1
2.list返回的是配置中type对应的thinkphp\library\think\paginator\driver\Bootstrap.php的类
</div>
公共模板:
1.
加载头部模板和尾部模板
{include file="index/header"/}
//html+php代码
{include file="index/footer"/}
生成的临时文件就是将文件代码拼切起来在第一行写上:
<?php if (!defined('THINK_PATH')) exit(); /*a:3:{s:78:"D:\code\phpSstudy\WWW\tp5_02\public/../application/index\view\index\index.html";i:1555132297;s:69:"D:\code\phpSstudy\WWW\tp5_02\application\index\view\Index\header.html";i:1555132224;s:69:"D:\code\phpSstudy\WWW\tp5_02\application\index\view\Index\footer.html";i:1555132265;}*/ ?>
模板路径配置:将默认的路径'../application/index/view/'
改为'../template/home/'
// 模板路径
//'view_path' => '',
'view_path' => '../template/home/',
PS:其下(这里的是home)的文件夹首字母一般大写
模板传参:
模板变量声明[title]
引用:
{include file="index/header" title="maid"/}
2.使用布局
(1).直接使用布局
在view下直接加一个html文件:
{include file="index/header"/}
{__CONTENT__}
{include file="index/footer"/}
使用布局:
{layout name="layout"} //name是html文件名
(2).全局配置,默认加载布局文件
//没有选项就添加
'layout_on' => true,
'layout_name' => 'layout',
'layout_item' => '{__CONTENT__}',
这种情况下某个页面排除默认布局:
{__NOLAYOUT__}
标签定制
// 标签库标签开始标记
'taglib_begin' => '{',
// 标签库标签结束标记
'taglib_end' => '}',
如果换成“<”和">",那么模板引擎需要这么写:
<volist name="list" id="user">
<!--todo-->
</volist>
一般不建议修改
输出替换
在控制器中模板解析之前:
$this->view->replace(['/Public' => '/static'])//解析时将模板中的'/Public'替换成'/static'
return $this->fetch();
加到控制器中可以自动在本控制器的每个方法使用:
public function __construct()
{
parent::__construct();
$this->view->replace(['用户列表' => 'maid']);
}