1.Smarty模板引擎簡介php
Smarty分離了邏輯代碼和外在的內容,提供了一種易於管理和使用的方法,將本來與HTML代碼混雜在一塊兒PHP代碼邏輯分離。簡單的講,就是要使PHP程序員同前端人員分離,程序員改變程序的邏輯內容不會影響到前端人員的頁面設計,前端人員從新修改頁面不會影響到程序的程序邏輯,這在多人合做的項目中顯的尤其重要。html
Smarty模板引擎優勢:前端
1)速度:相對於其餘模板技術而言,採用Smarty編寫程序能夠得到最大速度的提升。git
2)編譯型:採用Smarty編寫的程序在運行時要編譯成一個非模板技術的PHP文件,這個文件採用了PHP與HTML混合的方式,在下一次訪問模板時將WEB請求直接轉換到這個文件中,而沒必要進行從新編譯模板(在源程序沒有改動的狀況下)程序員
3)緩存技術:Smarty選用的一種緩存技術,它能夠將用戶最終看到的HTML文件緩存成一個靜態的HTML頁,當設定Smarty的cache屬性爲true時,在Smarty設定的cachetime期內將用戶的WEB請求直接轉換到這個靜態的HTML文件中來,這至關於調用一個靜態的HTML文件。github
4)插件技術:Smarty能夠自定義插件。插件實際就是一些自定義的函數。數據庫
5)模板中可使用if/elseif/else/endif。在模板文件使用判斷語句能夠很是方便的對模板進行格式重排。api
不適合使用Smarty的地方:數組
1)須要實時更新的內容。例如像股票顯示,它須要常常對數據進行更新,這類型的程序使用smarty會使模板處理速度變慢。瀏覽器
2)小項目。因小項目簡單而使美工與程序員兼於一人,使用Smarty會在必定程度上喪失PHP開發迅速的優勢。
Smarty模板引擎的原理:把模板文件編譯成php文件,而後每次都去讀取模板的修改時間,沒有修改就不編譯。而後include這個「編譯」後的PHP文件。所謂編譯也就是模板用正則替換成含PHP代碼的過程。模板文件和php程序文件通過模板引擎的編譯後合成一個文件,即編譯後的文件。
Smarty的這種開發模式是基於MVC框架概念。MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫。MVC已經成爲一種軟件設計典範,它用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯彙集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不須要從新編寫業務邏輯。
一般模型對象負責在數據庫中存取數據。
一般視圖是依據模型數據建立的。
一般控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。
Smarty模板引擎將PHP程序直接生成模板文件,最終瀏覽器中讀取的就是Smarty模板文件,而且Smarty可以對模板文件進行判斷,若是是第一次或者模板已經改變,則從新生成。
配置
test.php
<?php //1.Smarty類的引入 引入上圖的主文件 require '../libs/Smarty.class.php'; //2.Smarty類的實例化 $smarty = new Smarty(); //3.Smarty "五配置兩方法" $smarty -> setLeftDelimiter('{'); //左定界符 $smarty -> setRightDelimiter('}'); //右定界符 $smarty -> setTemplateDir('tpl'); //html模板的地址 $smarty -> setCompileDir('template_c'); //模板編譯生成的文件 $smarty -> setCacheDir('cache'); //緩存地址 //Smarty的緩存機制不太理想,能夠不使用 $smarty -> setCaching(Smarty::CACHING_LIFETIME_CURRENT); $smarty -> setCacheLifetime(300);
基本操做
test.php
//1.註冊 $smarty->assign('title','學習Smarty'); /*也能夠分開 $title = "學習Smarty"; $smarty->assign('title',$title); */ //2.展現模板 $smarty->display('test.tpl');
test.tpl
{$title}
以上實現了一個簡單的模板註冊數據以及展現數據
總結步驟:
Step 1:加載 Smarty 模版引擎。
Step 2:創建 Smarty 對象。
Step 3:設定 Smarty 對象的參數。
Step 4:在程序中處理變量後,再用 Smarty 的 assign 方法將ji變量置入模版裏。
Step 5:利用 Smarty 的 display 方法將網頁顯示出來
模板註釋被號包圍,例如 **{* this is a comment *} **
定界符能夠改變,若是定界符改成<{
和 }>
則註釋爲 **<{* this is a comment *}>**
在Smarty模板中使用保留變量時,無須使用assign()方法傳值,直接調用變量名便可。
smarty中經常使用 的保留變量:
```php {$smarty.now} //取得當前時間戳 {$smarty.const} //直接訪問php常量 {$smarty.capture} {$smarty.config} //取得配置變量 {$smarty.section} {$smarty.template} {$smarty.current_dir} {$smarty.version} {$smarty.block.child} {$smarty.block.parent} {$smarty.ldelim}, {$smarty.rdelim} ```
自行百度
capitalize
(首字母大寫)
繼續在代碼實現:
test.php
//1.註冊數據 $smarty -> assign('habbit','i like eat apple'); //2.展現模板 $smarty -> display('test.tpl');
test.tpl
{$habbit|capitalize}
效果展現:
能夠看出每一個單詞的首字母大寫了
date_format (轉換時間戳格式)
test.php
$smarty -> assign('date',time());
test.tpl
{$date|date_format}
效果是將時間戳格式轉換爲咱們可讀的年月日
{$date|date_format:"%B %e, %Y"}
default (默認展現)
test.php
//定義一個變量模擬 我的簽名 爲空的時候 $signifcant = ""; $smarty -> assign('signifcant',$signifcant);
test.tpl
效果展現:
若是$significant
不爲空
$signifcant = "哥只是個傳說";
效果展現:
從以上三個變量調節器中,咱們瞭解到了變量調節器的做用以及用法
後面的粗略列出:
escpae
用於html轉碼,url轉碼,十六進制轉碼等。詳見手冊
lower/upper
將變量字符串小(大)寫
nl2br
全部換行符轉換成
<br/>
.......(後面本身看手冊)
條件判斷
基本句式
{if $name eq "Fred"} Welcome Sir. {elseif $name eq "Wilma"} Welcome Ma'am. {else} Welcome,whatever you are. {/if}
注意:修飾詞必須和變量或常量用空格隔開
test.php
$score = 59; $smarty -> assign('score',$score);
test.tpl
{if $score gt 90} 優秀 {elseif $score gt 59} 合格 {else} 掛科啦 {/if}
效果展現:
Smarty 的循環語句 section
test.php
$arr2 = array( array( 'title' => 'Smarty的學習', 'author' => '小明' ), array( 'title' => 'html的學習', 'author' => '小紅' ) ); $smarty -> assign('arr2',$arr2);
test.tpl
{section name=arrList loop=$arr2} {$arr2[arrList].author} {$arr2[arrList].title} {/section}
以上是表格其餘 section 的參數
foreach
可用於循環關聯數組
test.php
$arr2 = array( array( 'title' => 'Smarty的學習', 'author' => '小明' ), array( 'title' => 'html的學習', 'author' => '小紅' ) ); $smarty -> assign('arr2',$arr2);
test.tpl
{foreach item=arrList from=$arr2} {$arrList.title} {$arrList.author} <br> {foreachelse} 當前沒有內容 {/foreach}
{foreachelse}
。同時,{section }
也支持 {sectionelse}
不贅述。
在Smarty 3以後,支持php原生的foreach 語法
{foreach $arr2 as $arrList} {$arrList.title} {$arrList.author} <br> {/foreach}
include
先建立一個header.tpl
文件,待引入,寫簡單的一句話
我是 header.tpl
而後到 test.tpl
中去引入
{include file="header.tpl"}
效果以下:
`include` 除了 `file` 屬性以外,還有其餘自定義的屬性
好比建立一個屬性sitename
用他表示網站名稱
{include file="header.tpl" sitename="github"}
這時候 header.tpl
裏面就能夠輸出 sitename 的屬性
{$sitename}
Smarty類與對象的複製與使用
register_object方法,在Smarty中已經棄用
assign方法;將一個類的對象以變量的形式複製到smarty模板中使用
test.php
class A{ function meth1(){ echo "hello"; } }; $a = new A(); $smarty->assign('a',$a); $smarty -> display('test.tpl');
test.tpl
{$a -> meth1()}
這樣就能輸出 hello 的字樣
php內置函數
test.php
$smarty -> assign('time',time()); $smarty -> display('test.tpl');
test.tpl
{"Y-m-d"|data:$time}
前面"Y-m-d"是做爲函數data()的第一個參數,冒號後面時data()的第二個參數
打印出時間
自定義函數
register
$smarty -> registerPlugin('function','f_test','test);
步驟:
1.函數庫自定義插件
2.按照命名規範命名php文件
3..按照命名規範命名自定義函數插件 smarty_function_插件名
以下:(計算矩形面積的自定義函數插件)
4.建立模板和展現模板
area.tpl
模板內容
{test width=200 height=30}
目錄結構:
5.調試結果
方法和自定義函數插件相似
命名規範
模板的內容:調用modifier插件
自定義區塊函數插件
建立模板
展現模板
效果