前面我們制作了一個留言本程序。不過因為用了和多echo來輸出HTML,代碼看起來很亂,而且這樣修改起來也比較麻煩。所以本章我們介紹Smarty模板引擎技術,同時把我們的留言本程序也變成應用Smarty模板的程序;還可以做到挺有意思的換皮膚功能。
?[guestbook6[1].rar](http://www.speedphp.com/forum.php?mod=attachment&aid=NzIyfDA5YjA1NjIyfDE0NDUyNDM3MTZ8NjMwOXwzNzIw)?(22.41 KB, 下載次數: 1629)?
PHP模板引擎技術是一種將HTML模板與PHP代碼分離的技術,同時它提供了簡單的模板語法和數據傳遞的機制,使得我們可以更為簡便和安全地進行開發。
Smarty由PHP官方出品,是目前最成熟也是最廣泛使用的PHP模板引擎技術。
首先,我們要在根目錄中建立tpl(模板文件目錄)和tmp(臨時文件目錄),然后在index.php中配置一下:
~~~
<?php
define("SP_PATH", dirname(__FILE__) . "/SpeedPHP");
define("APP_PATH", dirname(__FILE__) . "/guestbook");
$spConfig = array(
"db" => array(
'host' => 'localhost',
'login' => 'root',
'password' => '',
'database' => 'teach'
),
'view' => array(
'enabled' => TRUE, // 開啟Smarty
'config' => array(
'template_dir' => APP_PATH . '/tpl', // 模板存放的目錄
'compile_dir' => APP_PATH . '/tmp', // 編譯的臨時目錄
'cache_dir' => APP_PATH . '/tmp', // 緩存的臨時目錄
'left_delimiter' => '<{', // smarty左限定符
'right_delimiter' => '}>' // smarty右限定符
)
)
);
require(SP_PATH . "/SpeedPHP.php");
spRun(); // SpeedPHP 3新特性
?>
~~~
我們加入了view的配置,這樣就可以使用smarty進行模板的開發了。同時我們將main.php去除了查看內容的頁面,讓內容和標題都在同一頁面顯示。
~~~
<?php
class main extends spController
{
function index() // 這里是首頁
{
$guestbook = spClass("guestbook");
$this->results = $guestbook->findAll(); // 用$this->results可以將$guestbook->findAll()的值發送到模板上面,模板上可以用$results來使用該值。
$this->display("white/index.html"); // 顯示模板,這里使用的模板是根目錄/tpl/green/index.html。
}
function write() // 這里是留言
{
$guestbook = spClass("guestbook");
$newrow = array( // 這里制作新增記錄的值
'name' => $this->spArgs('name'),
'title' => $this->spArgs('title'), // 從spArgs獲取到表單提交上來的title
'contents' => $this->spArgs('contents')
);
$guestbook->create($newrow);
echo "留言成功,<a href=/index.php>返回</a>";
}
}
?>
~~~
我們下載了留言本的模板后,放到tpl目錄下:

瀏覽一下,我們的留言本已經變成了一個白色的留言本了。
> 在日常的團隊開發工作中,頁面模板首先是由美工人員制作出頁面圖,然后由前端網頁設計人員來根據頁面圖來進行模板的制作,程序員主要的工作是將模板及PHP程序對接。當然很多情況下網頁設計人員和程序員是同一個人,網頁設計人員主要的技能要求有:1.使用DREAMWEAVER等工具進行網頁設計能力。2.能手寫基本的HTML代碼。3.初步了解Smarty。4.熟悉JavaScript,Flash等相關的前端技術。
所以在我們的sp框架的教程中,頁面模板已經都是準備好的,至少是完整的頁面(但不包括Smarty代碼),這樣可以讓大家更專注于學習PHP開發。當然我們也將陸續推出一些關于前端網頁設計等相關技術的教程,供大家參考學習。
下面我們來學習一下怎么寫Smarty模板,打開tpl/white/index.html看看:
~~~
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn" lang="zh-cn">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>白色留言本</title>
<link href="guestbook/tpl/white/css.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="main">
<h1><a href="#"><span>我的白色留言本</span></a></h1>
<div class="boxin">
<h2 class="tutor">請填寫您的留言</h2>
<form action="<{spUrl c=main a=write}>" method=POST>
<p>您的名字:<input type=text name='name' size=40></p>
<p>留言標題:<input type=text name='title' size=40></p>
<p>留言內容:</p>
<p><textarea name=contents cols=60 rows=6></textarea></p>
<p><input type=submit value=" 提交 "></p>
</form>
<ul class="list">
<{foreach from=$results item=one}>
<li><span><{$one.name}></span><a href="#"><{$one.title}></a>
<{$one.contents}></li>
<{/foreach}>
</ul>
</div>
</div>
<div id="footer" style="clear:both;">
<select name="選擇模板" onchange="location.href=this.options[this.selectedIndex].value;"><option> 模板選擇...</option>
<option value="/?tpl=green">綠色風格</option><option value="/?tpl=blue">藍色風格</option><option value="/?tpl=green2">綠色風格2</option><option value="/?tpl=white">白色風格</option></select>
</div>
</div>
</body>
</html>
~~~
我們可以分開兩部分進行了解,首先是表單部分:
~~~
<form action="<{spUrl c=main a=write}>" method=POST>
<p>您的名字:<input type=text name='name' size=40></p>
<p>留言標題:<input type=text name='title' size=40></p>
<p>留言內容:</p>
<p><textarea name=contents cols=60 rows=6></textarea></p>
<p><input type=submit value=" 提交 "></p>
</form>
~~~
表單部分使用了spUrl來制作一個表單提交的地址:
" method=POST>
我們在瀏覽器上面右鍵看源代碼,就可以看到:
也就是會生成地址:/index.php?c=man&a=write。
然后是循環輸出留言記錄部分:
~~~
<ul class="list">
<{foreach from=$results item=one}>
<li><span><{$one.name}></span><a href="#"><{$one.title}></a>
<{$one.contents}></li>
<{/foreach}>
</ul>
~~~
這里使用了來循環$results,以輸出name,title和contents幾個值。
我們看看生成源代碼的結果:
~~~
<ul class="list">
<li><span>jake</span><a href="#">我是標題</a>
哈哈</li>
<li><span>喜羊羊</span><a href="#">我是標題</a>
333</li>
</ul>
~~~
以上我們初步了解了sp框架應用Smarty模板技術的方法以及模板的基礎寫法,下面我們在代碼上面修改一下,讓程序變得更有趣。
main.php
~~~
<?php
class main extends spController
{
function index() // 這里是首頁
{
$tpl = $this->spArgs("tpl", "green"); // 這里接收tpl參數,使得模板變化,后面的green是tpl為空時的默認值。
$guestbook = spClass("guestbook");
$this->results = $guestbook->findAll();
$this->display("{$tpl}/index.html");
}
function write() // 這里是留言
{
$guestbook = spClass("guestbook");
$newrow = array( // 這里制作新增記錄的值
'name' => $this->spArgs('name'),
'title' => $this->spArgs('title'), // 從spArgs獲取到表單提交上來的title
'contents' => $this->spArgs('contents')
);
$guestbook->create($newrow);
echo "留言成功,<a href=/index.php>返回</a>";
}
}
?>
~~~
我們用spArgs來接收一個叫tpl的參數,它默認是green,也就是獲取green目錄下的模板。如果這參數變成了blue,那么就是獲取blue目錄下的模板了,這樣我們的留言本就可以換皮膚了。當然我們已經在模板上面加上了一個下拉選擇來讓訪問者選擇模板,這里我們提供了四套模板。
> “$this->名稱 = 值”的模板賦值方式,是使用PHP5的新特性——魔術函數來實現的。但是已定義控制器屬性的變量,是不具備傳值到模板的功能,請注意。