# 快速入門(七):視圖和模板
本章主要來學習視圖和模板的用法。
前面只是在控制器方法里面直接輸出而沒有使用視圖模板功能,從現在開始來了解下如何把變量賦值到模板,并渲染輸出,主要內容包括:
- - [模板輸出](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147290#u6A21u677Fu8F93u51FA)
- [分頁輸出](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147290#u5206u9875u8F93u51FA)
- [公共模板](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147290#u516Cu5171u6A21u677F)
- [模板定位](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147290#u6A21u677Fu5B9Au4F4D)
- [模板布局](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147290#u6A21u677Fu5E03u5C40)
- [標簽定制](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147290#u6807u7B7Eu5B9Au5236)
- [輸出替換](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147290#u8F93u51FAu66FFu6362)
- [渲染內容](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147290#u6E32u67D3u5185u5BB9)
- [助手函數](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/147290#u52A9u624Bu51FDu6570)
## 模板輸出
首先來看如何輸出一個數據集,我們修改`User`控制器的`index`方法如下:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>\<span class="hljs-title">User</span> <span class="hljs-title">as</span> <span class="hljs-title">UserModel</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Controller</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span></span>{
<span class="hljs-comment">// 獲取用戶數據列表并輸出</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-number">()</span></span>{
<span class="hljs-regexp">$list</span> = UserModel::all();
<span class="hljs-regexp">$this</span>->assign(<span class="hljs-string">'list'</span>, <span class="hljs-regexp">$list</span>);
<span class="hljs-regexp">$this</span>->assign(<span class="hljs-string">'count'</span>, count(<span class="hljs-regexp">$list</span>));
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->fetch();
}
}</span>
```
```
這里的`User`控制器和之前模型章節有所不同,繼承了系統的`\think\Controller`類,該類對視圖類的方法進行了封裝,所以可以在無需實例化視圖類的情況下,直接調用視圖類的相關方法,包括:
方法 描述 assign 模板變量賦值 fetch 渲染模板文件 display 渲染內容 engine 初始化模板引擎這里用到的其中兩個方法`assign`和`fetch`,也是最常用的兩個方法。
`assign`方法可以把任何類型的變量賦值給模板,關鍵在于模板中如何輸出,不同的變量類型需要采用不同的標簽輸出。
前面我們已經學習過,`fetch`方法默認渲染輸出的模板文件應該是當前控制器和操作對應的模板,也就是:
```
<pre class="calibre18">
```
application/<span class="hljs-keyword">index</span>/view/user/<span class="hljs-keyword">index</span>.html
```
```
接下來,定義視圖文件的內容,采用`volist`標簽輸出數據集:
```
<pre class="calibre18">
```
<span class="hljs-regexp"><!doctype html></span><span class="hljs-regexp"><<span class="hljs-operator">html</span> <span class="hljs-operator">lang</span>=<span class="hljs-string">"en"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">head</span>></span><span class="hljs-regexp"><<span class="hljs-operator">meta</span> <span class="hljs-operator">charset</span>=<span class="hljs-string">"UTF-8"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">title</span>></span>查看用戶列表<span class="hljs-regexp"></<span class="hljs-operator">title</span>></span><span class="hljs-regexp"><<span class="hljs-operator">style</span>></span><span class="css"><span class="hljs-regexp">body</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">color</span>:<span class="hljs-string"> <span class="hljs-title">#333</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font</span>:<span class="hljs-string"> <span class="hljs-number">16px</span> Verdana, <span class="hljs-operator">"Helvetica Neue"</span>, helvetica, Arial, <span class="hljs-operator">'Microsoft YaHei'</span>, sans-serif</span></span>;
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"> <span class="hljs-number">0px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">20px</span></span></span>;
}</span><span class="hljs-regexp">a</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">color</span>:<span class="hljs-string"> <span class="hljs-title">#868686</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">cursor</span>:<span class="hljs-string"> pointer</span></span>;
}</span><span class="hljs-operator"><span class="hljs-title1">a</span>:<span class="hljs-string">hover{
text-decoration: underline</span></span>;
}
<span class="hljs-regexp">h2</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">color</span>:<span class="hljs-string"> <span class="hljs-title">#4288ce</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font-weight</span>:<span class="hljs-string"> <span class="hljs-number">400</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">6px</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"> <span class="hljs-number">6px</span> <span class="hljs-number">0</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font-size</span>:<span class="hljs-string"> <span class="hljs-number">28px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border-bottom</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#eee</span></span></span>;
}</span><span class="hljs-regexp">div</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"><span class="hljs-number">8px</span></span></span>;
}</span><span class="hljs-regexp">.info</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">12px</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border-bottom</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#eee</span></span></span>;
}</span><span class="hljs-regexp">.copyright</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">margin-top</span>:<span class="hljs-string"> <span class="hljs-number">24px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">12px</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border-top</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#eee</span></span></span>;
}</span></span><span class="hljs-regexp"></<span class="hljs-operator">style</span>></span><span class="hljs-regexp"></<span class="hljs-operator">head</span>></span><span class="hljs-regexp"><<span class="hljs-operator">body</span>></span><span class="hljs-regexp"><<span class="hljs-operator">h2</span>></span>用戶列表({$count})<span class="hljs-regexp"></<span class="hljs-operator">h2</span>></span>
{volist name="list" id="user" }
<span class="hljs-regexp"><<span class="hljs-operator">div</span> <span class="hljs-operator">class</span>=<span class="hljs-string">"info"</span>></span>
ID:{$user.id}<span class="hljs-regexp"><<span class="hljs-operator">br</span>/></span>
昵稱:{$user.nickname}<span class="hljs-regexp"><<span class="hljs-operator">br</span>/></span>
郵箱:{$user.email}<span class="hljs-regexp"><<span class="hljs-operator">br</span>/></span>
生日:{$user.birthday}<span class="hljs-regexp"><<span class="hljs-operator">br</span>/></span><span class="hljs-regexp"></<span class="hljs-operator">div</span>></span>
{/volist}
<span class="hljs-regexp"><<span class="hljs-operator">div</span> <span class="hljs-operator">class</span>=<span class="hljs-string">"copyright"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">a</span> <span class="hljs-operator">title</span>=<span class="hljs-string">"官方網站"</span> <span class="hljs-operator">href</span>=<span class="hljs-string">"http://www.thinkphp.cn"</span>></span>ThinkPHP<span class="hljs-regexp"></<span class="hljs-operator">a</span>></span><span class="hljs-regexp"><<span class="hljs-operator">span</span>></span>V5<span class="hljs-regexp"></<span class="hljs-operator">span</span>></span><span class="hljs-regexp"><<span class="hljs-operator">span</span>></span>{ 十年磨一劍-為API開發設計的高性能框架 }<span class="hljs-regexp"></<span class="hljs-operator">span</span>></span><span class="hljs-regexp"></<span class="hljs-operator">div</span>></span><span class="hljs-regexp"></<span class="hljs-operator">body</span>></span><span class="hljs-regexp"></<span class="hljs-operator">html</span>></span>
```
```
`ThinkPHP5.0`默認使用的是一個內置的編譯型模板引擎,包含了一系列的模板標簽,我們會陸續介紹一些常用的標簽用法。
index方法給模板賦值了兩個變量`count`和`list`,分別是標量和二維數組,標量的輸出很簡單,使用: `{$count}`便可,一看就明白。
二維數組通常使用`volist`標簽輸出。
```
<pre class="calibre18">
```
{volist name=<span class="hljs-string">"list"</span> id=<span class="hljs-string">"user"</span>}
ID:{<span class="hljs-regexp">$user</span>.id}<br/>
昵稱:{<span class="hljs-regexp">$user</span>.nickname}<br/>
郵箱:{<span class="hljs-regexp">$user</span>.email}<br/>
生日:{<span class="hljs-regexp">$user</span>.birthday}<br/>
------------------------<br/>
{/volist}
```
```
`volist`標簽的`name`屬性就是模板變量的名稱,`id`屬性則是定義每次循環輸出的變量,在volist標簽中間使用`{$user.id}`表示輸出當前用戶的id屬性,以此類推下面的內容則依次輸出用戶的相關屬性。
```
<pre class="calibre18">
```
ID:{<span class="hljs-regexp">$user</span>.id}<br/>
昵稱:{<span class="hljs-regexp">$user</span>.nickname}<br/>
郵箱:{<span class="hljs-regexp">$user</span>.email}<br/>
生日:{<span class="hljs-regexp">$user</span>.birthday}<br/>
```
```
來看下實際的輸出效果,訪問URL地址:
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com/user/index</span>
```
```
就可以看到頁面輸出結果如圖:

當然,實際看到的數據可能有所出入。
## 分頁輸出
可以很簡單的輸出用戶的分頁數據,控制器`index`方法修改為:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 獲取用戶數據列表</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-number">()</span></span>{
<span class="hljs-comment">// 分頁輸出列表 每頁顯示3條數據</span><span class="hljs-regexp">$list</span> = UserModel::paginate(<span class="hljs-number">3</span>);
<span class="hljs-regexp">$this</span>->assign(<span class="hljs-string">'list'</span>,<span class="hljs-regexp">$list</span>);
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->fetch();
}
```
```
模板文件修改為:
```
<pre class="calibre18">
```
<link rel=<span class="hljs-string">"stylesheet"</span> href=<span class="hljs-string">"/static/bootstrap/css/bootstrap.min.css"</span> />
<h2>用戶列表({<span class="hljs-regexp">$list</span>->total()})</h2>
{volist name=<span class="hljs-string">"list"</span> id=<span class="hljs-string">"user"</span>}
ID:{<span class="hljs-regexp">$user</span>.id}<br/>
昵稱:{<span class="hljs-regexp">$user</span>.nickname}<br/>
郵箱:{<span class="hljs-regexp">$user</span>.email}<br/>
生日:{<span class="hljs-regexp">$user</span>.birthday}<br/>
------------------------<br/>
{/volist}
{<span class="hljs-regexp">$list</span>->render()}
```
```
> 注意,由于演示需要,在模板中引入了bootstrap樣式文件。請按照所示位置存放。
多插入一些數據后,訪問下面的地址:
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com/user/index</span>
```
```
后可以看到輸出如圖所示:

## 公共模板
加上之前定義的創建用戶的模板,現在已經有兩個模板文件了,為了避免重復定義模板,可以把模板的公共頭部和尾部分離出來,便于維護。
我們把模板文件拆分為三部分:
```
<pre class="calibre18">
```
application<span class="hljs-regexp">/index/</span>view<span class="hljs-regexp">/user/</span>header.html
application<span class="hljs-regexp">/index/</span>view<span class="hljs-regexp">/user/</span>index.html
application<span class="hljs-regexp">/index/</span>view<span class="hljs-regexp">/user/</span>footer.html
```
```
`header.html`內容為:
```
<pre class="calibre18">
```
<span class="hljs-regexp"><!doctype html></span><span class="hljs-regexp"><<span class="hljs-operator">html</span> <span class="hljs-operator">lang</span>=<span class="hljs-string">"en"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">head</span>></span><span class="hljs-regexp"><<span class="hljs-operator">meta</span> <span class="hljs-operator">charset</span>=<span class="hljs-string">"UTF-8"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">title</span>></span>查看用戶列表<span class="hljs-regexp"></<span class="hljs-operator">title</span>></span><span class="hljs-regexp"><<span class="hljs-operator">style</span>></span><span class="css"><span class="hljs-regexp">body</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">color</span>:<span class="hljs-string"> <span class="hljs-title">#333</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font</span>:<span class="hljs-string"> <span class="hljs-number">16px</span> Verdana, <span class="hljs-operator">"Helvetica Neue"</span>, helvetica, Arial, <span class="hljs-operator">'Microsoft YaHei'</span>, sans-serif</span></span>;
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"> <span class="hljs-number">0px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">20px</span></span></span>;
}</span><span class="hljs-regexp">a</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">color</span>:<span class="hljs-string"> <span class="hljs-title">#868686</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">cursor</span>:<span class="hljs-string"> pointer</span></span>;
}</span><span class="hljs-operator"><span class="hljs-title1">a</span>:<span class="hljs-string">hover{
text-decoration: underline</span></span>;
}
<span class="hljs-regexp">h2</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">color</span>:<span class="hljs-string"> <span class="hljs-title">#4288ce</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font-weight</span>:<span class="hljs-string"> <span class="hljs-number">400</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">6px</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"> <span class="hljs-number">6px</span> <span class="hljs-number">0</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font-size</span>:<span class="hljs-string"> <span class="hljs-number">28px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border-bottom</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#eee</span></span></span>;
}</span><span class="hljs-regexp">div</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"><span class="hljs-number">8px</span></span></span>;
}</span><span class="hljs-regexp">.info</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">12px</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border-bottom</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#eee</span></span></span>;
}</span><span class="hljs-regexp">.copyright</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">margin-top</span>:<span class="hljs-string"> <span class="hljs-number">24px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">12px</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border-top</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#eee</span></span></span>;
}</span></span><span class="hljs-regexp"></<span class="hljs-operator">style</span>></span><span class="hljs-regexp"></<span class="hljs-operator">head</span>></span><span class="hljs-regexp"><<span class="hljs-operator">body</span>></span>
```
```
`footer.html`內容為:
```
<pre class="calibre18">
```
<span class="hljs-regexp"><<span class="hljs-operator">div</span> <span class="hljs-operator">class</span>=<span class="hljs-string">"copyright"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">a</span> <span class="hljs-operator">title</span>=<span class="hljs-string">"官方網站"</span> <span class="hljs-operator">href</span>=<span class="hljs-string">"http://www.thinkphp.cn"</span>></span>ThinkPHP<span class="hljs-regexp"></<span class="hljs-operator">a</span>></span><span class="hljs-regexp"><<span class="hljs-operator">span</span>></span>V5<span class="hljs-regexp"></<span class="hljs-operator">span</span>></span><span class="hljs-regexp"><<span class="hljs-operator">span</span>></span>{ 十年磨一劍-為API開發設計的高性能框架 }<span class="hljs-regexp"></<span class="hljs-operator">span</span>></span><span class="hljs-regexp"></<span class="hljs-operator">div</span>></span><span class="hljs-regexp"></<span class="hljs-operator">body</span>></span><span class="hljs-regexp"></<span class="hljs-operator">html</span>></span>
```
```
`index.html`內容為:
```
<pre class="calibre18">
```
{include file=<span class="hljs-string">"user/header"</span> /}
<h2>用戶列表({<span class="hljs-regexp">$count</span>})</h2>
{volist name=<span class="hljs-string">"list"</span> id=<span class="hljs-string">"user"</span> }
<div class=<span class="hljs-string">"info"</span>>
ID:{<span class="hljs-regexp">$user</span>.id}<br/>
昵稱:{<span class="hljs-regexp">$user</span>.nickname}<br/>
郵箱:{<span class="hljs-regexp">$user</span>.email}<br/>
生日:{<span class="hljs-regexp">$user</span>.birthday}<br/>
</div>
{/volist}
{include file=<span class="hljs-string">"user/footer"</span> /}
```
```
公共頭部模板文件中可能存在一些變量,例如這里的頁面標題不同的頁面會有不同,可以使用
```
<pre class="calibre18">
```
{<span class="hljs-keyword">include</span> <span class="hljs-keyword">file</span>=<span class="hljs-string">"user/header"</span> title=<span class="hljs-string">"查看用戶列表"</span> <span class="hljs-regexp">/}</span>
```
```
然后把頭部模板文件中的
```
<pre class="calibre18">
```
<span class="hljs-regexp"><<span class="hljs-operator">title</span>></span>查看用戶列表<span class="hljs-regexp"></<span class="hljs-operator">title</span>></span>
```
```
改為:
```
<pre class="calibre18">
```
<span class="hljs-regexp"><<span class="hljs-operator">title</span>></span>[title]<span class="hljs-regexp"></<span class="hljs-operator">title</span>></span>
```
```
再次訪問頁面可以看到輸出結果:

