Smarty模板技术学习(二)
本文主要包括以下內(nèi)容
公共文件引入與繼承
可以把許多模板頁面都用到的公共頁面放到單獨(dú)文件里邊,通過模板就可以直接調(diào)用,類似php里邊通過include指令引入公共文件一樣。
{include file=”[模目錄/]板文件名稱”}
使用include對公共文件進(jìn)行包含的好處是使用較簡單,好理解。不好的地方使用相對較繁瑣。
許多框架程序把頭部和腳部集中處理的技術(shù)成為“布局”
在Smarty模板里邊還可以通過“extends繼承”對頭部和腳部進(jìn)行處理。
extends相對include 代碼也少一點(diǎn)、文件也相對較少,再者extends可以進(jìn)行布局設(shè)計(jì)。
{extends file=”布局文件路徑名”}
{block name=”名稱”}{/block}
布局繼承使用:
①通過block標(biāo)簽在布局頁面進(jìn)行布局設(shè)計(jì)
②在布局頁面可以有兩部分內(nèi)容:html標(biāo)簽+block標(biāo)簽
③在繼承頁面里邊有兩部分內(nèi)容:extends + block,除此之外的內(nèi)容不給顯示
④在繼承頁面通過{block name=”XXX”}來實(shí)現(xiàn)父級標(biāo)簽內(nèi)容
⑤在子級標(biāo)簽可以調(diào)用父級標(biāo)簽?zāi)J(rèn)內(nèi)容 {smarty.block.parent}?或{smarty.block.child}
⑥父級block有默認(rèn)內(nèi)容,如果子級不實(shí)現(xiàn)會默認(rèn)顯示。如果實(shí)現(xiàn)則會覆蓋。
內(nèi)容捕捉
<body><h2>最新上架商品信息</h2>{*在smarty許多標(biāo)簽里邊都有assign屬性作用:把標(biāo)簽包含的內(nèi)容都賦予assign變量里邊像include標(biāo)簽也有該屬性,有assign屬性的標(biāo)簽內(nèi)容,不給立即顯示,必須通過變量輸出。*}{capture name="gds" assign="shangpin"}{foreach $gd as $k => $v}{$v@iteration}---{$v}<br />{/foreach}{/capture}{$smarty.capture.gds}<h2>用戶非常喜歡的商品信息</h2>{$smarty.capture.gds}<h2>本月最暢銷商品信息</h2>{$shangpin}</body>變量調(diào)劑器
將變量按照我們所需要的格式輸出
<body><h2>變量調(diào)劑器</h2>{$country}<br />{$country|upper}<br />{$country|lower}<br />{$country|capitalize}{*首字母大寫*}<br />{$country|cat:'beijing':'西三旗'}{*鏈接字符串*}<br />{$smarty.now}<br />{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}<br />{$content}<br />{$content|escape}{*把html標(biāo)簽的<>轉(zhuǎn)為符號實(shí)體*}<br />{$content|replace:'this':'that'|escape}{*對單詞進(jìn)行替換,并且遞歸使用第二個escape調(diào)劑器*}<br />{$introduce}<br />{$introduce|truncate:22:'..':true}{*默認(rèn)給按照單詞截取*}<br /></body>緩存
緩存分為:頁面、數(shù)據(jù)
頁面緩存:把php解釋器解釋好的內(nèi)容給放到一個單獨(dú)文件里邊,這個單獨(dú)文件可以被反復(fù)調(diào)用。
模板文件、編譯文件、緩存文件
緩存文件:編譯文件經(jīng)過php模塊編譯運(yùn)行生成的靜態(tài)內(nèi)容形成的文件就是緩存文件。
緩存具體設(shè)置:
①設(shè)置緩存文件目錄cache
②開啟緩存設(shè)置: smarty?>caching=true;③調(diào)用方法:smarty -> display(); 該display方法會判斷caching屬性是否開啟,若開啟會把具體的“緩存文件”給自動創(chuàng)建好
display()方法
該方法的作用
1.加載模板文件
2.判斷是否開啟緩存和是否有緩存文件,如果都符合,則直接調(diào)用緩存文件返回給用戶結(jié)果。
如果有開啟緩存,則會生成緩存文件;緩存文件已經(jīng)過期,也會重新給生成。
3.判斷是否有對應(yīng)的編譯文件,有則直接加載,通過php模塊解釋返回。
4.如果沒有開啟緩存、也沒有對應(yīng)編譯文件,則對模板文件進(jìn)行編譯,再把編譯文件給php模塊解釋,最后返回。
緩存文件更新
①對應(yīng)的模板文件發(fā)生更新操作
②可以給緩存文件設(shè)置過期時間
$smarty -> cache_lifetime = 3600;
緩存有效期判斷有兩個:
①Smarty的成員屬性判斷cache_lifetime。
②可以根據(jù)緩存文件本身的有效期時間進(jìn)行判斷。
緩存caching設(shè)置
① smarty?>caching=1或true;該情況有效期判斷根據(jù)Smarty成員屬性cachelifetime判斷②smarty -> caching = 2; 該情況有效期判斷根據(jù) 緩存文件本身有效期時間的有效判斷。
單模板多緩存
緩存文件刪除
clearCache(模板) 刪除指定模板對應(yīng)的全部緩存文件
clearCache(模板,標(biāo)志) 刪除當(dāng)前模板指定標(biāo)志的緩存文件
clearAllCache() 刪除全部的緩存文件
局部不緩存4種方法
① {變量名稱??nocache}???{$title??nocache}??
②smarty -> assign(name,value,true);
③ {nocache}內(nèi)部內(nèi)容都不給緩存foreach{/nocache}
④ insert 函數(shù)不緩存設(shè)置
緩存集合
緩存集合:是對單模板多緩存升級的一種緩存效果
http://wangzhan/goods.php?brand=samsung&price=3&network=unicom&screen=4&color=black
緩存集合:要把商品全部的參數(shù)做“排序組合”,每種情況都設(shè)置一個緩存文件
與MVC結(jié)合使用
①在入口文件引入Smarty
②在父類控制器里邊實(shí)例化Smarty對象,通過父類屬性接收該對象
③在子類里邊調(diào)用父類的smarty屬性,進(jìn)行smarty相關(guān)操作。
緩存文件制作
ob_get_contents() 抓取php緩存區(qū)內(nèi)容注意:抓取該函數(shù)以上行的內(nèi)容 php緩沖區(qū)開關(guān) ① ob_start(); 開啟php緩沖區(qū) ② php.ini output_buffering = 4096 開啟output_buffering = Off 關(guān)閉ob_clean() 清除php緩沖區(qū)內(nèi)容清除當(dāng)前行以上的緩沖區(qū)內(nèi)容,以下行的內(nèi)容仍然可以抓取使用ob_get_clean() 抓取緩沖區(qū)內(nèi)容,并清除之抓取/刪除 當(dāng)前行以上的信息,以下行信息沒有影響過濾器
<?phpinclude "./MySmarty.class.php";$smarty = new MySmarty;$smarty -> caching = 1;//① 前置過濾器pre//$smarty -> registerFilter("pre",處理函數(shù)); $smarty -> registerFilter("pre","beforeC");//$tpl是"模板文件"內(nèi)容 function beforeC($tpl){//刪除$tpl的注釋內(nèi)容return preg_replace("/<!--.*-->/","",$tpl); } /*$mark: 表示過濾器類型(前置、后置、輸出)function registerFilter($mark,$callback){$cont = file_get_contents(模板文件名稱);//獲得模板內(nèi)容$callback($cont);} *///② 后置過濾器post // 給混編文件統(tǒng)一設(shè)置作者信息 $smarty -> registerFilter("post","afterC"); //$tpl 是編譯后的混編代碼內(nèi)容 function afterC($tpl){return "<!--create by itcast0421-->".$tpl; }//③ 輸出過濾器output // 對關(guān)鍵字進(jìn)行過濾 $smarty -> registerFilter("output","outC"); //是php模塊解釋后的靜態(tài)內(nèi)容 function outC($tpl){return str_replace('2014-06-14','date20140614',$tpl); }$smarty -> assign('qi','2014-06-14');$smarty -> clearCompiledTemplate('03.html');//清除舊的編譯文件$smarty -> display('03.html');數(shù)據(jù)對象、注冊對象
數(shù)據(jù)對象
<?phpinclude "./MySmarty.class.php";$smarty = new MySmarty;//有時候,頁面內(nèi)容非常多,這樣不同程序員開發(fā)自己的php代碼, //調(diào)用自己的一部分模板//由于頁面非常大,彼此定義的變量名稱"一致"//以下變量其實(shí)是最后一個會起作用 //解決: // ① 把變量名稱給改一下 // 不推薦,代碼高耦合,一個地方修改另一個地方也要修改 // ② 把頁面調(diào)用調(diào)到前面 // 不推薦,display代碼受到位置限制 // ③ 利用數(shù)據(jù)對象實(shí)現(xiàn)//三個盒子(數(shù)據(jù)對象) $data1 = $smarty -> createData(); $data2 = $smarty -> createData(); $data3 = $smarty -> createData();//通過數(shù)據(jù)對象$data1 $data2 $data3為各自模板傳遞變量信息 $title = "烏克蘭發(fā)送內(nèi)戰(zhàn)"; $data1 -> assign('title', $title); //為當(dāng)前盒子填充變量信息 $data1 -> assign('age',20);$title = "京津冀一體化"; $data2 -> assign('title', $title);//為當(dāng)前盒子填充變量信息 $data2 -> assign('age',21);$title = "巴西世界杯"; $data3 -> assign('title', $title);//為當(dāng)前盒子填充變量信息 $data3 -> assign('age',22);$smarty -> display("041.html", $data1); //在自己盒子獲得變量信息 $smarty -> display("042.html", $data2); $smarty -> display("043.html", $data3);注冊對象
在php里邊可以給模板傳遞一個對象變量,對象可以通過”->”調(diào)用自己的屬性和方法。
注冊對象:可以限制對象在模板中調(diào)用什么方法/屬性。
與已有項(xiàng)目結(jié)合
引入smarty后,auto_load自動加載失效。
Smarty與已有框架結(jié)合重點(diǎn):把加載機(jī)制級別設(shè)置與Smarty一致。
spl_autoload_register聲明會覆蓋原始的autoload加載機(jī)制,引入全部的加載機(jī)制都聲明為spl_autoload_register就可以分別執(zhí)行。
spl_autoload_register(“__autoload”);
總結(jié)
以上是生活随笔為你收集整理的Smarty模板技术学习(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android之多线程断点下载
- 下一篇: 大数据生态圈常用组件(二):概括介绍、功