## 關于視圖(V)
* 控制器調用模型類后返回的數據通過視圖組裝成不同格式的輸出。視圖根據不同的需求,來決定調用模板引擎進行內容解析后輸出還是直接輸出。視圖通常會有一系列的模板文件對應不同的控制器和操作方法,并且支持動態設置模板目錄。
* ThinkPHP內置了一個基于XML的性能卓越的模板引擎,這是一個專門為ThinkPHP服務的內置模板引擎,使用了XML標簽庫技術的編譯型模板引擎,支持兩種類型的模板標簽,使用了動態編譯和緩存技術,而且支持自定義標簽庫。
* DaiCuo插件中的視圖使用方法完全同ThinkPHP5的視圖使用相同,可參考ThinkPHP5官方文檔[視圖](http://www.hmoore.net/manual/thinkphp5/118112)章節。
* DaiCuo插件開發使用的模板規則為(后臺放置在插件目錄/view/...、前臺為插件目錄/theme/主題目錄/...)
* DaiCuo插件應用在模板渲染會根據訪客終端自動對應后臺配置的移動端或者PC端主題 。
## 基類模板
DaiCuo框架則利用了TP的模板繼承功能,內置了前后臺兩個基類模板(基于BootStrap4.6構建),開發者在需要前端開發時只需要繼承這兩個基類模板就可以了,實例如下:
* apps/common/views/admin.tpl 后臺基類模板
* apps/common/views/front.tpl 前臺基類模板
```
{extend name="apps/common/view/front.tpl" /}
{block name="header_meta"}......{/block}
{block name="header_header"}......{/block}
{block name="header_main"}......{/block}
{block name="header_footer"}......{/block}
```
## 模板繼承
* 模板繼承是一項更加靈活的模板布局方式,模板繼承不同于模板布局,甚至來說,應該在模板布局的上層。
* 模板繼承其實并不難理解,就好比類的繼承一樣,模板也可以定義一個基礎模板(或者是布局),并且其中定義相關的區塊(block),然后繼承(extend)該基礎模板的子模板中就可以對基礎模板中定義的區塊進行重載。
* 因此,模板繼承的優勢其實是設計基礎模板中的區塊(block)和子模板中替換這些區塊。每個區塊由`{block} {/block}`標簽組成。 下面就是基礎模板中的一個典型的區塊設計(用于設計網站標題):
~~~
{block name="title"}<title>網站標題</title>{/block}
~~~
## 模板主題
* 如果您的插件應用使用模板的場景比較簡單,則直接在應用目錄theme模板目錄下創建PC主題目錄(default)、移動主題目錄(default\_wap)
* 多主題切換只需要定義當前插件應用配置的theme、theme_wap的值即可;通常是在插件應用的配置文件里重置即可;當然您也可以通過配置組件將模板主題配置寫入數據庫中,在加載插件的動態配置時會自動處理。
```
//index模塊主題定義示例
DcConfigMerge('index',[
'theme'=>'default',
'theme_wap'=>'default'
]);
```
## 模板變量
在模板中輸出變量的方法很簡單,例如,在控制器中我們給模板變量賦值:
~~~
public function index()
{
$this->assign('url', 'http://www.daicuo.net');
return $this->fetch();
}
~~~
然后就可以在模板中使用,注意模板標簽的`{`和`$`之間不能有任何的空格,否則標簽無效。
~~~
Hello,{$url}!
~~~
模板編譯后的結果就是:
~~~
Hello,<?php echo($url);?>!
~~~
## 使用函數
變量輸出使用的函數可以支持內置的PHP函數或者用戶自定義函數,甚至是靜態方法。
~~~
{$create_time|date="y-m-d",###}
{$name|md5|strtoupper|substr=0,3}
{:substr(strtoupper(md5($name)),0,3)}
~~~
## 內置標簽
變量輸出使用普通標簽就足夠了,但是要完成其他的控制、循環和判斷功能,就需要借助模板引擎的標簽庫功能了,系統內置標簽庫的所有標簽無需引入標簽庫即可直接使用。
內置標簽包括:
| 標簽名 | 作用 | 包含屬性 |
| --- | --- | --- |
| include | 包含外部模板文件(閉合) | file |
| load | 導入資源文件(閉合 包括js css import別名) | file,href,type,value,basepath |
| volist | 循環數組數據輸出 | name,id,offset,length,key,mod |
| foreach | 數組或對象遍歷輸出 | name,item,key |
| for | For循環數據輸出 | name,from,to,before,step |
| switch | 分支判斷輸出 | name |
| case | 分支判斷輸出(必須和switch配套使用) | value,break |
| default | 默認情況輸出(閉合 必須和switch配套使用) | 無 |
| compare | 比較輸出(包括eq neq lt gt egt elt heq nheq等別名) | name,value,type |
| range | 范圍判斷輸出(包括in notin between notbetween別名) | name,value,type |
| present | 判斷是否賦值 | name |
| notpresent | 判斷是否尚未賦值 | name |
| empty | 判斷數據是否為空 | name |
| notempty | 判斷數據是否不為空 | name |
| defined | 判斷常量是否定義 | name |
| notdefined | 判斷常量是否未定義 | name |
| define | 常量定義(閉合) | name,value |
| assign | 變量賦值(閉合) | name,value |
| if | 條件判斷輸出 | condition |
| elseif | 條件判斷輸出(閉合 必須和if標簽配套使用) | condition |
| else | 條件不成立輸出(閉合 可用于其他標簽) | 無 |
| php | 使用php代碼 | 無 |
## 模板緩存
每個模板文件在執行過程中都會生成一個編譯后的緩存文件,其實就是一個可以運行的PHP文件。內置的模板引擎支持普通標簽和XML標簽方式兩種標簽定義,分別用于不同的目的:
| 標簽類型 | 描述 |
| --- | --- |
| 普通標簽 | 主要用于輸出變量和做一些基本的操作 |
| XML標簽 | 主要完成一些邏輯判斷、控制和循環輸出,并且可擴展 |
這種方式的結合保證了模板引擎的簡潔和強大的有效融合。
## 助手函數
* DcViewPath 獲取模板主題存放目錄路徑
* DcTheme 模板主題目錄名稱