如果需要傳遞多個變量,則使用多個屬性即可,例如:
```
<pre class="calibre18">
```
{<span class="hljs-keyword">include</span> <span class="hljs-keyword">file</span>=<span class="hljs-string">"user/header"</span> title=<span class="hljs-string">"查看用戶列表"</span> keywords=<span class="hljs-string">"thinkphp"</span> <span class="hljs-regexp">/}</span>
```
```
也可以支持傳遞動態變量的方式,例如:
```
<pre class="calibre18">
```
{<span class="hljs-keyword">include</span> <span class="hljs-keyword">file</span>=<span class="hljs-string">"user/header"</span> title=<span class="hljs-string">"$title"</span> <span class="hljs-regexp">/}</span>
```
```
## 模板定位
`fetch`方法的第一個參數表示渲染的模板文件或者模板表達式。
通常我們都是使用的模板表達式,而不需要使用完整的文件名。
模板文件名可以隨意命名,如果把`index.html`文件改成:
```
<pre class="calibre18">
```
application<span class="hljs-regexp">/index/</span>view<span class="hljs-regexp">/user/</span>list.html
```
```
index操作方法中的fetch方法需要改成:
```
<pre class="calibre18">
```
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->fetch(<span class="hljs-string">'list'</span>);
```
```
而如果fetch方法改成:
```
<pre class="calibre18">
```
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->fetch(<span class="hljs-string">'index/list'</span>);
```
```
那么實際渲染的模板文件則是
```
<pre class="calibre18">
```
application/<span class="hljs-keyword">index</span>/view/<span class="hljs-keyword">index</span>/list.html
```
```
當然,你可以設置更多的目錄級別,例如:
```
<pre class="calibre18">
```
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->fetch(<span class="hljs-string">'one/two/three/list'</span>);
```
```
那么實際渲染的模板文件則是
```
<pre class="calibre18">
```
application<span class="hljs-regexp">/index/</span>view<span class="hljs-regexp">/one/</span>two<span class="hljs-regexp">/three/</span>list.html
```
```
有一些和模板定位相關的設置參數能夠幫助你調整模板文件的位置和名稱。
通常來說,模板相關的參數可以直接在配置文件中配置`template`參數,默認的配置如下:
```
<pre class="calibre18">
```
<span class="hljs-string">'template'</span> => [
<span class="hljs-comment">// 模板引擎類型 支持 php think 支持擴展</span><span class="hljs-string">'type'</span> => <span class="hljs-string">'Think'</span>,
<span class="hljs-comment">// 模板路徑</span><span class="hljs-string">'view_path'</span> => <span class="hljs-string">''</span>,
<span class="hljs-comment">// 模板后綴</span><span class="hljs-string">'view_suffix'</span> => <span class="hljs-string">'.html'</span>,
<span class="hljs-comment">// 模板文件名分隔符</span><span class="hljs-string">'view_depr'</span> => DS,
<span class="hljs-comment">// 模板引擎普通標簽開始標記</span><span class="hljs-string">'tpl_begin'</span> => <span class="hljs-string">'{'</span>,
<span class="hljs-comment">// 模板引擎普通標簽結束標記</span><span class="hljs-string">'tpl_end'</span> => <span class="hljs-string">'}'</span>,
<span class="hljs-comment">// 標簽庫標簽開始標記</span><span class="hljs-string">'taglib_begin'</span> => <span class="hljs-string">'{'</span>,
<span class="hljs-comment">// 標簽庫標簽結束標記</span><span class="hljs-string">'taglib_end'</span> => <span class="hljs-string">'}'</span>,
],
```
```
`view_path`參數決定了你的模板文件的根目錄,如果沒有設置的話系統會默認使用當前模塊的視圖目錄`view`。
如果希望自定義模板文件的位置、命名和后綴,可以對模板參數稍加修改如下:
```
<pre class="calibre18">
```
<span class="hljs-string">'template'</span> => [
<span class="hljs-comment">// 模板引擎類型 支持 php think 支持擴展</span><span class="hljs-string">'type'</span> => <span class="hljs-string">'Think'</span>,
<span class="hljs-comment">// 模板路徑</span><span class="hljs-string">'view_path'</span> => <span class="hljs-string">'../template/index/'</span>,
<span class="hljs-comment">// 模板后綴</span><span class="hljs-string">'view_suffix'</span> => <span class="hljs-string">'.tpl'</span>,
<span class="hljs-comment">// 模板文件名分隔符</span><span class="hljs-string">'view_depr'</span> => <span class="hljs-string">'_'</span>,
],
```
```
通過配置我們把當前渲染的模板文件移動到了
```
<pre class="calibre18">
```
ROOT_PATH/template/<span class="hljs-keyword">index</span>/user_index.tpl
```
```
## 模板布局
現在使用模板布局來進一步簡化模板定義。
首先需要定義一個布局模板文件,放到 `application/index/view/layout.html`內容如下:
```
<pre class="calibre18">
```
{<span class="hljs-keyword">include</span> file=<span class="hljs-string">"user/header"</span> /}
{__CONTENT__}
{<span class="hljs-keyword">include</span> file=<span class="hljs-string">"user/footer"</span> /}
```
```
`application/index/view/user/index.html`改成:
```
<pre class="calibre18">
```
{layout name=<span class="hljs-string">"layout"</span> /}
<h2>用戶列表({<span class="hljs-regexp">$count</span>})</h2>
{volist name=<span class="hljs-string">"list"</span> id=<span class="hljs-string">"user"</span> }
<div class=<span class="hljs-string">"info"</span>>
ID:{<span class="hljs-regexp">$user</span>.id}<br/>
昵稱:{<span class="hljs-regexp">$user</span>.nickname}<br/>
郵箱:{<span class="hljs-regexp">$user</span>.email}<br/>
生日:{<span class="hljs-regexp">$user</span>.birthday}<br/>
</div>
{/volist}
```
```
在index模板文件中開頭定義`layout`標簽 ,表示當前模板使用了布局,布局模板文件為`layout.html`,布局模板中的 `{__CONTENT__}`會自動替換為解析后的index.html內容。
如果你的布局模板中不是使用`{__CONTENT__}`的話,可以改成:
```
<pre class="calibre18">
```
{layout name=<span class="hljs-string">"layout/newlayout"</span> <span class="hljs-number">replace</span>=<span class="hljs-string">"[__REPLACE__]"</span> /}
```
```
那么回自動讀取模板文件
`application/index/view/layout/newlayout.html`,內容如下:
```
<pre class="calibre18">
```
{<span class="hljs-keyword">include</span> file=<span class="hljs-string">"user/header"</span> /}
[__REPLACE__]
{<span class="hljs-keyword">include</span> file=<span class="hljs-string">"user/footer"</span> /}
```
```
如果你所有的模板文件都統一使用布局,并且都是有同一個布局模板,那么可以統一配置而不需要在模板文件中使用`layout`標簽定義。
在應用配置或者模塊配置中添加如下設置參數:
```
<pre class="calibre18">
```
<span class="hljs-string">'template'</span> => [
<span class="hljs-string">'layout_on'</span> => <span class="hljs-keyword">true</span>,
<span class="hljs-string">'layout_name'</span> => <span class="hljs-string">'layout'</span>,
<span class="hljs-string">'layout_item'</span> => <span class="hljs-string">'[__REPLACE__]'</span>
]
```
```
模板文件中只需要定義如下:
```
<pre class="calibre18">
```
<h2>用戶列表({<span class="hljs-regexp">$count</span>})</h2>
{volist name=<span class="hljs-string">"list"</span> id=<span class="hljs-string">"user"</span> mod=<span class="hljs-string">"2"</span> }
<div class=<span class="hljs-string">"info"</span>>
ID:{<span class="hljs-regexp">$user</span>.id}<br/>
昵稱:{<span class="hljs-regexp">$user</span>.nickname}<br/>
郵箱:{<span class="hljs-regexp">$user</span>.email}<br/>
生日:{<span class="hljs-regexp">$user</span>.birthday}<br/>
</div>
{/volist}
```
```
訪問
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com/user/index</span>
```
```
可以看到頁面輸出結果和之前一樣:

