视图和模板

发布于 2019-04-14  536 次阅读


视图和模板

[TOC]


控制器(在php文件)使用模板:

VIew模板输出:


1
2
$this->assign('name','value');   //定义view里的变量$name的值
return $this->fetch('index/index');//参数为空时默认当前控制器对应的view

相应的html文件下使用name变量:

1
{$name}

eg1:展示用户数据

输出用户列表

控制器中:


1
2
3
4
$list = User::all();  //返回User对象数组
$this->assign('list',$list);
$this->assign('count',count($list));
return $this->fetch('index/index');//参数为空时默认当前控制器对应的view

模板视图:

```php+HTML
<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}

<pre><code class=""><br />渲染模板是会在runtime的temp生成临时文件

对应生成的临时文件片段:

```php+HTML
<?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; ?>

eg2:分页展示用户数据

在以上的 控制器代码中,将第一行改为:


1
$list = User::paginate(2);     //每页展示两条数据

view在

1
{/volist}

末尾加:

```php+HTML
{$list->render()}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<br />会在下面生成页面跳转底部导航

​   另一种方式:`$page = ​$list-&gt;render();`

临时文件:

```php+HTML
&lt;?php echo $list-&gt;render(); ?&gt;
&lt;/code&gt;&lt;/pre&gt;

url会在后面自动加上&lt;code&gt;?page=1&lt;/code&gt; &lt;code&gt;?page=2&lt;/code&gt;...
最后生成的html元素:

&lt;pre data-language=HTML&gt;&lt;code class=&quot;language-markup &quot;&gt;&lt;ul class=&quot;pagination&quot;&gt;
    &lt;li class=&quot;disabled&quot;&gt;&lt;span&gt;«&lt;/span&gt;&lt;/li&gt;
    &lt;li class=&quot;active&quot;&gt;&lt;span&gt;1&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/tp5_02/public/index?page=2&quot;&gt;2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/tp5_02/public/index?page=2&quot;&gt;»&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/code&gt;&lt;/pre&gt;

配置文件中对于分页的配置在代码最下面:

&lt;pre&gt;&lt;code class=&quot;language-php &quot;&gt;//分页配置
&#039;paginate&#039;               =&gt; [
    &#039;type&#039;      =&gt; &#039;bootstrap&#039;,
    &#039;var_page&#039;  =&gt; &#039;page&#039;,
    &#039;list_rows&#039; =&gt; 15,
&lt;/code&gt;&lt;/pre&gt;

其实的type是指分页的样式文件在这个文件夹下

&lt;pre&gt;&lt;code class=&quot;&quot;&gt;&quot;D:\code\phpSstudy\WWW\tp5_02\thinkphp\library\think\paginator\driver\Bootstrap.php&quot;
&lt;/code&gt;&lt;/pre&gt;

官方关于分页的文档:&lt;a href=&quot;https://www.kancloud.cn/manual/thinkphp5/154294&quot;&gt;https://www.kancloud.cn/manual/thinkphp5/154294&lt;/a&gt;

一个分页样式:&lt;a href=&quot;http://www.thinkphp.cn/code/3000.html&quot;&gt;http://www.thinkphp.cn/code/3000.html&lt;/a&gt;

&lt;div style=&#039;border: 1px black dashed;&#039;&gt;
    1.假设这里有3数据,当前展示第一页时,paginate获取的是前两条数据,因此count为2,页面就显示:用户列表 2
    当前展示第二页时页面就显示:用户列表 1
    &lt;br/&gt;&lt;br/&gt;
    2.$list = User::paginate(5);   $list返回的是配置中type对应的thinkphp\library\think\paginator\driver\Bootstrap.php的类
&lt;/div&gt;

&lt;h3&gt;公共模板:&lt;/h3&gt;

&lt;h4&gt;1.&lt;/h4&gt;

加载头部模板和尾部模板

```php+HTML
{include file="index/header"/}
//html+php代码
{include file="index/footer"/}

<pre><code class=""><br />生成的临时文件就是将文件代码拼切起来在第一行写上:

```php
&lt;?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;}*/ ?&gt;

模板路径配置:将默认的路径

1
'../application/index/view/'

改为

1
'../template/home/'

1
2
3
// 模板路径
//'view_path'    =&gt; '',
'view_path'    =&gt; '../template/home/',

PS:其下(这里的是home)的文件夹首字母一般大写

模板传参:

​ 模板变量声明

1
[title]

​ 引用:


1
{include file="index/header" title="maid"/}

2.使用布局

(1).直接使用布局

在view下直接加一个html文件:


1
2
3
{include file="index/header"/}
{__CONTENT__}
{include file="index/footer"/}

使用布局:


1
{layout name="layout"}   //name是html文件名
(2).全局配置,默认加载布局文件

1
2
3
4
//没有选项就添加
'layout_on'     =&gt;  true,
'layout_name'   =&gt;  'layout',
'layout_item'   =&gt; '{__CONTENT__}',

这种情况下某个页面排除默认布局:


1
{__NOLAYOUT__}

标签定制


1
2
3
4
// 标签库标签开始标记
'taglib_begin' =&gt; '{',
// 标签库标签结束标记
'taglib_end'   =&gt; '}',

如果换成“<”和">",那么模板引擎需要这么写:


1
2
3
&lt;volist name="list" id="user"&gt;
&lt;!--todo--&gt;
&lt;/volist&gt;

一般不建议修改

输出替换

在控制器中模板解析之前:


1
2
$this-&gt;view-&gt;replace(['__PUBLIC__' =&gt; '/static'])//解析时将模板中的'__PUBLIC__'替换成'/static'
return $this-&gt;fetch();

加到控制器中可以自动在本控制器的每个方法使用:


1
2
3
4
5
public function __construct()
{
    parent::__construct();
    $this-&gt;view-&gt;replace(['用户列表' =&gt; 'maid']);
}

先这样,以后再改吧