激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 欧美成人午夜精品久久久 | 成人国产高清 | 羞羞的视频在线 | 久久久婷婷一区二区三区不卡 | 久久久久久久久日本理论电影 | av免费不卡国产观看 | 超碰97最新 | 欧美一级美国一级 | 国产在线a | 色视频在线播放 | 日本在线视频免费 | 在线观看日韩中文字幕 | 欧美一级特级 | 在线91视频 | 成人午夜精品久久久久久久蜜臀 | 香蕉视频网站在线观看 | 一级黄色大片在线观看 | 成人综合一区二区 | 毛片毛片免费看 | 毛片一区二区三区四区 | 日本一区免费看 | 免费人成在线观看网站 | 黄色va视频 | 亚洲国产色婷婷 | 91精品国产乱码久 | 欧美在线 | 亚洲 | 日本在线观看高清完整版 | 成人h精品动漫一区二区三区 | xxxxhd73国产 | 免费看日产一区二区三区 | 一级做a爱片性色毛片 | 国产成人在线网址 | 91av在线影院 | 久久久久国产成人免费精品免费 | 成人福利在线看 | 亚洲电影免费观看国语版 | 黄污视频在线看 | 精品国产一级毛片 | 成人精品aaaa网站 | 欧美性受xxxxxx黑人xyx性爽 | 女女久久 |