php smarty 基礎

來源:互聯網
上載者:User

Smarty是一個使用PHP寫出來的模板PHP模板引擎,是目前業界最著名的PHP模板引擎之一。它分離了邏輯代碼和外在的內容,提供了一種易於管理和使用的方法,用來將原本與HTML代碼混雜在一起PHP代碼邏輯分離。簡單的講,目的就是要使用PHP程式員同美工分離,使用的程式員改變程式的邏輯內容不會影響到美工的頁面設計,美工重新修改頁面不會影響到程式的程式邏輯,這在多人合作的項目中顯的尤為重要。

什麼是PHP模板?

該如何使我的PHP指令碼從設計中獨立出來?這無疑地是在PHP郵件清單上所提問的最多的問題之一。雖然PHP被標榜為“HTML嵌入式語言”,在寫過許多PHP和HTML混合式的工程之後,我產生了一個分離表單和內容的想法。而且,在許多公司裡規劃設計者的角色和程式設計者是分開的。於是,這樣的一個模板解決方案產生了……

例如在一個公司,一個應用程式的開發流程如下:在提交計劃文檔之後,介面設計者[美工]製作了網站的外觀模型,然後把它交給背景程式員。程式員使用PHP 實現商業邏輯,同時使用外觀模型做成基本架構。然後工程被返回到HTML頁面設計者繼續完善。就這樣工程可能在背景程式員和頁面設計者之間來來回回好幾次。由於背景程式員不喜歡幹預任何有關HTML標籤,同時也不需要美工們和PHP代碼混在一起;美工設計者只需要設定檔,動態區塊和其他的介面部分,不必要去接觸那些錯綜複雜的PHP代碼。因此,這時候有一個很好的模板支援就顯得很重要了。

縱觀現今存在的許多PHP模板解決方案(比如PHPLIB),大多數都只是提供了用模板取代變數和將動態區塊的功能有限的格式化的基本方法。但是我們的需求比這個要高的多。我們完全不想要PHP程式員去設計HTML 頁面,可是這又是不可避免的。例如:如果美工想要在動態區塊之間交替不同的背景顏色,他就可能得和程式員預先說好。同樣,美工們也應該有自己對於頁面設計的設定檔,這同樣可以通過變數把他們拉到模板裡邊去。

Smarty的誕生

早在1999年後期,我們就已經開始為模板引擎寫說明文檔。在完成這個文檔之後,我們開始用C寫一個模板引擎,並有希望被包含到PHP裡去。在撞上了許多的技術難題的同時,“什麼是模板應該做的,什麼不該做”這個問題,也被熱烈的討論著。從這些經驗,我們決定應該用PHP將模板引擎寫成一個類,讓任何覺得合適的人使用它。所以我們寫了一個引擎,從此就有了Smarty。(註:這個類以前從來沒有公開發表過)。這個類幾乎達到了我們所有的要求:常規變數替換,支援包括其他模板,使用設定檔整合設定,嵌入PHP代碼,限制'if'語句的作用,還有更多的可以多層嵌套的健壯的動態區塊。它用常規運算式做到這一切,於是代碼變得相當令人費解。在每次調用的時候,都要去解析那些文法和常規運算式,於是在大型應用的時候,它顯然慢了下來。在程式員的眼光看來,最大的問題還是使用PHP指令碼建立和處理模板和動態區塊的所有必要工作。我們應該如何使他變得更簡單?

我們可以想象Smarty應該有怎樣的最後表現。我們知道PHP代碼如果沒有了模板解析的開銷將有多快,我們也知道從一般的美工看來PHP語言是多麼的“恐怖”,然而這一切可以被一種更簡單的模板文法掩飾掉。我們應該怎樣把這兩種方法的長處結合起來?

於是,Smarty誕生了……

Smarty優點

1. 速度:採用Smarty編寫的程式可以獲得最大速度的提高,這一點是相對於其它的模板引擎技術而言的。

2. 編譯型:採用Smarty編寫的程式在運行時要編譯成一個非模板技術的PHP檔案,這個檔案採用了PHP與HTML混合的方式,在下一次訪問模板時將WEB請求直接轉換到這個檔案中,而不再進行模板重新編譯(在來源程式沒有改動的情況下)

3. 緩衝技術:Smarty選用的一種緩衝技術,它可以將使用者最終看到的HTML檔案快取成一個靜態HTML頁,當設定Smarty的cache屬性為true時,在Smarty設定的cachetime期內將使用者的WEB請求直接轉換到這個靜態HTML檔案中來,這相當於調用一個靜態HTML檔案。

