模板引擎smarty工作原理以及使用樣本_PHP教程

來源:互聯網
上載者:User
模板引擎是用於把模板檔案和資料內容合并在一起的程式,便於網站開發有利於代碼分離和維護,瞭解一個模板最好知道其工作原理,以便於實現一通萬通。

模板檔案一般是HTML xml js等類型檔案,如果不用模板引擎若要把資料顯示在網頁上,我們需要在php中輸出HTML,而使用模板則只要把資料交給模板引擎程式即可,然後告訴它用哪個模板檔案,自然就會把資料和頁面結合以後返回或輸出,模板至少有以下功能1.把資料提供給模板引擎的功能。2.指定模板的功能。3.輸出結果的功能。一般來說為了方便程式員們使用模板引擎,開發人員都會把它的功能在一定程度上封裝起來,封裝成一個類,執行個體化之後得到一個對象,即模板引擎對象,一個對象有其屬性和方法,smarty對象的屬性和方法在smarty手冊上尋找,首先說說其方法,assign 把資料提交給模板的方法。沒有單獨的指定模板檔案的方法已經合并到輸出的方法中,輸出的方法有兩個 display 直接輸出 fetch 返回合并好的HTML代碼,對於輸出我們主要用到的是assign 因為我們顯示的資料往往是多樣性的,可能是一個量,可能是一個數組量也可能是多維陣列,在不同的情況下應該如何正確提交給smarty是一個問題,提交後如何對應顯示也是個問題,smarty引擎使用的解釋方法是先把HTML檔案轉化為php檔案,然後在賦值各個量,並且執行這個php檔案,對應不同的資料格式,它有一套固定的書寫方式,需要我們用這種書寫方式在模板檔案上做對應的標記,smarty預設使用的模板標記符是一對{},比如{$a}這個標記等效於echo $a;在php中我們需要有對應的賦值過程,$smarty->assign("a","值");如果我們有多個量進行賦值,一個個這樣寫就很麻煩,smarty為我們考慮了這一點,例如我們從資料庫裡讀出一個文章,要顯示在頁面的內容有標題內容作者時間,資料結構大體是這樣的

複製代碼 代碼如下:
array([id]=>1,['title']=>"標題",…);

我們的模板需要有幾個對應的標記,例如

複製代碼 代碼如下:

{$title}


{$content}

一個個賦值太麻煩,assign方法支援數組直接賦值,$rows = 從資料庫讀出的據,

$smarty->assign($rows);smarty就會取資料索引自動一一賦值,但是這個時候為了避免引起變數衝突,我們希望還是直接以數組形式賦值呢,例如

複製代碼 代碼如下:
$rows = 從資料庫讀出的據,
$smarty->assign("rows",$rows);

如果此時我們在模板的標記是{$rows} 那輸出的時候我們只能看到array 正如php裡面直接echo數組一樣,在php輸出具體量是echo $rows['title'];smarty規定的符號是一個點號,{$rows.title},用這種方式類似於

複製代碼 代碼如下:
echo $rows['title']

每種模板有其對應的書寫規則,接下來如果要顯示的是一個文章列表呢,假設mysql給我們返回了10條資料,10條資料都要顯示出來,而且他們的索引肯定完全相同,根據編程思路知道結果求過程,假設顯示如下

複製代碼 代碼如下:


  • 1111

  • 222

  • 333

  • 4444


如果這是我們希望輸出的樣子

首先這是多個量當然用的是數組了,

複製代碼 代碼如下:
$list=array();
While($rows=資料){
$list[]=$rows;
}
$smarty->assign("list",$list);

先把資料放到一個數組中再一次性交給smarty,這樣一來list變數裡面是一個二維數組,如果是我們得到一個這樣的二維數組,要把裡面所有值顯示出來,最好的方法是迴圈輸出,同樣smarty為我們提供了迴圈用的標記,section和 foreach

section標記格式

複製代碼 代碼如下:
{section name=這次迴圈的名字 loop=資料量名}
...
{/section}


