作者 主題: Smarty樣板引擎簡介  (閱讀 9031 次)

0 會員 與 1 訪客 正在閱讀本文。

ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
Smarty樣板引擎簡介
« 於: 2004-07-09 14:07 »
開發php程式免不了的要跟html綁在一起
但是把html跟php寫在一起就不是個很好的做法
如果網頁版面常常需要變動時
版面一調整php程式碼可能也得跟著大變動
如此一來程式碼的使用率可能就不太好了
況且美工跟程式人員可能天天為了整合的問題在大傷腦筋
因此樣板系統就誕生了
Smarty就是一套專門為php打造的一套樣板引擎
可以讓php歸php html歸html讓程式員不用再為了排版問題大傷腦筋
好了廢話不多說讓我們來看看如何使用這套樣板引擎吧

安裝過程很簡單
http://smarty.php.net抓取最新的Smarty
代碼: [選擇]

tar zxvf Smarty-2.6.2.tar.gz
解開後在Smarty的目錄下會有一個libs目錄
cp libs  /usr/lib/Smart
mkdir /tmp/smarty.tmp
chmod 1777 /tmp/smarty.tmp   <-用來擺放Smarty產生的cache資料
編輯 /usr/lib/Smart/ Smarty.class.php
把 var $compile_dir     =  xxxx
改成 var $compile_dir     =  /tmp/smarty.tmp
最後
在php.ini裡面
include_path 加上 /usr/lib/Smarty
這就ok啦

再來就是如何使用了

我們就用個簡單的成功或失敗的網頁來做說明吧

代碼: [選擇]

success.htm
<html>
<head>
<title>成功</title>
</head>
<body>
  使用者帳號{$User}登入成功
</body>
</html>

代碼: [選擇]

fail.htm
<html>
<head>
<title>失敗</title>
</head>
<body>
  使用者帳號{$User}密碼{$Password}登入失敗
</body>
</html>

代碼: [選擇]

login.php
<?php
 
require_once&#40;"Smarty/Smarty.class.php"&#41;;
 
$tpl=new Smarty;
 
$tpl->template_dir="templates";  //告訴Smarty樣板檔擺在哪編
 
if&#40;&#40;$_POST['User']=="ricky"&#41;&&&#40;$_POST['Password']=="ilovericky"&#41;&#41;
 
{
  
$tpl->assign&#40;"User",$_POST['User']&#41;;
  
$tpl->display&#40;"success.htm"&#41;;    //顯示success.htm
 
}
 else
 {
  
$tpl->assign&#40;"User",$_POST['User']&#41;;
  
$tpl->assign&#40;"Password",$_POST['Password']&#41;;
  
$tpl->display&#40;"fail.htm"&#41;;     //顯示fail.htm
 
}
?>


輸入User -> 'ricky' Password->'ilovericky'
輸出結果
代碼: [選擇]

<html>
<head>
<title>成功</title>
</head>
<body>
  使用者帳號ricky登入成功
</body>
</html>

輸入User -> 'hacker' Password->'i am a hacker!!'
輸出結果
代碼: [選擇]

<html>
<head>
<title>失敗</title>
</head>
<body>
  使用者帳號hacker密碼i am a hacker!!登入失敗
</body>
</html>

html檔裡面的{$XXXX}就是樣板變數
當smarty在解譯的時候遇到{$XXXX}就會尋找相對應的XXXX變數去取代掉
指定變數就是靠
$tpl->assign(變數名稱,變數內容);
最最最重要的$tpl->display("xxxx");
作用就是用來將指定的樣板輸出拉
以上只是簡單的介紹Smarty
事實上Smarty能做的還不只這樣
可以在樣板檔宣告巢狀的區塊
使用if條件式動態的決定要不要輸出某個欄位
甚至在一個樣板檔內引入另一個樣板檔
以後有機會再詳細的介紹Smarty強大的功能
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

craig

  • 懷疑的國中生
  • **
  • 文章數: 69
    • 檢視個人資料
Smarty樣板引擎簡介
« 回覆 #1 於: 2004-07-09 22:48 »
最近剛好用過 Smarty,
真的,雖然這個一開始會覺得太大,有點複雜。
可是,把程式的邏輯跟畫面的部份分開處理真的是方便太多了,
不會有以前那種一邊寫程式一邊又要考慮處理畫面的情況,
還真的有相見恨晚的感覺。

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
Smarty樣板引擎簡介
« 回覆 #2 於: 2004-07-10 23:58 »
其實我對他的  <section> 還是搞不太懂怎麼用...
等我對台灣的網路品質快一點的時候在來試

craig

  • 懷疑的國中生
  • **
  • 文章數: 69
    • 檢視個人資料
Smarty樣板引擎簡介
« 回覆 #3 於: 2004-07-11 18:50 »
引述: "梁楓"
其實我對他的  <section> 還是搞不太懂怎麼用...
等我對台灣的網路品質快一點的時候在來試

{section} 是設計來處理 array 資料用的,
不過有時用 {foreach} 會比較好。
至於...怎麼測試還要等網路品質好呢?
這麼簡單的東西,我想,等你有空試應該會快就會用了,
呵呵,我就不班門弄斧了。

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
Smarty樣板引擎簡介
« 回覆 #4 於: 2004-07-12 09:15 »
1. 用是很久以前就會用了,不過... 都是try&error 出來的,我還不太確定用法正不正確。
2. 要連台灣的網站找資料啊 ,大陸的連線品質有點可怕... 而且速度超慢...

ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
Smarty樣板引擎簡介
« 回覆 #5 於: 2004-07-12 16:08 »
那我簡單的說明一下{section}用法好了
{section}{/section}主要是用在巢狀迴圈
舉個簡單例子
引用

