一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - 模板引擎smarty工作原理以及使用示例

模板引擎smarty工作原理以及使用示例

2020-06-30 12:12PHP教程網 PHP教程

smarty是一個使用PHP寫出來的模板PHP模板引擎,它提供了邏輯與外在內容的分離,簡單的講,目的就是要使用PHP程序員同美工分 離,使用的程序員改變程序的邏輯內容不會影響到美工的頁面設計,美工重新修改頁面不會影響到程序的程

模板引擎是用于把模板文件和數據內容合并在一起的程序,便于網站開發有利于代碼分離和維護,了解一個模板最好知道其工作原理,以便于實現一通萬通。

模板文件一般是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']=>"標題",…);

 

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

 

復制代碼 代碼如下:

<h1>{$title}</h1>
<div>{$content}</div>

 

一個個賦值太麻煩,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條數據都要顯示出來,而且他們的索引肯定完全相同,根據編程思路知道結果求過程,假設顯示如下

 

復制代碼 代碼如下:

<ul>
<li>1111</li>
<li>222</li>
<li>333</li>
<li>4444</li>
</ul>

 

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

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

 

復制代碼 代碼如下:

$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}
<li>{$list[i].title}</li>
{/section}

 

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

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

 

復制代碼 代碼如下:


{foreach key=索引 item=值 from=賦值變量}

 

{$key}:{$item}<br />

{/foreach}

{foreach  item=v from=$list}

<li>{$v.title}</li>

{/foreach}

 

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

 

復制代碼 代碼如下:

{if變量==值或量}
為真時顯示的值
{else}
為假是顯示的值
{/if}

 

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

 

復制代碼 代碼如下:

{if $username !=""}
歡迎{$username}
{else}
請先登錄
{/if}

 

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

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

 

復制代碼 代碼如下:

{要輸出的變量|調節器名:參數}

 

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

 

復制代碼 代碼如下:

{$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處理好之后再進行賦值。

下面寫上配置

 

復制代碼 代碼如下:

<?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 = '}>';
?>

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美综合亚洲图片综合区 | 五月天狠狠 | 星球大战成人h无删减版 | 欧美特黄aaaaaa | 暖暖的韩国免费观看 | 午夜精品久久久内射近拍高清 | 啊哈用力cao我 | 国产午夜免费不卡精品理论片 | 国产精品合集一区二区 | 亚洲日韩欧美一区二区在线 | 国产爽视频 | 无码人妻精品一区二区蜜桃在线看 | 亚洲精品一区二区三区在线观看 | 九九久久国产 | gangbang日本 | 亚洲免费视频播放 | 4455在线| 美女用手扒开粉嫩的屁股 | 国产99久久九九精品免费 | 国产伦码精品一区二区三区 | 色倩网站| 国产麻豆网 | 精品国语国产在线对白 | 欧美日韩视频在线第一区二区三区 | 欧美精品一区二区三区免费播放 | 亚洲男人天堂网址 | 国产91成人精品亚洲精品 | 久草在线草a免费线看 | 99国产在线视频 | 国产亚洲精品激情一区二区三区 | 美女用手扒自己下部 | 美女脱了内裤让男桶爽 | 希岛爱理作品在线观看 | 精品久久久久久亚洲 | 色久久一个亚洲综合网 | 四虎在线免费 | 爱福利视频一区二区 | 青青草成人在线观看 | 免费观看一区二区 | 美女bbxx美女bbb | 日本人在线看片 |