- 相關推薦
利用PHP模板引擎smarty
PHP模板引擎smarty詳細介紹,本文講解了什么是smarty、smarty優(yōu)點、不適合使用smarty的地方、smarty目錄結構及版本,需要的朋友可以參考下。
一、什么是smarty?
smarty是一個使用PHP寫出來的模板PHP模板引擎,它提供了邏輯與外在內容的分離,簡單的講,
目的就是要使用PHP程序員同美工分離,使用的程序員改變程序的邏輯內容不會影響到美工的頁面設計,美工重新修改頁面不會影響到程序的程序邏輯,這在多人合作的項目中顯的尤為重要。
二、smarty優(yōu)點:
1. 速度:采用smarty編寫的程序可以獲得最大速度的提高,這一點是相對于其它的模板引擎技術而言的。
2. 編譯型:采用smarty編寫的程序在運行時要編譯成一個非模板技術的PHP文件,這個文件采用了PHP與HTML混合的方式,在下一次訪問模板時將WEB請求直接轉換到這個文件中,而不再進行模板重新編譯(在源程序沒有改動的情況下)
3. 緩存技術:smarty選用的一種緩存技術,它可以將用戶最終看到的HTML文件緩存成一個靜態(tài)的HTML頁,當設定smarty的cache屬性為true時,在smarty設定的cachetime期內將用戶的WEB請求直接轉換到這個靜態(tài)的HTML文件中來,這相當于調用一個靜態(tài)的HTML文件。
4. 插件技術:smarty可以自定義插件。插件實際就是一些自定義的函數(shù)。
5. 模板中可以使用if/elseif/else/endif。在模板文件使用判斷語句可以非常方便的對模板進行格式重排。
三、不適合使用smarty的地方:
1. 需要實時更新的內容。例如像股票顯示,它需要經常對數(shù)據(jù)進行更新,這類型的程序使用smarty會使模板處理速度變慢。
2. 小項目。小項目因為項目簡單而美工與程序員兼于一人的項目,使用smarty會喪失php開發(fā)迅速的優(yōu)點。
四、smarty目錄結構及版本
打開smarty的官方的網(wǎng)站,www.smarty.net/download.php。下載Smarty 3.1.12。有tar.gz和zip分別適用于linux和windows版本。
下載好后Smarty-stable-3.1.12解壓縮會得到一個 Smarty-3.1.12 文件夾,里面有兩個主要文件夾demo和libs
demo文件夾為示例文件夾,里面包含默認文件夾結構,是我們要進行編寫程序代碼的主要文件夾。demo里文件夾的名稱都是smarty默認的目錄結構名稱,可以通過改smarty對應屬性值,再把文件夾名改成我們想要的名稱。
libs為smarty代碼源文件夾,一般不動。
/libs/Smarty.class.php #主文件
/libs/sysplugins/ #內部plugin
/libs /plugins/ #外部plugin,可自由擴充
/demo/cahce/ #放置緩存文件
/demo/configs / #放置可以載入的配置文件
/demo/templates/ #放置模板文件
/demo/templates_c/ #放置對模板編譯后的文件
可以把解壓得到的 Smarty-3.1.12 文件夾名改成我們想要的項目名,demo也可以改成我們想要的具體存放編碼的文件夾的名稱
2、調試Smarty-3.1.12
創(chuàng)建自己的文件,在demo文件夾下創(chuàng)建index.php。
在templates目錄中創(chuàng)建模板index.tpl
。◣缀蹩梢允侨魏挝谋疚募臄U展名,常用的是tpl,php,html,不建議使用后兩者,因為可以從瀏覽器直接訪問而不安全?梢詫pache的httpd.conf進行設置,禁止直接訪問.tpl文件;蛘邔emplats目錄放在網(wǎng)站文檔樹之外。)
*/
//index.php代碼
require('../libs/Smarty.class.php');
$smarty = new Smarty;
//在調用的模板里可以通過{$name}來輸出name的值zhang,{}為這里的smarty分界符
$smarty->assign('name','zhang');
//調用模板tpl文件里不能執(zhí)行PHP語句塊
$smarty->display('templates/index.tpl');
/*
index.tpl頁面內容
你好, {$name}
*/
/*
Smarty編譯時的處理過程是源php文件->模板文件(可能調用多個或多次)->源php文件。。。
也就是說不影響原php文件的其他處理和輸出。所以smarty模板文件可以是完整的html,也可以是其中一部分。
smarty處理過程
smarty將php源文件,首先編譯成中間文件(也是php),如果啟用緩存,再根據(jù)編譯文件生成緩存文件(也是php),需要緩存的部分全部是硬編碼。
之后的每次訪問都會訪問編譯文件(如果編譯文件已經存在),一次編譯多次調用(可以是單文件的多次,也可以是多文件的多次),如果啟用緩存且有緩存文件而且沒有過期,則直接訪問緩存文件,跳過編譯文件。
編譯文件一經生成,就不會被自動更新,除非模板文件或者配置文件更改。源php文件修改是不會引發(fā)重新編譯的。一旦編譯文件重新生成,緩存文件也必然重新生成。
*/
//Smarty允許有兩種特殊的編譯設置存在:
//1、 任何時候都不自動重新編譯(上線階段):只有沒有該文件的編譯文件時才生成,模板文件或者配置文件的更改,不會引發(fā)重新編譯。
$smarty->setCompile_check(false);//默認為true,false表示任何時候都不在文件發(fā)生變更的情況下生成編譯文件,除了無編譯文件。
$smarty->getCompile_check();//獲得當前編譯檢查的設置
//2、任何時候都重新編譯(調試階段):任何時候都重新編譯。
$smarty->setForce_compile(true);//默認為false,true表示每次都重新編譯(啟用緩存的話,每次都重新緩存)
$smarty->getForce_compile();//獲得當前強制編譯的設置
//開啟緩存
$smarty->setCaching(true);
$smarty->getCaching();//獲取當前緩存狀態(tài),默認是false關閉的
$smarty->setcache_lifetime(60);//設置緩存時間單位秒
//{*模版文件*}
//{nocache}
//{$name}
//{/nocache}
//{*如果開啟緩存的話放在nocache標簽內的變量不會緩存,每次讀取PHP源文件的值*}
/*
smarty分界符
在模板文件中,區(qū)分普通html代碼和smarty代碼靠的是分界符。默認是 {} ,但可能會與js和css相沖突?梢赃M行變更。
在3.0中模板標簽將不支持空格,如{ $abc }在Smarty2中可以識別的,但是3.0里頭就不行了,必須這樣{$abc},這樣是為了能夠更好的支持javascript和css。
*/
$smarty->left_delimiter = "{"; //左分界符,2.0屬性,3.0沿用
$smarty->right_delimiter = "}";
/*
分界符就相當于PHP的echo,分界符中的值都將輸出,除非賦值等操作
smarty tpl文件中分界符中兩個**之間的內容為注釋內容如
tpl文件:
{*這是模板注釋內容*}
*/
//設置緩存目錄路徑,不設默認"cache"
$smarty->setCacheDir("cache");
//獲取緩存目錄路徑
$smarty->getCacheDir();
//設置配置目錄路徑,不設默認"configs"
$smarty->setConfigDir("configs");
//添加配置目錄路徑,所有路徑將會以數(shù)組形式保存,調用文件時將在所有路徑中查找
$smarty->addConfigDir("configs/test");
//獲取配置目錄路徑的數(shù)組
$smarty->getConfigDir();
//設置插件目錄路徑,不設默認"plugins"
$smarty->setPluginsDir("plugins");
//添加插件目錄路徑,所有路徑將會以數(shù)組形式保存,調用文件時將在所有路徑中查找,plugins文件夾里放的就是可以在前臺或后臺按不同規(guī)則調用的函數(shù)的存儲文件,文件名及函數(shù)名的命名按不同調用規(guī)則有不同寫法要求
$smarty->addPluginsDir("plugins/test");
//獲取插件目錄路徑的數(shù)組
$smarty->getPluginsDir();
//設置模板目錄路徑,不設默認"templates"
$smarty->setTemplateDir("templates");
//添加模板目錄路徑,所有路徑將會以數(shù)組形式保存,調用文件時將在所有路徑中查找
$smarty->addTemplateDir("templates/test");
//獲取模板目錄路徑的數(shù)組
$smarty->getTemplateDir();
//設置編譯目錄路徑,不設默認"templates_c"
$smarty->setCompileDir("templates_c");
//獲取編譯目錄路徑
$smarty->getCompileDir();
/*
我們可以建不同的php源文件文件夾,把編寫的php文件按一定的分類放在不同的文件夾中。
然后在每個文件夾中都創(chuàng)建一個自定義的config文件,在config文件中創(chuàng)建一個新的$smarty = new Smarty 對象
然后把所有不同的文件夾的php文件的緩存,配置文件,插件,模版,編譯目錄都設置到同一個緩存,配置文件,插件,模版,編譯目錄
讓該文件夾下所有PHP源文件都引用該配置文件即可獲取相同配置
*/
//模版變量
$arr = array(array("zhang","li"),'a'=>array("liu","wang"),array("ming","yi"));
$smarty->assign("testArr", $arr);
//設置模版變量,為將要調用的模版提供變量,在接下來調用的模版中可以通過{$testArr}或者{$testArr['a'][0]}或者{$testArr.a.0}來訪問具體某數(shù)組元素
//在模版中可以直接通過 {$testArr = "testValue" scope="global"} 來更改傳過來的模板變量的值(如果不存在則在模板中創(chuàng)建并設置該模版變量),scope屬性是標注模板變量使用范圍的可不寫
//在模版中更改或創(chuàng)建成其他數(shù)組 {$testArr = [1,2,3]}也可以{$testArr = [1,'a'=>2,2=>3]}也可以{$testArr[] = 4}或其他類似PHP中創(chuàng)建數(shù)組方式
//php源文件可通過 $smarty->getTemplateVars("testArr") 獲取指定模版變量,如要獲取模板中改變或創(chuàng)建的模版變量,在模板中創(chuàng)建或更改其值時必須加上scope屬性并把值設置為scope="global"或scope="parent"
class A{
function aa($nam){
echo $nam;
}
}
$smarty->assign("obj", new A);
//設置的模版變量是對象時在模版頁可以如下這樣調用,給模版?zhèn)黝悓ο髸r也是傳址
//{$obj->aa('my name is y')}
//Smarty可以識別嵌入在雙引號中的模版變量,只要此變量只包含數(shù)字、字母、下劃線。但貌似只支持能直接轉換成字符串的模版變量
$smarty->assign("testStr", "this is testStr");
//模板中可通過{"$testStr OK !"}來訪問
/*
tpl模板包含模板
模板文件:
{include file="header.tpl"}
header.tpl內容:
這是頂部內容!!,歡迎你,{$name}
模板包含模板也可以是這樣格式
{include file="header.tpl" testVar="這是頂部內容!!!"}
header.tpl則可以通過{$testVar}使用調用頁包含時傳來的模板變量
header.tpl內容:
{$testVar},歡迎你,{$name}
*/
/*
可以預先規(guī)定一系列的變量與值的對應,并放在配置文件中,在使用時載入。
配置文件默認放在configs文件夾中,可以自定義修改文件夾名。
*/
/*
#模板test.conf文件:
#鍵對應的值可以不用引號括起來
title = Welcome to Smarty!!
cutoff_size = 40
[china]
language = chinese
[england]
language = english
#[china],[england]為標簽,未設置標簽的鍵值為全局的只要調用該配置文件就可以在模版中使用,設置了標簽的鍵值只有在調用配置文件時指定了對應標簽才可以使用
#在PHP源文件調用配置文件語句$smarty->configLoad('test.conf', $sections = 'england');該語句下面調用的模版才可以使用該配置文件,通過$sections屬性指定使用哪個標簽下的鍵和值
#$sections參數(shù)可以不寫,默認值為null,$smarty->configLoad('test.conf')則只使用全局的鍵值,而不能使用標簽下的鍵值
#在模版下通過{config_load file="test.conf" section="china" scope="global"}語句調用配置文件
#section屬性可以不寫,默認是null,scope屬性必須寫{config_load file="test.conf" scope="global"}
#section屬性可賦三種值
#local 只有當前模版可以使用該配置文件
#parent 只有當前模版引入該配置文件語句后包含的模版中,或在php源文件中smarty對象調用該配置文件后調用的模版中可以使用該配置文件中的鍵值
#global 測試效果和parent相同
#在模版中通過{#language#}來使用鍵值,也可以通過{$smarty.config.language}來訪問配置文件鍵值
#PHP源文件中可以使用$smarty->getConfigVars('language')或$smarty->getConfigVariable('language')來獲取鍵值,$smarty->getConfigVars('language')獲取的還可能是數(shù)組
*/
/*
tpl文件中常用函數(shù)
tpl文件:
{capture name="testCapture"}
{include file="f1.tpl"}
{/capture}
{if true}
{$smarty.capture.testCapture}
{/if}
{if $name == "wang"}
Welcome wang.
{elseif $name == "zhang"}
Welcome zhang.
{else}
Welcome, whatever you are.
{/if}
{*操作符可以是 ==,>= 等也可以是 eq,ne等*}
{for $x=0; $x<count($testArr); $x++}
{$x}
{/for}
{*for循環(huán),類似PHP代碼*}
{$x=0}
{while $x<count($testArr)}
{$x++}
{/while}
{*While循環(huán),也類似PHP代碼。*}
{foreach name="testForeach" from=$testArr key=arId item=arVal}
{$arId}對應的值為:{$arVal}
{$smarty.foreach.testForeach.index}
{$smarty.foreach.testForeach.iteration}
{$smarty.foreach.testForeach.first}
{$smarty.foreach.testForeach.last}
{$smarty.foreach.testForeach.total}
{foreachelse}
$testArr is null
{/foreach}
{*也可以如下兩種類PHP格式*}
{foreach $testArr as $n}
{$n}
{/foreach}
{foreach $testArr as $key=>$n}
{$key}
{/foreach}
{$sectionArr = [0=>"a",4=>"b","c","d","e",6,7,8,9,10,11,12,13,14,15,16]}
{section name="testSection" loop=$sectionArr start=0 step=4 max=6 show=true}
{$smarty.section.testSection.index}-
{$sectionArr[testSection]}-
{$smarty.section.testSection.iteration}-
{sectionelse}
$sectionArr is null
{/section}
*/
/*
tpl模板文件:
{literal}
script type="text/javascript"
function a(){
alert("this is script");
}
a();
/script
【利用PHP引擎smarty】相關文章:
php-smarty模版引擎中的緩存應用04-23
PHP中使用smarty生成靜態(tài)文件的實例10-25
PHP中--autoload和Smarty沖突的解決方法07-23
PHP引擎全速運轉的三個絕招07-22
利用PHP實現(xiàn)短域名互轉07-24
利用PHP校驗ISBN碼函數(shù)10-04
PHP的自定義模板引擎使用方法11-03