{section name=i loop=$list}

  • {$list[i].title}

  • {/section}

    上面的代碼看起來很像for迴圈,但這裡的i不是for迴圈裡面的$i 只是這個迴圈的名字,$list[迴圈名]這個寫法可以每次從數組裡得到一個量,正如剛才說的,$list是一個二維數組,$list[i]得到的還是數組。

    還有一個寫法就是foreach 其文法如下:

    複製代碼 代碼如下:
    {foreach key=索引 item=值 from=賦值變數}

    {$key}:{$item}

    {/foreach}

    {foreach item=v from=$list}

  • {$v.title}
  • {/foreach}

    迴圈list變數每個量賦值到v裡,然後從變數v裡面指定要顯示的索引,除了迴圈標記外,它還給我們提供了一些常用的文法標記,例如包含檔案,條件判斷,我們知道HTML不能包含檔案,比如網頁頭部,但smarty提供了{include}的標記,可以像php一樣包含檔案,例如{include file="檔案路徑"} 這個標記格式是固定的,而且這個路徑必須在模板引擎指定的路徑下,而條件判斷的文法和php一樣是if條件判斷,文法如下

    複製代碼 代碼如下:
    {if變數==值或量}
    為真時顯示的值
    {else}
    為假是顯示的值
    {/if}

    也可以不寫else只有為真時顯示的內容,例如常見的一種情況是網頁上有一個登陸口登入前顯示的是表單登入後顯示的是使用者資訊,假設一個量已經賦值給模板了比如 $username 使用者登入這個量就有使用者名稱沒有登入這個量就是空的,我們可以這樣寫

    複製代碼 代碼如下:
    {if $username !=""}
    歡迎{$username}
    {else}
    請先登入
    {/if}

    我們只要在php把這個變數準備好,並賦值給smarty即可除了這些標記外還有的標記自行參考手冊,

    其次就是變數調節器了,很多時候我們從資料庫中得到的資料,都要小小的處理下才輸出的,比如日期格式,只顯示年月日即可再如輸出的內容裡的換行要換成
    才能在頁面顯示對應的樣子,這個時候我們可以使用smarty內建的變數調節器,格式如下

    複製代碼 代碼如下:
    {要輸出的變數|調節器名:參數}

    假如內容部分在顯示的時候把所有的換行顯示為
    只需要如下寫法

    複製代碼 代碼如下:
    {$content|nl2br}

    日期的格式化可以用date_format 例如手冊上

    複製代碼 代碼如下:
    index.php:

    $smarty = new Smarty;
    $smarty->assign('yesterday', strtotime('-1 day'));
    $smarty->display('index.tpl');

    index.tpl:

    {$smarty.now|date_format}
    {$smarty.now|date_format:"%A, %B %e, %Y"}
    {$smarty.now|date_format:"%H:%M:%S"}
    {$yesterday|date_format}
    {$yesterday|date_format:"%A, %B %e, %Y"}
    {$yesterday|date_format:"%H:%M:%S"}

    OUTPUT:

    Feb 6, 2001
    Tuesday, February 6, 2001
    14:33:00
    Feb 5, 2001
    Monday, February 5, 2001
    14:33:00

    實在不行我們可以用php處理好之後再進行賦值。

    下面寫上配置

    複製代碼 代碼如下:
    define("ROOT",str_replace('\\','/',dirname(__FILE__)).'/');//定義根路徑
    //載入smarty類
    require ROOT.'lib/smarty.class.php';
    $samrty = new smarty();//執行個體化一個smarty類
    //配置各種目錄
    $smarty ->setTemplateDir(ROOT.'templates/')
    ->setCompileDir(ROOT.'templates_c')
    ->setPluginsDir(ROOT.'plugins/')
    ->setCacheDir(ROOT.'cache/')
    ->setConfigDir(ROOT.'configs/');
    $smarty->caching = false;//是否開啟緩衝
    $smarty->left_delimiter = '<{';//設定左右 防止和js css 等發生衝突
    $smarty->right_delimiter = '}>';
    ?>

    http://www.bkjia.com/PHPjc/776460.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/776460.htmlTechArticle模板引擎是用於把模板檔案和資料內容合并在一起的程式,便於網站開發有利於代碼分離和維護,瞭解一個模板最好知道其工作原理,以便...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.