PHP smarty

<?php
/*
1、什麼是smarty?

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

2、smarty優勢:

1. 速度:採用smarty編寫的程序能夠得到最大速度的提升,這一點是相對於其它的模板引擎技術而言的。

2. 編譯型:採用smarty編寫的程序在運行時要編譯成一個非模板技術的PHP文件,這個文件採用了PHP與HTML混合的方式,在下一次訪問模板時將WEB請求直接轉換到這個文件中,而再也不進行模板從新編譯(在源程序沒有改動的狀況下)

3. 緩存技術:smarty選用的一種緩存技術,它能夠將用戶最終看到的HTML文件緩存成一個靜態的HTML頁,當設定smarty的cache屬性爲true時,在smarty設定的cachetime期內將用戶的WEB請求直接轉換到這個靜態的HTML文件中來,這至關於調用一個靜態的HTML文件。

4. 插件技術:smarty能夠自定義插件。插件實際就是一些自定義的函數。

5. 模板中可使用if/elseif/else/endif。在模板文件使用判斷語句能夠很是方便的對模板進行格式重排。

3、不適合使用smarty的地方:

1. 須要實時更新的內容。例如像股票顯示,它須要常常對數據進行更新,這類型的程序使用smarty會使模板處理速度變慢。

2. 小項目。小項目由於項目簡單而美工與程序員兼於一人的項目,使用smarty會喪失php開發迅速的優勢。


4、smarty目錄結構及版本
打開smarty的官方網站,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也能夠改爲咱們想要的具體存放編碼的文件夾的名稱

二、調試Smarty-3.1.12

建立本身的文件,在demo文件夾下建立index.php。
在templates目錄中建立模板index.tpl
(幾乎能夠是任何文本文件的擴展名,經常使用的是tpl,php,html,不建議使用後二者,由於能夠從瀏覽器直接訪問而不安全。能夠對apache的httpd.conf進行設置,禁止直接訪問.tpl文件。或者將templats目錄放在網站文檔樹以外。)

*/

//index.php代碼
require('../libs/Smarty.class.php');
$smarty = new Smarty;
//在調用的模板裏能夠經過{$name}來輸出name的值zhang,{}爲這裏的smarty分界符
$smarty->assign('name','zhang');
//調用模板tpl文件裏不能執行PHP語句塊
$smarty->display('templates/index.tpl');


/*
index.tpl頁面內容

<html>
<body>

<span>你好, {$name}</span>

</body>
</html>
*/

 

/*
Smarty編譯時的處理過程是源php文件->模板文件(可能調用多個或屢次)->源php文件。。。
也就是說不影響原php文件的其餘處理和輸出。因此smarty模板文件能夠是完整的html,也能夠是其中一部分。

smarty處理過程
smarty將php源文件,首先編譯成中間文件(也是php),若是啓用緩存,再根據編譯文件生成緩存文件(也是php),須要緩存的部分所有是硬編碼。
以後的每次訪問都會訪問編譯文件(若是編譯文件已經存在),一次編譯屢次調用(能夠是單文件的屢次,也能夠是多文件的屢次),若是啓用緩存且有緩存文件並且沒有過時,則直接訪問緩存文件,跳過編譯文件。
編譯文件一經生成,就不會被自動更新,除非模板文件或者配置文件更改。源php文件修改是不會引起從新編譯的。一旦編譯文件從新生成,緩存文件也必然從新生成。
*/

//Smarty容許有兩種特殊的編譯設置存在:
//一、 任什麼時候候都不自動從新編譯(上線階段):只有沒有該文件的編譯文件時才生成,模板文件或者配置文件的更改,不會引起從新編譯。
$smarty->setCompile_check(false);//默認爲true,false表示任什麼時候候都不在文件發生變動的狀況下生成編譯文件,除了無編譯文件。
$smarty->getCompile_check();//得到當前編譯檢查的設置
//二、任什麼時候候都從新編譯(調試階段):任什麼時候候都從新編譯。
$smarty->setForce_compile(true);//默認爲false,true表示每次都從新編譯(啓用緩存的話,每次都從新緩存)
$smarty->getForce_compile();//得到當前強制編譯的設置

//開啓緩存
$smarty->setCaching(true);
$smarty->getCaching();//獲取當前緩存狀態,默認是false關閉的
$smarty->setcache_lifetime(60);//設置緩存時間單位秒
//{*模版文件*}
//{nocache}
//{$name}
//{/nocache}
//{*若是開啓緩存的話放在nocache標籤內的變量不會緩存,每次讀取PHP源文件的值*}


