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