本文實例講述了thinkphp3.x中display方法及show方法的用法。分享給大家供大家參考,具體如下:
通過前面的文章在了解了控制器和模型操作後,我們開始熟悉視圖部分,ThinkPHP中的視圖主要就是指模板文件和模板引擎,本篇首先了解下模板文件以及是如何進行渲染輸出的。
一、模板定義
為了對模板文件更加有效的管理,ThinkPHP對模板文件進行目錄劃分,默認的模板文件定義規則是:
模板目錄/[分組名/][模板主題/]模塊名/操作名+模板後綴
模板目錄默認是項目下面的Tpl, 當定義分組的情況下,會按照分組名分開子目錄,新版模板主題默認是空(表示不啟用模板主題功能),
模板主題功能是為了多模板切換而設計的,如果有多個模板主題的話,可以用DEFAULT_THEME參數設置默認的模板主題名。
在每個模板主題下面,是以項目的模塊名為目錄,然後是每個模塊的具體操作模板文件,例如:
User模塊的add操作 對應的模板文件就應該是:
Tpl/User/add.html
模板文件的默認後綴是.html,也可以通過TMPL_TEMPLATE_SUFFIX來配置成其他的。例如,我們可以配置:
'TMPL_TEMPLATE_SUFFIX'=>'.tpl'
定義後,User模塊的add操作 對應的模板文件就變成是:
Tpl/User/add.tpl
如果項目啟用了模塊分組功能(假設User模塊屬於Home分組),那麼默認對應的模板文件可能變成 :
Tpl/Home/User/add.html
分組模式下面,如果覺得目錄結構太深,可以通過設置TMPL_FILE_DEPR參數來配置簡化模板的目錄層次,例如設置:
'TMPL_FILE_DEPR'=>'_'
默認的模板文件就變成了:
Tpl/Home/User_add.html
正是因為系統有這樣一種模板文件自動識別的規則,所以給我們的模板渲染輸出帶來了簡化。
二、模板渲染
模板定義後就可以通過display和show方法來渲染輸出。其中display方法需要我們有定義模板文件,而show方法則是直接渲染內容輸出。
最常用的是display方法,調用格式:
第一種:
display('[主題:][模塊:][操作]'[,'字符編碼'][,'輸出類型'])
第二種:
display('完整的模板文件名'[,'字符編碼'][,'輸出類型'])
下面是一個最典型的用法,不帶任何參數:
$this->display();
表示系統會按照默認規則自動定位模板文件,所以通常display方法無需帶任何參數即可輸出對應的模板,這是模板輸出的最簡單的用法。
如果沒有按照模板定義規則來定義模板文件,或者我需要調用其他模塊下面的某個模板,可以使用:
$this->display('edit');
表示調用當前模塊下面的edit模板
$this->display('Member:read');
表示調用Member模塊下面的read模板。
如果我們使用了模板主題功能,那麼也可以支持跨主題調用,使用:
$this->display('theme:User:edit');
表示調用theme主題下面的User模塊的edit模板。
這種方式的渲染輸出不需要寫模板文件的路徑和後綴,確切地說,這裡面的模塊和操作並不一定需要有對應的模塊或者操作,只是一個目錄名稱和文件名稱而已,例如,你的項目裡面可能根本沒有Public模塊,更沒有Public模塊的menu操作,但是一樣可以使用
$this->display('Public:menu');
輸出這個模板文件。理解了這個,模板輸出就清晰了。
display方法支持在渲染輸出的時候指定輸出編碼和類型,例如:
$this->display('read', 'utf-8', 'text/xml');
表示輸出XML頁面類型(配合你的應用需求可以輸出很多類型)。
事情總有特例,如果模板目錄是自定義的,或者根本不需要按模塊進行分目錄存放,那麼默認的display渲染規則就不能處理,這個時候,我們就需要使用另外一種方式來應對,直接傳入模板文件名即可,例如:
$this->display('./Public/menu.html');
這種方式需要指定模板路徑和後綴,這裡的Public目錄是位於當前項目入口文件位置下面。如果是其他的後綴文件,也支持直接輸出,例如:
$this->display('./Public/menu.tpl');
只要./Public/menu.tpl是一個實際存在的模板文件。
要注意模板文件位置是相對於項目的入口文件,而不是模板目錄。
還有一種情況是,你需要獲取渲染模板的輸出內容,就可以使用fetch方法,fetch方法的用法和display基本一致,區別就在於fetch方法渲染後不是直接輸出,而是返回渲染後的內容,例如:
$content = $this->fetch('Member:edit');
使用fetch方法獲取渲染內容後,你可以進行過濾和替換等操作,用於對模板輸出的復雜需求。
如果你沒有定義任何模板文件,或者把模板內容存儲到數據庫中的話,你就需要使用show方法來渲染輸出了,show方法的調用格式:
show('渲染內容'[,'字符編碼'][,'輸出類型'])
例如,
$this->show($content);
也可以指定編碼和類型:
$this->show($content, 'utf-8', 'text/xml');
show方法中的內容也可以支持模板解析。
三、模板賦值
我們知道了如何渲染模板輸出,但是如果要在模板中輸出變量,必須在在控制器中把變量傳遞給模板,提供了assign方法對模板變量賦值,無論何種變量類型都統一使用assign賦值。
$this->assign('name',$value); //下面的寫法是等效的: //$this->name = $value;
assign方法必須在display和show方法之前調用,並且系統只會輸出設定的變量,其它變量不會輸出(系統變量可以通過特殊的標簽輸出,可以無需賦值模板變量),一定程度上保證了變量的安全性。
賦值後,就可以在模板文件中輸出變量了,如果使用的是內置模板的話,就可以這樣輸出:
{$name}
如果要同時輸出多個模板變量,可以使用下面的方式:
$array['name'] = 'thinkphp'; $array['email'] = '[email protected]'; $array['phone'] = '12335678'; $this->assign($array);
這樣,就可以在模板文件中同時輸出name、email和phone三個變量。
模板變量的輸出根據不同的模板引擎有不同的方法,我們在後面會專門講解內置模板引擎的用法。如果你使用的是PHP本身作為模板引擎的話 ,就可以直接在模板文件裡面輸出了:
<?php echo $name.'['.$email.''.$phone.']';?>
如果采用內置的模板引擎,可以使用:
{$name} [ {$email} {$phone} ]
輸出同樣的內容。
關於更多的模板標簽使用,我們會在後面模板標簽中詳細講解。
四、模板替換
在進行模板輸出之前,系統還可以對渲染的模板結果進行一些模板的特殊字符串替換操作,也就是實現了模板輸出的替換和過濾。這個機制可以使得模板文件的定義更加方便,默認的替換規則有:
../Public: 會被替換成當前項目的公共模板目錄 通常是 /項目目錄/Tpl/當前主題/Public/
__TMPL__: 會替換成項目的模板目錄 通常是 /項目目錄/Tpl/當前主題/
(注:為了部署安全考慮,../Public和__TMPL__不再建議使用)
__PUBLIC__:會被替換成當前網站的公共目錄 通常是 /Public/
__ROOT__: 會替換成當前網站的地址(不含域名)
__APP__: 會替換成當前項目的URL地址 (不含域名)
__GROUP__:會替換成當前分組的URL地址 (不含域名)
__URL__: 會替換成當前模塊的URL地址(不含域名)
__ACTION__:會替換成當前操作的URL地址 (不含域名)
__SELF__: 會替換成當前的頁面URL
注意這些特殊的字符串是嚴格區別大小寫的,並且這些特殊字符串的替換規則是可以更改或者增加的,我們只需要在項目配置文件中配置TMPL_PARSE_STRING就可以完成。如果有相同的數組索引,就會更改系統的默認規則。例如:
'TMPL_PARSE_STRING' =>array( '__PUBLIC__' => '/Common', // 更改默認的/Public 替換規則 '__JS__' => '/Public/JS/', // 增加新的JS類庫路徑替換規則 '/Uploads' => '/Uploads', // 增加新的上傳路徑替換規則 )
有了模板替換規則後,頁面上所有的__PUBLIC__ 字符串都會被替換,那如果確實需要輸出__PUBLIC__ 字符串到模板呢,我們可以通過增加替換規則的方式,例如:
'TMPL_PARSE_STRING' =>array( '--PUBLIC--' => '__PUBLIC__', // 采用新規則輸出/Public字符串 )
這樣增加替換規則後,如果我們要輸出__PUBLIC__ 字符串,只需要在模板中添加--PUBLIC--,其他替換字符串的輸出方式類似。
五、總結
通過本篇的學習,我們大概掌握了如何定義模板文件和進行模板渲染輸出,以及如何賦值模板變量,後面我們將會學習如何在模板文件中使用標簽來簡化你的書寫。
PS:這裡推薦幾款本站的格式化美化工具,相信大家在以後的開發中能夠用得上:
php代碼在線格式化美化工具:
http://tools.jb51.net/code/phpformat
JavaScript代碼美化/壓縮/格式化/加密工具:
http://tools.jb51.net/code/jscompress
在線XML格式化/壓縮工具:
http://tools.jb51.net/code/xmlformat
JSON代碼格式化美化工具:
http://tools.jb51.net/code/json
在線XML/JSON互相轉換工具:
http://tools.jb51.net/code/xmljson
sql代碼在線格式化美化工具:
http://tools.jb51.net/code/sqlcodeformat
更多關於thinkPHP相關內容感興趣的讀者可查看本站專題:《ThinkPHP入門教程》、《ThinkPHP常用方法總結》、《smarty模板入門基礎教程》及《PHP模板技術總結》。
希望本文所述對大家基於ThinkPHP框架的PHP程序設計有所幫助。