中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

smarty模板引擎的工作原理是什么

發布時間:2021-01-14 16:01:10 來源:億速云 閱讀:220 作者:Leah 欄目:開發技術

這篇文章給大家介紹smarty模板引擎的工作原理是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

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

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

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

復制代碼 代碼如下:


<h2>{$title}</h2>
<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 = '}>';
?>

關于smarty模板引擎的工作原理是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

盘山县| 商都县| 交口县| 瑞金市| 莆田市| 泰顺县| 阿巴嘎旗| 苏州市| 盐池县| 塔城市| 仙桃市| 漳平市| 延安市| 潮安县| 沿河| 巢湖市| 天门市| 合山市| 九龙城区| 汽车| 北安市| 嘉定区| 扬中市| 莱州市| 连平县| 北流市| 奉新县| 咸丰县| 北宁市| 化隆| 克拉玛依市| 青神县| 彭山县| 建湖县| 呼图壁县| 西盟| 乐业县| 洪洞县| 大英县| 苍南县| 耒阳市|