4. 外掛程式技術:Smarty可以自訂外掛程式。外掛程式實際就是一些自訂的函數。

5. 模板中可以使用if/elseif/else/endif。在模板檔案使用判斷語句可以非常方便的對模板進行格式重排。

不適合使用Smarty的地方

1. 需要即時更新的內容。例如像股票顯示,它需要經常對資料進行更新,導致經常重新編譯模板,所以這類型的程式使用Smarty會使模板處理速度變慢。

2. 小項目。小項目因為項目簡單而美工與程式員兼於一人的項目,使用Smarty會在一定程度上喪失PHP開發迅速的優點。

Smarty簡明教程

一. 安裝     
首先開啟網頁http://smarty.php.net/download.php,下載最新版本的Smarty。解壓下載的檔案(目錄結構還蠻複雜的)。接下來示範給大家一個安裝執行個體,看過應該會舉一反三的。
    (1) 在根目錄下建立了新的目錄learn/,再在learn/裡建立一個目錄smarty/。將剛才解壓縮出來的目錄的libs/拷貝到smarty/裡,再在smarty/裡建立templates目錄,templates裡建立cache/,templates/,templates_c/, config/.


    (2) 建立一個模板檔案:index.tpl,將此檔案放在learn/smarty/templates/templates目錄下,代碼如下:
Copy code<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">          建立index.php,將此檔案放在learn/下:
Copy code<?php//引用類檔案require 'smarty/libs/Smarty.class.php';$smarty = new Smarty;//設定各個目錄的路徑,這裡是安裝的重點$smarty->template_dir ="smarty/templates/templates";$smarty->compile_dir ="smarty/templates/templates_c";$smarty->config_dir = "smarty/templates/config";$smarty->cache_dir ="smarty/templates/cache";//smarty模板有快取的功能,如果這裡是true的話即開啟caching,但是會造成網頁不立即更新的問題,當然也可以通過其他的辦法解決$smarty->caching = false;$hello = "Hello World!";//賦值$smarty->assign("hello",$hello);//引用模板檔案$smarty->display('index.tpl');?>

(3) 執行index.php就能看到Hello World!了。

二. 賦值       

在模板檔案中需要替換的值用大括弧{}括起來,值的前面還要加$號。例如{$hello}。這裡可以是數組,比如{$hello.item1},{$hello.item2}…       
而PHP源檔案中只需要一個簡單的函數assign(var , value)。       
簡單的例子:       
*.tpl:
        Hello,{$exp.name}!Good {$exp.time}

        *.php:
        $hello[name]= “Mr. Green”;

        $hello[time]=”morning”;       
        $smarty->assign(“exp”,$hello);       
        output:
        Hello,Mr.Green!Good morning

三. 引用       
網站中的網頁一般header和footer是可以共用的,所以只要在每個tpl中引用它們就可以了。       
樣本:*.tpl:
        {include file="header.tpl"}

        {* body of template goes here *}

        {include file="footer.tpl"}

四. 判斷

模板檔案中可以使用if else等判斷語句,即可以將一些邏輯程式放在模板裡。"eq","ne", "neq", "gt", "lt","lte", "le", "gte"    "ge","is even", "is odd", "is not even", "is notodd", "not", "mod", "div by", "evenby", "odd by","==","!=",">","<","<=",">="這些是if中可以用到的比較。看看就能知道什麼意思吧。

        樣本:
        {if $name eq"Fred"}

        WelcomeSir.

        {elseif $name eq"Wilma"}

        WelcomeMa'am. 


       
        Welcome,whatever you are.

        {/if}
五. 迴圈       

在Smarty裡使用迴圈遍曆數組的方法是section,如何賦值遍曆都是在模板中解決,php源檔案中只要一個assign就能解決問題。       
樣本:
{* this examplewill print out all the values of the $custid array *}

{sectionname=customer loop=$custid}

id: {$custid[customer]}<br>
{/section}
OUTPUT:
id: 1000<br>id: 1001<br>id: 1002<br>

六. 常見問題       
Smarty將所有大括弧{}裡的東西都視為自己的邏輯程式,於是我們在網頁中想插入javascript函數就需要literal的幫忙了,literal的功能就是忽略大括弧{}。       
樣本:Copy code                <scriptlanguage=javascript>              function isblank(field) {                        if (field.value == '')                                { return false; }                        else                                {                                document.loginform.submit();                                return true;                                }              }        </script>{/literal}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.