以上來自維基百科XD 這篇(也許會有更多篇)不會是 #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資料夾都建好,樣板引擎就準備好了,成果就是出現這些資料夾:
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} 跑陣列迴圈顯示資料。高深的一些運算方式我都沒用到。目前寫得還算順利。
後續如果還有增加會繼續筆記!如果只是想初學,這些應該就很夠用了!
歷史上的今天
- [小說][BL] 不結束之外(12) - 2008