test.htm
<!--
注意這邊的 List代表的是這一層section
$ListCount是表示這個section要跑幾次他是一個變數別忘了前面'$'
{section name=List loop=$ListCount}
-->
 這是Data1:{$Data1
    }<br>
     這是Data2:{$Data2
      }<br>
      <!-- {/section} -->

引用

test.php
require_once("Smarty/Smarty.class.php");
$tpl=new Smarty;
$tpl->template_dir="templates";  //告訴Smarty樣板檔擺在哪編
$datacount=10;
for($i=0;$i<$datacount;$i++)
{
 $Data1[$i]="Data1_".$i;
 $Data2[$i]="Data2_".$i;
}
$tpl->assign("ListCount",$datacount);  //指定section要跑10次
$tpl->assign("Data1",$Data1);   //指定Data1
$tpl->assign("Data2",$Data2);   //指定Data2
$tpl->display("test.htm");
?>

引用

輸出
 這是Data1:Data1_0
 這是Data2:Data2_0
 這是Data1:Data1_1
 這是Data2:Data2_1
 這是Data1:Data1_2
 這是Data2:Data2_2
 這是Data1:Data1_3
 這是Data2:Data2_3   ......


巢狀式的section也很簡單
引用

test.htm
{section name=ListI loop=$LoopCountI}
{section name=ListJ loop=$LoopCountJ[ListI]}   <-這邊的LoopCountJ是一個array
 data {$Data[ListI][ListJ]}                                 <Data是一個二維的array
{/section}
{/section}

引用

test.php
<?php
require_once("Smarty.class.php");
$tpl=new Smarty;
$tpl->template_dir="./";
for($i=0;$i<5;$i++)
{
 $LoopCountJ[$i]=5;
 for($j=0;$j<5;$j++)
 {
  $Data[$i][$j]="[$i][$j]";
 }
}
$tpl->assign("LoopCountI","5");
$tpl->assign("LoopCountJ",$LoopCountJ);
$tpl->assign("Data",$Data);
$tpl->display("test.htm");
?>

引用

輸出
                                                                               
 data
  • [0]

 data
  • [1]

 data
  • [2]

 data
  • [3]

 data
  • [4]

                                                                               
 data [1][0]
 data [1][1]
 data [1][2]
 data [1][3]
 data [1][4]
                                                                               
 data [2][0]
 data [2][1]
 data [2][2]
 data [2][3]
 data [2][4]
                                                                               
 data [3][0]
 data [3][1]
 data [3][2]
 data [3][3]
 data [3][4]
                                                                               
 data [4][0]
 data [4][1]
 data [4][2]
 data [4][3]
 data [4][4]

section的用法大致上就是這樣
有問題的話大家可以提出來互相研究研究吧
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
Smarty樣板引擎簡介
« 回覆 #6 於: 2004-07-12 17:05 »
講實話...
就是因為這些很正式的寫法
反而讓我不太能理解 haha...
 
努力用比較簡單的方式想怎麼表達中..

jaceju

  • 憂鬱的高中生
  • ***
  • 文章數: 106
    • 檢視個人資料

868nic

  • 懷疑的國中生
  • **
  • 文章數: 34
    • 檢視個人資料
Smarty樣板引擎簡介
« 回覆 #8 於: 2005-01-25 14:59 »
請問smarty對於functions的用法為何?

我找了好久都沒找到相關教學

有沒有好心人指點一下,謝謝!

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
Smarty樣板引擎簡介
« 回覆 #9 於: 2005-01-25 16:35 »
引述: "868nic"
請問smarty對於functions的用法為何?

我找了好久都沒找到相關教學

有沒有好心人指點一下,謝謝!


對於什麼 function ?....
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

868nic

  • 懷疑的國中生
  • **
  • 文章數: 34
    • 檢視個人資料
Smarty樣板引擎簡介
« 回覆 #10 於: 2005-01-26 15:35 »
引述: "Darkhero"
引述: "868nic"
請問smarty對於functions的用法為何?

我找了好久都沒找到相關教學

有沒有好心人指點一下,謝謝!


對於什麼 function ?....


自訂的function

例iif()

ethanliu

  • 懷疑的國中生
  • **
  • 文章數: 41
    • 檢視個人資料
    • http://www.creativecrap.com
Re: Smarty樣板引擎簡介
« 回覆 #11 於: 2005-01-29 12:50 »
引述: "ricky"
可以讓php歸php html歸html讓程式員不用再為了排版問題大傷腦筋


隨著 Smarty 的功能越來越多,也就越來越偏離 template 系統的這個出發點
反而會有一種,不知道要把這一段的結果,以程式處理 配合簡單的 tpl 輸出
還是簡單的程式處理,配合 Smarty tpl 的語法輸出
tpl 擺了一堆的 {section} {foreach} 等等這東西,反而有程式要寫兩遍的感覺
所以我還是不習慣他

sich

  • 可愛的小學生
  • *
  • 文章數: 5
    • 檢視個人資料
Smarty樣板引擎簡介
« 回覆 #12 於: 2005-02-01 14:27 »
phpBB 也有自己的 Template class, 功能好像簡單一些.

我的網站是用 PHP-Nuke 7 架的, 而它又內建 phpBB 2, 所以都直接取用這個 template class.
icrosoft Windows 2000 Server SP4
IIS 5.0, .NET 1.1, PHP 4.3.10, MySQL 4.1.8