Smarty 的筆記

Smarty 以在文件中放置特殊的「 Smarty 標籤」來產生網頁內容。這些標籤會被處理並替換成其他的內容。 標籤是給Smarty的指令符,以模板定界符包住。這些指令符可以是變數,以$符號代表函數、邏輯或 流程控制語法。

Smarty允許PHP 程式設計師以Smarty 標籤去定義可存取的函數。 Smarty意圖簡化區域化,允許PHP網頁後端邏輯與表現層(即使用者介面)分離。理想的情況下,這將降低軟體維護費用和人力。在這個研發策略之下,設計師可專注於實現表現層而不用撰寫PHP程式碼,並允許 #PHP 程式設計師抽離出表現層並專注實現後端邏輯。

以上來自維基百科XD 這篇(也許會有更多篇)不會是 #Smarty 的教學,而是把這次研究跟實作的部分做一些筆記,好給未來的自己看。

官方網站:Smarty 

我學習 PHP 其實就是利用網路資源。當年就只是想能自己改論壇的一些設置,所以開始慢慢地看懂PHP在幹嘛(嗯?我 CGI 好像也是這樣學起來的XDD)  所以我不算是有系統的學,當然也就是用範例開始慢慢刻。

眾所周知(?),PHP基本上跟以前的 ASP 一樣,程式跟版面語法混在一起。我覺得混在一起的做法,也不是太麻煩的事情,我一樣可以把版面切很多塊,每一塊都是一個檔案(程式動作+版面),然後組合起來就是大版面。但這種寫法的缺點就是:後續維護還有改版就會變得很麻煩!

這次因為時間關係沒寫成 Blsoso 的程式,但有被激發修改自己原本的書評程式。既然要來重改,當然就是要想辦法把 PHP 跟 版面給分開,這樣就算未來要改版,就可以少很多步驟。(目前就是混寫的方法,要改版面等於重寫)

網路上查詢了這樣子的樣板系統,看到不少人推薦的是 Smarty,於是就來研究了。這個引擎是屬於有自己模板語法的,也就是 PHP 只負責把資料甚麼都準備好,全部餵給樣版上的變數,要不要顯示,是不是迴圈顯示就是樣板決定了。但因為每次要用到語法的時候就得翻網路,所以乾脆自己做一下紀錄XD


下載、安裝

下載網址:官方下載
環境需求:Smarty 3.x: PHP 5.2+   Smarty 2.x: PHP 4 or 5

基本上現在網頁空間大多支援到 PHP 7+ 了,所以基本上都是可以使用的。(為了寫這篇去下載官網檔案,結果發現自己使用的是 2.3…不是 2 的最後版本也不是 3 的版本XD 我來思考要不要趁還沒全部寫完來更新一下XD)

解壓縮之後有個 lib 資料夾,這個請直接複製到網站的目錄下(要不要更名都可,自己知道就好XD),然後在 php 中 include Smarty.class.php

除了這個之外,要放樣版檔案所以你要有個 templates資料夾。因為然後編譯的時候需要的 templates_c、cache資料夾都建好,樣板引擎就準備好了,成果就是出現這些資料夾:

資料夾結構(smarty相關)
lib <– Smarty 程式
templates <– 放樣板檔案的資料夾
templates_c <– 編譯後的檔案存放處(上網站空間記得改成755)
cache <– 快取資料夾(也是改成755)

我自己是這樣就能動了。有些教學網站還會多一個 config 資料夾,但我沒有特別這樣使用。

後端使用

在 PHP 中使用 Smarty,就是先初始化Smarty,然後就是塞值進去,然後顯示,結束。就是要把所有的資料準備好塞就對了,前端的顯示交給樣板去決定。

// include smarty 的主要檔案
include "class/Smarty.class.php";
// 初始
$tpl = new Smarty();
// 塞值  assign(變數名稱, 值);
$tpl->assign("title", "測試用的網頁標題");
// 顯示  display(樣板名稱)
$tpl->display("index.tpl");

這樣就可以用了,很簡單吧!

基本上塞值的部分,型別並沒有特別,我目前使用最多的就是塞 string 跟 array。
array 的塞法也一樣就:

$arrayData = array();

$tpl->assign("arrayData",$arrayData);

這樣就行了。除了這個之外,就都是 php 自己的語法,這我就不介紹了(因為我自己也還是初學者XD)

前端樣板使用

這部分才是我想要做這個筆記的地方~~ 覺得有些未來應該就會忘記的語法想記錄下來XD
官網的說明檔案也很清楚:連結

樣板檔名

樣板的檔名其實可以自己設定,我就普通的使用 .tpl ,或是直接方便修改也是可以用 .html 。但因為反正我都是用純文字做修改,所以就無所謂檔名,如果是需要用網頁編輯器來做的話也可以直接使用 .html。

樣板內容

除了要顯示的變數之外,其餘的就是跟一般寫網頁一樣。所以偷懶的方法可以先去網路上找喜歡的樣板,下載下來之後進行修改。

樣板使用語法

下面列的就是屬於我自己要記的筆記,常用的有用過的都記錄起來,給以後自己重新改寫的時候不至於又看不懂XD

顯示值

顯示用的變數就是後端塞入的那個名稱,然後固定使用 {$變數名稱} 來做顯示。

比如說如上塞的是 title,要在樣板中顯示的時候就是:{$title}

這樣編譯的時候就會把塞入的值直接顯示出來。

其他的顯示方法可以參考官網說明

利用 if 判斷

在 smarty 模板中可以利用 if else 來判斷值有沒有內容,或是切換顯示不同資料。這時候可以用 if else 來判斷。

{if $title != ""} 
顯示標題:{$title} 
{else}
沒有標題內容可以顯示
{/if}

看上面的例子可以知道,就是一般程式語言的格式,只是 smarty 都是要用 {} 包起來讓引擎知道這是用作語法用的。

smarty 語法跟一般語法一樣,都要有開就要有關,有 {if},就一定要有 {/if}

一開頭的判別就跟 php 本身一樣 ==、!= 使用。

數字對比

從上面的例子可以知道,傳遞值到樣板的時候並沒有指定形式,所以當要使用比對大小(數字)的時候就會需要轉換。

在 smarty 中的轉換是 {$變數|轉換成的格式} ,中間有個 | 符號。比如說要把變數 arrayCount 轉成整數,就是要寫成 {$arrayCount|intval} (關於格式請參照官網說明)

我比較常用到這個,因為迴圈的時候需要使用。看說明也可以轉成大寫小寫等等的。

使用迴圈

像這次改寫書評網站,在這網站中除了資料顯示外,第一頁就是出現把好幾百本的書用卡片的格式顯示出來。php 語法混寫的話,就是直接 php 語法包 html 語法。但要改版的話就幾乎是重寫,畢竟改版可能不只卡片改,連顯示等等的都要改。但 smarty 的話,迴圈就用 smarty 寫,雖然也是有包語法的感覺在,但把判別減少的話,修改起來也沒那麼吃力。

我使用的是 {section} {/section}。有點像是 for 的用法。

拿我自己的例子,bookData 是個 array,每一個資料需要做顯示,那就會這樣寫:

// name 是迴圈計算的名稱 loop 後面帶陣列資料。可以加 step
{section name=i loop=$bookData}

<div>

<p> 標題:{$bookData[i].title}</p>

<p> 內容:{$bookData[i].content}</p>

</div>

{/section}

搭配有 key 值得 array 來顯示非常的方便!也有限制跑第幾到第幾筆的設定,這個就請大家參考文件,我用最多的就是這個。

講到迴圈,如果我需要知道這個迴圈有多少個內容,而又不想用塞值的方式,可以用下面這個運算

{$arrayData|@count} 這樣就可以知道有多少個,不用改 php 也可以達到XD


 

其實我使用的就這些,用 {if} {else} 來判斷(比如說要顯示登入與否不一樣的內容),用 {section} 跑陣列迴圈顯示資料。高深的一些運算方式我都沒用到。目前寫得還算順利。

後續如果還有增加會繼續筆記!如果只是想初學,這些應該就很夠用了!

歷史上的今天

guest
0 Comments
Inline Feedbacks
View all comments