如果想動態控制模板文件使用布局,則可以在控制器中使用:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 獲取用戶數據列表</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-number">()</span></span>{
<span class="hljs-regexp">$list</span> = UserModel::all();
<span class="hljs-regexp">$this</span>->assign(<span class="hljs-string">'list'</span>, <span class="hljs-regexp">$list</span>);
<span class="hljs-regexp">$this</span>->assign(<span class="hljs-string">'count'</span>, count(<span class="hljs-regexp">$list</span>));
<span class="hljs-comment">// 動態使用布局</span><span class="hljs-regexp">$this</span>->view->engine->layout(<span class="hljs-string">'layout'</span>,<span class="hljs-string">'[__REPLACE__]'</span>);
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->fetch();
}
```
```
> 注意:這里調用的是`this->view->engine`對象的`layout`方法,并不是所有的模板引擎都支持布局功能,如果你使用的是其它的模板引擎,可能不提供`layout`方法。
如果使用配置方式開啟了布局模板,也可以使用該方法臨時關閉布局,例如:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 獲取用戶數據列表</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-number">()</span></span>{
<span class="hljs-regexp">$list</span> = UserModel::all();
<span class="hljs-regexp">$this</span>->assign(<span class="hljs-string">'list'</span>, <span class="hljs-regexp">$list</span>);
<span class="hljs-regexp">$this</span>->assign(<span class="hljs-string">'count'</span>, count(<span class="hljs-regexp">$list</span>));
<span class="hljs-comment">// 臨時關閉布局</span><span class="hljs-regexp">$this</span>->view->engine->layout(<span class="hljs-keyword">false</span>);
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->fetch();
}
```
```
或者直接在模板文件的開頭加上`{__NOLAYOUT__}`標簽:
```
<pre class="calibre18">
```
{__NOLAYOUT__}
<h2>用戶列表({<span class="hljs-regexp">$count</span>})</h2>
{volist name=<span class="hljs-string">"list"</span> id=<span class="hljs-string">"user"</span> mod=<span class="hljs-string">"2"</span> }
<div class=<span class="hljs-string">"info"</span>>
ID:{<span class="hljs-regexp">$user</span>.id}<br/>
昵稱:{<span class="hljs-regexp">$user</span>.nickname}<br/>
郵箱:{<span class="hljs-regexp">$user</span>.email}<br/>
生日:{<span class="hljs-regexp">$user</span>.birthday}<br/>
</div>
{/volist}
```
```
## 標簽定制
可以設置模板標簽的定界符:
```
<pre class="calibre18">
```
<span class="hljs-string">'template'</span> => [
<span class="hljs-comment">// 模板引擎類型 支持 php think 支持擴展</span><span class="hljs-string">'type'</span> => <span class="hljs-string">'Think'</span>,
<span class="hljs-comment">// 模板路徑</span><span class="hljs-string">'view_path'</span> => <span class="hljs-string">'../template/index/'</span>,
<span class="hljs-comment">// 模板后綴</span><span class="hljs-string">'view_suffix'</span> => <span class="hljs-string">'.tpl'</span>,
<span class="hljs-comment">// 模板文件名分隔符</span><span class="hljs-string">'view_depr'</span> => <span class="hljs-string">'_'</span>,
<span class="hljs-comment">// 模板引擎普通標簽開始標記</span><span class="hljs-string">'tpl_begin'</span> => <span class="hljs-string">'{'</span>,
<span class="hljs-comment">// 模板引擎普通標簽結束標記</span><span class="hljs-string">'tpl_end'</span> => <span class="hljs-string">'}'</span>,
<span class="hljs-comment">// 標簽庫標簽開始標記</span><span class="hljs-string">'taglib_begin'</span> => <span class="hljs-string">'<'</span>,
<span class="hljs-comment">// 標簽庫標簽結束標記</span><span class="hljs-string">'taglib_end'</span> => <span class="hljs-string">'>'</span>,
],
```
```
并且修改`index.html`模板中的標簽修改如下:
```
<pre class="calibre18">
```
<span class="hljs-regexp"><<span class="hljs-operator">h2</span>></span>用戶列表({$count})<span class="hljs-regexp"></<span class="hljs-operator">h2</span>></span><span class="hljs-regexp"><<span class="hljs-operator">div</span> <span class="hljs-operator">class</span>=<span class="hljs-string">"info"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">volist</span> <span class="hljs-operator">name</span>=<span class="hljs-string">"list"</span> <span class="hljs-operator">id</span>=<span class="hljs-string">"user"</span> ></span>
ID:{$user.id}<span class="hljs-regexp"><<span class="hljs-operator">br</span>/></span>
昵稱:{$user.nickname}<span class="hljs-regexp"><<span class="hljs-operator">br</span>/></span>
郵箱:{$user.email}<span class="hljs-regexp"><<span class="hljs-operator">br</span>/></span>
生日:{$user.birthday}<span class="hljs-regexp"><<span class="hljs-operator">br</span>/></span><span class="hljs-regexp"></<span class="hljs-operator">volist</span>></span><span class="hljs-regexp"></<span class="hljs-operator">div</span>></span>
```
```
## 輸出替換
為了更加清晰,需要把資源文件獨立出來,并在模板文件中引入,例如增加`public/static/common.css`文件:
```
<pre class="calibre18">
```
<span class="hljs-regexp">body</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">color</span>:<span class="hljs-string"> <span class="hljs-title">#333</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font</span>:<span class="hljs-string"> <span class="hljs-number">16px</span> Verdana, <span class="hljs-operator">"Helvetica Neue"</span>, helvetica, Arial, <span class="hljs-operator">'Microsoft YaHei'</span>, sans-serif</span></span>;
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"> <span class="hljs-number">0px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">20px</span></span></span>;
}</span><span class="hljs-regexp">a</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">color</span>:<span class="hljs-string"> <span class="hljs-title">#868686</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">cursor</span>:<span class="hljs-string"> pointer</span></span>;
}</span><span class="hljs-operator"><span class="hljs-title1">a</span>:<span class="hljs-string">hover{
text-decoration: underline</span></span>;
}
<span class="hljs-regexp">h2</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">color</span>:<span class="hljs-string"> <span class="hljs-title">#4288ce</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font-weight</span>:<span class="hljs-string"> <span class="hljs-number">400</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">6px</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"> <span class="hljs-number">6px</span> <span class="hljs-number">0</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font-size</span>:<span class="hljs-string"> <span class="hljs-number">28px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border-bottom</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#eee</span></span></span>;
}</span><span class="hljs-regexp">div</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"><span class="hljs-number">8px</span></span></span>;
}</span><span class="hljs-regexp">.info</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">12px</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border-bottom</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#eee</span></span></span>;
}</span><span class="hljs-regexp">.copyright</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">margin-top</span>:<span class="hljs-string"> <span class="hljs-number">24px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">12px</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border-top</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#eee</span></span></span>;
}</span>
```
```
我們在header.html文件中引入資源文件
```
<pre class="calibre18">
```
<span class="hljs-regexp"><<span class="hljs-operator">html</span>></span><span class="hljs-regexp"><<span class="hljs-operator">head</span>></span><span class="hljs-regexp"><<span class="hljs-operator">meta</span> <span class="hljs-operator">charset</span>=<span class="hljs-string">"UTF-8"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">title</span>></span>[title]<span class="hljs-regexp"></<span class="hljs-operator">title</span>></span><span class="hljs-regexp"><<span class="hljs-operator">link</span> <span class="hljs-operator">charset</span>=<span class="hljs-string">"utf-8"</span> <span class="hljs-operator">rel</span>=<span class="hljs-string">"stylesheet"</span> <span class="hljs-operator">href</span>=<span class="hljs-string">"/static/common.css"</span>></span><span class="hljs-regexp"></<span class="hljs-operator">head</span>></span><span class="hljs-regexp"><<span class="hljs-operator">body</span>></span>
```
```
但這樣有一個問題,如果部署的目錄變化的話,資源文件的路徑就會跟著變化,這里我們采用輸出替換功能,使得資源文件的引入動態化
可以在輸出之前對解析后的內容進行替換,使用:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 讀取用戶數據</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">read</span><span class="hljs-number">(<span class="hljs-regexp">$id</span>=<span class="hljs-string">''</span>)</span></span>{
<span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-regexp">$id</span>);
<span class="hljs-regexp">$this</span>->assign(<span class="hljs-string">'user'</span>,<span class="hljs-regexp">$user</span>);
<span class="hljs-regexp">$this</span>->view->replace([
<span class="hljs-string">'__PUBLIC__'</span> => <span class="hljs-string">'/static'</span>,
]);
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->fetch();
}
```
```
模板文件改為:
```
<pre class="calibre18">
```
<span class="hljs-regexp"><<span class="hljs-operator">html</span>></span><span class="hljs-regexp"><<span class="hljs-operator">head</span>></span><span class="hljs-regexp"><<span class="hljs-operator">meta</span> <span class="hljs-operator">charset</span>=<span class="hljs-string">"UTF-8"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">title</span>></span>[title]<span class="hljs-regexp"></<span class="hljs-operator">title</span>></span><span class="hljs-regexp"><<span class="hljs-operator">link</span> <span class="hljs-operator">charset</span>=<span class="hljs-string">"utf-8"</span> <span class="hljs-operator">rel</span>=<span class="hljs-string">"stylesheet"</span> <span class="hljs-operator">href</span>=<span class="hljs-string">"__PUBLIC__/common.css"</span>></span><span class="hljs-regexp"></<span class="hljs-operator">head</span>></span><span class="hljs-regexp"><<span class="hljs-operator">body</span>></span>
```
```
最終輸出的時候,會自動進行`__PUBLIC__`替換。
## 渲染內容
有時候,并不需要模板文件,而是直接渲染內容或者讀取數據庫中存儲的內容,控制器方法修改如下:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>\<span class="hljs-title">User</span> <span class="hljs-title">as</span> <span class="hljs-title">UserModel</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Controller</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span></span>{
<span class="hljs-comment">// 獲取用戶數據列表并輸出</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-number">()</span></span>{
<span class="hljs-regexp">$list</span> = UserModel::all();
<span class="hljs-regexp">$this</span>->assign(<span class="hljs-string">'list'</span>, <span class="hljs-regexp">$list</span>);
<span class="hljs-regexp">$this</span>->assign(<span class="hljs-string">'count'</span>, count(<span class="hljs-regexp">$list</span>));
<span class="hljs-comment">// 關閉布局 </span><span class="hljs-regexp">$this</span>->view->engine->layout(<span class="hljs-keyword">false</span>);
<span class="hljs-regexp">$content</span> = <span class="hljs-string"><<<EOT
<style>
body{
color: #333;
font: 16px Verdana, "Helvetica Neue", helvetica, Arial, 'Microsoft YaHei', sans-serif;
margin: 0px;
padding: 20px;
}
a{
color: #868686;
cursor: pointer;
}
a:hover{
text-decoration: underline;
}
h2{
color: #4288ce;
font-weight: 400;
padding: 6px 0;
margin: 6px 0 0;
font-size: 28px;
border-bottom: 1px solid #eee;
}
div{
margin:8px;
}
.info{
padding: 12px 0;
border-bottom: 1px solid #eee;
}
.copyright{
margin-top: 24px;
padding: 12px 0;
border-top: 1px solid #eee;
}
</style>
<h2>用戶列表({\$count})</h2>
<div>
{volist name="list" id="user" }
ID:{\$user.id}<br/>
昵稱:{\$user.nickname}<br/>
郵箱:{\$user.email}<br/>
生日:{\$user.birthday}<br/>
------------------------<br/>
{/volist}
</div>
<div class="copyright">
<a title="官方網站" href="http://www.thinkphp.cn">ThinkPHP</a>
<span>V5</span>
<span>{ 十年磨一劍-為API開發設計的高性能框架 }</span>
</div>
EOT;</span><span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->display(<span class="hljs-regexp">$content</span>);
}
}</span>
```
```
`display`方法用于渲染內容而不是模板文件輸出,和直接使用`echo`輸出的區別是`display`方法輸出的內容支持模板標簽的解析。
## 助手函數
可以使用系統提供的助手函數view簡化模板渲染輸出(注意不適用于內容渲染輸出):
前面的模板渲染代碼可以改為:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>\<span class="hljs-title">User</span> <span class="hljs-title">as</span> <span class="hljs-title">UserModel</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span></span>{
<span class="hljs-comment">// 讀取用戶數據</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">read</span><span class="hljs-number">(<span class="hljs-regexp">$id</span>=<span class="hljs-string">''</span>)</span></span>{
<span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-regexp">$id</span>);
<span class="hljs-keyword">return</span> view(<span class="hljs-string">''</span>, [<span class="hljs-string">'user'</span> => <span class="hljs-regexp">$user</span>], [<span class="hljs-string">'__PUBLIC__'</span> => <span class="hljs-string">'/static'</span>]);
}
}</span>
```
```
> 使用`view`助手函數,不需要繼承`think\Controller`類。該方法的第一個參數就是渲染的模板表達式。
- 脕茫隆壟脨貌脩脭
- 脕茫隆壟脨貌脩脭
- 脪祿隆壟祿霉麓隆
- 脪祿隆壟祿霉麓隆
- 露鎂隆壟URL潞脥脗路脫脡
- 露鎂隆壟URL潞脥脗路脫脡
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脣脛隆壟脢媒戮脻驢芒
- 脣脛隆壟脢媒戮脻驢芒
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脕霉隆壟脛攏脨脥潞脥鹿脴脕陋
- 攏簍1攏漏脛攏脨脥露簍脪氓
- 攏簍2攏漏祿霉麓隆虜脵脳梅
- 攏簍3攏漏露脕脠隆脝梅潞脥脨脼賂脛脝梅
- 攏簍4攏漏脌脿脨脥脳陋祿祿潞脥脳脭露爐脥錨魯脡
- 攏簍5攏漏虜茅脩爐路露脦摟
- 攏簍6攏漏脢盲脠毛潞脥脩茅脰隴
- 攏簍7攏漏鹿脴脕陋
- 攏簍8攏漏脛攏脨脥脢盲魯枚
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 戮脜隆壟API驢陋路壟
- 戮脜隆壟API驢陋路壟
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬露鎂隆壟脭脫脧卯
- Cookie
- Session
- 碌樓脭陋虜芒脢脭
- 脥錄脧帽麓婁脌鉚
- 脦脛錄鎂脡脧麓蘆
- 脩茅脰隴脗毛
- 賂陸脗錄
- A隆壟魯攏錄沒脦脢脤芒錄爐
- B隆壟3.2潞脥5.0脟酶鹵冒
- C隆壟脰煤脢脰潞爐脢媒
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