/*
smarty分界符
在模板文件中,區分普通html代碼和smarty代碼靠的是分界符。默認是 {} ,但可能會與js和css相沖突。能夠進行變動。
在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");
//添加配置目錄路徑,全部路徑將會以數組形式保存,調用文件時將在全部路徑中查找
$smarty->addConfigDir("configs/test");
//獲取配置目錄路徑的數組
$smarty->getConfigDir();

//設置插件目錄路徑,不設默認"plugins"
$smarty->setPluginsDir("plugins");
//添加插件目錄路徑,全部路徑將會以數組形式保存,調用文件時將在全部路徑中查找,plugins文件夾裏放的就是能夠在前臺或後臺按不一樣規則調用的函數的存儲文件,文件名及函數名的命名按不一樣調用規則有不一樣寫法要求
$smarty->addPluginsDir("plugins/test");
//獲取插件目錄路徑的數組
$smarty->getPluginsDir();

//設置模板目錄路徑,不設默認"templates"
$smarty->setTemplateDir("templates");
//添加模板目錄路徑,全部路徑將會以數組形式保存,調用文件時將在全部路徑中查找
$smarty->addTemplateDir("templates/test");
//獲取模板目錄路徑的數組
$smarty->getTemplateDir();

//設置編譯目錄路徑,不設默認"templates_c"
$smarty->setCompileDir("templates_c");
//獲取編譯目錄路徑
$smarty->getCompileDir();
/*
咱們能夠建不一樣的php源文件文件夾,把編寫的php文件按必定的分類放在不一樣的文件夾中。
而後在每一個文件夾中都建立一個自定義的config文件,在config文件中建立一個新的$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}來訪問具體某數組元素
//在模版中能夠直接經過 {$testArr = "testValue" scope="global"} 來更改傳過來的模板變量的值(若是不存在則在模板中建立並設置該模版變量),scope屬性是標註模板變量使用範圍的可不寫
//在模版中更改或建立成其餘數組 {$testArr = [1,2,3]}也能夠{$testArr = [1,'a'=>2,2=>3]}也能夠{$testArr[] = 4}或其餘相似PHP中建立數組方式
//php源文件可經過 $smarty->getTemplateVars("testArr") 獲取指定模版變量,如要獲取模板中改變或建立的模版變量,在模板中建立或更改其值時必須加上scope屬性並把值設置爲scope="global"或scope="parent"

class A{
function aa($nam){
echo $nam;
}
}
$smarty->assign("obj", new A);
//設置的模版變量是對象時在模版頁能夠以下這樣調用,給模版傳類對象時也是傳址
//{$obj->aa('my name is y')}

//Smarty能夠識別嵌入在雙引號中的模版變量,只要此變量只包含數字、字母、下劃線。但貌似只支持能直接轉換成字符串的模版變量
$smarty->assign("testStr", "this is testStr");
//模板中可經過{"$testStr OK !"}來訪問

 

/*
tpl模板包含模板
模板文件:
{include file="header.tpl"}
header.tpl內容:
<span>這是頂部內容!!,歡迎你,{$name}</span>

模板包含模板也能夠是這樣格式
{include file="header.tpl" testVar="這是頂部內容!!!"}
header.tpl則能夠經過{$testVar}使用調用頁包含時傳來的模板變量
header.tpl內容:
<span>{$testVar},歡迎你,{$name}</span><hr />
*/

 

/*
能夠預先規定一系列的變量與值的對應,並放在配置文件中,在使用時載入。
配置文件默認放在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參數能夠不寫,默認值爲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')獲取的還多是數組
*/


