# 模板解析類
模板解析類可以對你視圖文件中的偽變量進行簡單的替換,它可以解析簡單的變量和變量標簽對。
如果你從沒使用過模板引擎,下面是個例子,偽變量名稱使用大括號括起來:
~~~
<html>
<head>
<title>{blog_title}</title>
</head>
<body>
<h3>{blog_heading}</h3>
{blog_entries}
<h5>{title}</h5>
<p>{body}</p>
{/blog_entries}
</body>
</html>
~~~
這些變量并不是真正的 PHP 變量,只是普通的文本,這樣能讓你的模板(視圖文件)中沒有任何 PHP 代碼。
注解
CodeIgniter?**并沒有**?讓你必須使用這個類,因為直接在視圖中使用純 PHP 可能速度會更快點。 盡管如此,一些開發者還是喜歡使用模板引擎,他們可能是和一些其他的不熟悉 PHP 的設計師共同工作。
重要
模板解析類?**不是**?一個全面的模板解析方案,我們讓它保持簡潔,為了達到更高的性能。
* [使用模板解析類](http://codeigniter.org.cn/user_guide/libraries/parser.html#id2)
* [初始化類](http://codeigniter.org.cn/user_guide/libraries/parser.html#id3)
* [解析模板](http://codeigniter.org.cn/user_guide/libraries/parser.html#id4)
* [變量對](http://codeigniter.org.cn/user_guide/libraries/parser.html#id5)
* [使用說明](http://codeigniter.org.cn/user_guide/libraries/parser.html#id6)
* [視圖片段](http://codeigniter.org.cn/user_guide/libraries/parser.html#id7)
* [類參考](http://codeigniter.org.cn/user_guide/libraries/parser.html#id8)
## [使用模板解析類](http://codeigniter.org.cn/user_guide/libraries/parser.html#id9)
### [初始化類](http://codeigniter.org.cn/user_guide/libraries/parser.html#id10)
跟 CodeIgniter 中的其他類一樣,可以在你的控制器中使用?$this->load->library()?方法加載模板解析類:
~~~
$this->load->library('parser');
~~~
一旦加載,模板解析類就可以像下面這樣使用:
~~~
$this->parser
~~~
### [解析模板](http://codeigniter.org.cn/user_guide/libraries/parser.html#id11)
你可以使用?parse()?方法來解析(或顯示)簡單的模板,如下所示:
~~~
$data = array(
'blog_title' => 'My Blog Title',
'blog_heading' => 'My Blog Heading'
);
$this->parser->parse('blog_template', $data);
~~~
第一個參數為?[視圖文件](http://codeigniter.org.cn/user_guide/general/views.html)?的名稱(在這個例子里,文件名為 blog_template.php), 第二個參數為一個關聯數組,它包含了要對模板進行替換的數據。上例中,模板將包含兩個變量: {blog_title} 和 {blog_heading} 。
沒有必要對 $this->parser->parse() 方法返回的結果進行 echo 或其他的處理,它會自動的保存到輸出類, 以待發送給瀏覽器。但是,如果你希望它將數據返回而不是存到輸出類里去,你可以將第三個參數設置為 TRUE
~~~
$string = $this->parser->parse('blog_template', $data, TRUE);
~~~
### [變量對](http://codeigniter.org.cn/user_guide/libraries/parser.html#id12)
上面的例子可以允許替換簡單的變量,但是如果你想重復某一塊代碼,并且每次重復的值都不同又該怎么辦呢? 看下我們一開始的時候展示那個模板例子:
~~~
<html>
<head>
<title>{blog_title}</title>
</head>
<body>
<h3>{blog_heading}</h3>
{blog_entries}
<h5>{title}</h5>
<p>{body}</p>
{/blog_entries}
</body>
</html>
~~~
在上面的代碼中,你會發現一對變量:{blog_entries} data... {/blog_entries} 。這個例子的意思是, 這個變量對之間的整個數據塊將重復多次,重復的次數取決于 "blog_entries" 參數中元素的個數。
解析變量對和上面的解析單個變量的代碼完全一樣,除了一點,你需要根據變量對的數據使用一個多維的數組, 像下面這樣:
~~~
$this->load->library('parser');
$data = array(
'blog_title' => 'My Blog Title',
'blog_heading' => 'My Blog Heading',
'blog_entries' => array(
array('title' => 'Title 1', 'body' => 'Body 1'),
array('title' => 'Title 2', 'body' => 'Body 2'),
array('title' => 'Title 3', 'body' => 'Body 3'),
array('title' => 'Title 4', 'body' => 'Body 4'),
array('title' => 'Title 5', 'body' => 'Body 5')
)
);
$this->parser->parse('blog_template', $data);
~~~
如果你的變量對數據來自于數據庫查詢結果,那么它已經是一個多維數組了,你可以簡單的使用數據庫的?result_array()?方法:
~~~
$query = $this->db->query("SELECT * FROM blog");
$this->load->library('parser');
$data = array(
'blog_title' => 'My Blog Title',
'blog_heading' => 'My Blog Heading',
'blog_entries' => $query->result_array()
);
$this->parser->parse('blog_template', $data);
~~~
### [使用說明](http://codeigniter.org.cn/user_guide/libraries/parser.html#id13)
如果你傳入的某些參數在模板中沒用到,它們將被忽略:
~~~
$template = 'Hello, {firstname} {lastname}';
$data = array(
'title' => 'Mr',
'firstname' => 'John',
'lastname' => 'Doe'
);
$this->parser->parse_string($template, $data);
// Result: Hello, John Doe
~~~
如果你的模板中用到了某個變量,但是你傳入的參數中沒有,將直接顯示出原始的偽變量:
~~~
$template = 'Hello, {firstname} {initials} {lastname}';
$data = array(
'title' => 'Mr',
'firstname' => 'John',
'lastname' => 'Doe'
);
$this->parser->parse_string($template, $data);
// Result: Hello, John {initials} Doe
~~~
如果你的模板中需要使用某個數組變量,但是你傳入的參數是個字符串類型,那么變量對的起始標簽將會被替換, 但是結束標簽不會被正確顯示:
~~~
$template = 'Hello, {firstname} {lastname} ({degrees}{degree} {/degrees})';
$data = array(
'degrees' => 'Mr',
'firstname' => 'John',
'lastname' => 'Doe',
'titles' => array(
array('degree' => 'BSc'),
array('degree' => 'PhD')
)
);
$this->parser->parse_string($template, $data);
// Result: Hello, John Doe (Mr{degree} {/degrees})
~~~
如果你的某個單一變量的名稱和變量對中的某個變量名稱一樣,顯示結果可能會不對:
~~~
$template = 'Hello, {firstname} {lastname} ({degrees}{degree} {/degrees})';
$data = array(
'degree' => 'Mr',
'firstname' => 'John',
'lastname' => 'Doe',
'degrees' => array(
array('degree' => 'BSc'),
array('degree' => 'PhD')
)
);
$this->parser->parse_string($template, $data);
// Result: Hello, John Doe (Mr Mr )
~~~
### [視圖片段](http://codeigniter.org.cn/user_guide/libraries/parser.html#id14)
你沒必要在你的視圖文件中使用變量對來實現重復,你也可以在變量對之間使用一個視圖片段, 在控制器,而不是視圖文件中,來控制重復。
下面是一個在視圖中實現重復的例子:
~~~
$template = '<ul>{menuitems}
<li><a href="{link}">{title}</a></li>
{/menuitems}</ul>';
$data = array(
'menuitems' => array(
array('title' => 'First Link', 'link' => '/first'),
array('title' => 'Second Link', 'link' => '/second'),
)
);
$this->parser->parse_string($template, $data);
~~~
結果:
~~~
<ul>
<li><a href="/first">First Link</a></li>
<li><a href="/second">Second Link</a></li>
</ul>
~~~
下面是一個在控制器中利用視圖片段來實現重復的例子:
~~~
$temp = '';
$template1 = '<li><a href="{link}">{title}</a></li>';
$data1 = array(
array('title' => 'First Link', 'link' => '/first'),
array('title' => 'Second Link', 'link' => '/second'),
);
foreach ($data1 as $menuitem)
{
$temp .= $this->parser->parse_string($template1, $menuitem, TRUE);
}
$template = '<ul>{menuitems}</ul>';
$data = array(
'menuitems' => $temp
);
$this->parser->parse_string($template, $data);
~~~
結果:
~~~
<ul>
<li><a href="/first">First Link</a></li>
<li><a href="/second">Second Link</a></li>
</ul>
~~~
## [類參考](http://codeigniter.org.cn/user_guide/libraries/parser.html#id15)
classCI_Parser
parse($template,?$data[,?$return = FALSE])
參數:
* **$template**?(string) -- Path to view file
* **$data**?(array) -- Variable data
* **$return**?(bool) -- Whether to only return the parsed template
返回: Parsed template string
返回類型: string
根據提供的路徑和變量解析一個模板。
parse_string($template,?$data[,?$return = FALSE])
參數:
* **$template**?(string) -- Path to view file
* **$data**?(array) -- Variable data
* **$return**?(bool) -- Whether to only return the parsed template
返回: Parsed template string
返回類型: string
該方法和?parse()?方法一樣,只是它接受一個字符串作為模板,而不是去加載視圖文件。
set_delimiters([$l = '{'[,?$r = '}']])
參數:
* **$l**?(string) -- Left delimiter
* **$r**?(string) -- Right delimiter
返回類型: void
設置模板中偽變量的分割符(起始標簽和結束標簽)。
- 歡迎使用 CodeIgniter
- 安裝說明
- 下載 CodeIgniter
- 安裝說明
- 從老版本升級
- 疑難解答
- CodeIgniter 概覽
- CodeIgniter 將從這里開始
- CodeIgniter 是什么?
- 支持特性
- 應用程序流程圖
- 模型-視圖-控制器
- 設計與架構目標
- 教程 - 內容提要
- 加載靜態內容
- 讀取新聞條目
- 創建新聞條目
- 結束語
- 常規主題
- CodeIgniter URL
- 控制器
- 保留名稱
- 視圖
- 模型
- 輔助函數
- 使用 CodeIgniter 類庫
- 創建類庫
- 使用 CodeIgniter 驅動器
- 創建驅動器
- 創建核心系統類
- 創建附屬類
- 鉤子 - 擴展框架核心
- 自動加載資源
- 公共函數
- 兼容性函數
- URI 路由
- 錯誤處理
- 網頁緩存
- 程序分析
- 以 CLI 方式運行
- 管理你的應用程序
- 處理多環境
- 在視圖文件中使用 PHP 替代語法
- 安全
- PHP 開發規范
- 類庫參考
- 基準測試類
- 緩存驅動器
- 日歷類
- 購物車類
- 配置類
- Email 類
- 加密類
- 加密類(新版)
- 文件上傳類
- 表單驗證類
- FTP 類
- 圖像處理類
- 輸入類
- Javascript 類
- 語言類
- 加載器類
- 遷移類
- 輸出類
- 分頁類
- 模板解析類
- 安全類
- Session 類
- HTML 表格類
- 引用通告類
- 排版類
- 單元測試類
- URI 類
- 用戶代理類
- XML-RPC 與 XML-RPC 服務器類
- Zip 編碼類
- 數據庫參考
- 數據庫快速入門: 示例代碼
- 數據庫配置
- 連接你的數據庫
- 查詢
- 生成查詢結果
- 查詢輔助函數
- 查詢構造器類
- 事務
- 數據庫元數據
- 自定義函數調用
- 數據庫緩存類
- 數據庫工廠類
- 數據庫工具類
- 數據庫驅動器參考
- 輔助函數參考
- 數組輔助函數
- 驗證碼輔助函數
- Cookie 輔助函數
- 日期輔助函數
- 目錄輔助函數
- 下載輔助函數
- 郵件輔助函數
- 文件輔助函數
- 表單輔助函數
- HTML 輔助函數
- 語言輔助函數
- Inflector 輔助函數
- 數字輔助函數
- 路徑輔助函數
- 安全輔助函數
- 表情輔助函數
- 字符串輔助函數
- 文本輔助函數
- 排版輔助函數
- URL 輔助函數
- XML 輔助函數
- 向 CodeIgniter 貢獻你的力量