/*
tpl文件中經常使用函數
tpl文件:
<!--將capture標籤括起的頁面顯示內容存在capture指定的testCapture中 -->
<!--當達到指定條件時可經過 {$smarty.capture.testCapture} 將內容輸出出來 -->
{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循環,相似PHP代碼*}


{$x=0}
{while $x<count($testArr)}
{$x++}
{/while}
{*While循環,也相似PHP代碼。*}


<!--name和key屬性可不寫-->
{foreach name="testForeach" from=$testArr key=arId item=arVal}
{$arId}對應的值爲:{$arVal}
<br>
{$smarty.foreach.testForeach.index} <!--(循環內部使用)顯示當前循環的索引,若是數組爲空,返回-1-->

{$smarty.foreach.testForeach.iteration} <!--(循環內部使用)顯示當前的循環次數-->

{$smarty.foreach.testForeach.first} <!--(循環內部使用)若是爲第一次循環,返回true-->

{$smarty.foreach.testForeach.last} <!--(循環內部使用)若是爲最後一次循環,返回true-->

{$smarty.foreach.testForeach.total} <!-(循環內外部使用)顯示循環的總次數-->
<br>
{foreachelse} <!--$testArr數組變量沒有值時(0個元素)執行。-->
$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}-<!--當前section循環的次數,從1計起-->
<br/>

{sectionelse}
$sectionArr is null
{/section}
<!--section循環適用於純int型鍵值的數組-->
<!--給loop賦一個要循環的數組,start指定從數組指定鍵值開始循環,step指定數組下次循環的鍵值與本次循環鍵值之差,max指定循環最大次數,show指定是否循環false的話直接跳到執行sectionelse-->
<!--Section的內置變量與foreach 相同-->

*/


/*
tpl模板文件:
{literal}

<script type="text/javascript">
function a(){
alert("this is script");
}
a();
</script>

{/literal}
{*
literal 標籤區域內的數據將被看成網頁html文本處理,此時模板將忽略且不分析其內部的全部字符信息。
該特性用於顯示有可能包含大括號等字符信息的 js、css 。當這些信息處於 {literal}{/literal} 標籤中時,模板引擎將不分析它們,而直接顯示。
*}

*/

//PHP文件:
//$smarty->setDebugging(true);//對後續調用的模板進行調試。
//$smarty->getDebugging();//獲得當前是否進行調試,默認false
//或在須要調試的模版中寫入{debug}

/*
模板文件:

smarty3.0支持了模版繼承系統,例如
f1.tpl:
<html>
<body>

{block name='top'} f1.header<br />{/block}
{block name='middle'} f1.middle<br />{/block}
{block name='buttom'} f1.buttom<br />{/block}

</body>
</html>

f2.tpl:
{extends file="f1.tpl"}
{block name='top'} f2.header<br />{/block}
{block name='other'} it can`t be show <br />{/block}
{*
若是f2.tpl中沒有block標籤,或f2.tpl中沒有和f1.tpl中相同命名的block標籤,則f2.tpl完整引入顯示f1.tpl中全部內容包括block標籤的內容,而f2.tpl中全部內容將忽略
若是f2.tpl中有和f1.tpl中同名block標籤,則在f2.tpl顯示時f2.tpl中block標籤內容將覆蓋f1.tpl中同名block標籤的內容,在f2.tpl頁面顯示時,內容仍將按f1.tpl設置的格式位置顯示,f2.tpl其餘全部文本包括未同名的block標籤及其內容都將被忽略,不顯示。
block標籤的內容只會覆蓋父模版中同名block標籤的內容,或在子模版中顯示,在本頁面中若是沒有調用父模版或父模版中沒有要覆蓋的同名block標籤,block標籤內容在本頁面中不顯示
這種繼承支持多文件,多重繼承,意味着能夠無限的繼承下去
*}


{fetch file="http://www.126.com" assign="testAssign"}
{$testAssign}
{fetch file="http://www.126.com"}
{*fetch能夠引用外部http,ftp的頁面,如指定assign的值則把引用的內容存在指定名的變量中,不然在哪有fetch在哪顯示*}
*/

//php頁面:
//調用模版也可使用此方法,在輸出前作一些處理
//$output = $smarty->fetch("index.tpl");
//do something with $output here對將要輸出的內容進行處理
//echo $output;//而後將模板輸出

/*
模板中提交表單
<form name="input" action="file.php" method="post">
action屬性能夠直接寫要提交到的php文件名,或者不寫空action=""則提交到調用該模板的php文件中
*/


//鏈接數據庫
mysql_connect("localhost","root","root");
mysql_select_db("test");
$smarty->assign('webDir',$_SERVER['DOCUMENT_ROOT']);//$_SERVER['DOCUMENT_ROOT']爲當前項目文件夾的絕對路徑
//配置JQuery的src路徑最好寫絕對路徑或寫要運行文件能找到該JQuery的相對路徑由於要編譯成編譯文件,而編譯後的文件和原路徑環境不同
?>
<script type="text/javascript" src="http://localhost/Smarty/demo/JS/jquery-1.7.2.min.js"></script>
相關文章
相關標籤/搜索