Discuz模板類的點滴說明

 
template.php [php] <?php /** * Nianhua.L PHP Template Class * * @author 年華 <Email/MSN [email]nianhua.liu@gmail.com[/email]> <QQ:30773700> * @link master8.net * @version 1.0 * @copyright 2006 Master8.NET * @package Nianhua.L PHPTC */ class template {     /**      * 模板文件存放目錄[Template file dir]      *      * @var string      */                var $tpl_default_dir;     /**      * 模板刷新時間[Template refresh time]      *      * @var int      */                var $tpl_refresh_time;     /**      * 返回編譯後的模板文件[Return compiled file]      *      * @return string      */         function tpl($file){                 $tplfile=$this->tpl_default_dir."/".$file.".htm";                 $compiledtpldir=$this->tpl_default_dir.".tpl";//構造編譯目錄[Define compile dir]                 $compiledtplfile=$compiledtpldir."/".$file.".tpl.php";//構造編譯文件[Define compile file]                 is_dir($compiledtpldir) or @mkdir($compiledtpldir,0777);                                if(!file_exists($compiledtplfile) || (time()-@filemtime($compiledtplfile) > $this->tpl_refresh_time))//文件不存在或者建立日期超出刷新時間                 {                         $this->tpl_compile($tplfile,$compiledtplfile);//編譯模板[Compile template]                 }                 clearstatcache();                 return $compiledtplfile;         }     /**      * 編譯模板文件[Compile template]      *      * @return boolean      */         function tpl_compile($tplfile,$compiledtplfile){                 $str=$this->tpl_read($tplfile);                 $str=$this->tpl_parse($str,$language);                 if($this->tpl_write($compiledtplfile,$str))                 {                         return true;                 }                 return false;               }     /**      * 解析模板文件[Parse template]      *      * @return string      */         function tpl_parse($str){                 $str=preg_replace("/([\n\r]+)\t+/s","\\1",$str);                 $str=preg_replace("/\<\!\-\-\{(.+?)\}\-\-\>/s", "{\\1}",$str);                 $str=preg_replace("/\{template\s+(.+)\}/","\n<?php include template(\\1); ?>\n",$str);                 $str=preg_replace("/\{include\s+(.+)\}/","\n<?php include \\1; ?>\n",$str);                 $str=preg_replace("/\{if\s+(.+?)\}/","<? if(\\1) { ?>",$str);                 $str=preg_replace("/\{else\}/","<? } else { ?>",$str);                 $str=preg_replace("/\{elseif\s+(.+?)\}/","<? } elseif (\\1) { ?>",$str);                 $str=preg_replace("/\{\/if\}/","<? } ?>",$str);                 $str=preg_replace("/\{loop\s+(\S+)\s+(\S+)\}/","<? if(is_array(\\1)) foreach(\\1 AS \\2) { ?>",$str);                 $str=preg_replace("/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/","\n<? if(is_array(\\1)) foreach(\\1 AS \\2 => \\3) { ?>",$str);                 $str=preg_replace("/\{\/loop\}/","\n<? } ?>\n",$str);                 $str=preg_replace("/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\((.+)\))\}/","<?=\\1?>",$str);                 $str=preg_replace("/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\((.+)\))\}/","<?=\\1?>",$str);                 $str=preg_replace("/\{(\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/","<?=\\1?>",$str);                 $str=preg_replace("/\{(\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\}/s", "<?=\\1?>",$str);                 $str=preg_replace("/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/s", "<?=\\1?>",$str);                 $str="<? if(!defined('IN')) exit('Access Denied'); ?>\n".$str;//防止直接瀏覽模板編譯文件                 return $str;         }     /**      * 讀取模板源文件[Read resource file]      *      * @return string      */         function tpl_read($tplfile){                 if($fp=@fopen($tplfile,"r") or die('Can not open tpl file'))                 {                         $str=fread($fp,filesize($tplfile));                         fclose($fp);                         return $str;                        }                 return false;         }     /**      * 寫入模板編譯文件[Write compiled file]      *      * @return boolean      */         function tpl_write($compiledtplfile,$str){                 if($fp=@fopen($compiledtplfile,"w") or die('Can not open tpl file'))                 {                         flock($fp, 3);                         if(@fwrite($fp,$str) or die('Can not write tpl file'))                         {                                 fclose($fp);                                 return true;                         }                         fclose($fp);                 }                 return false;         } } ?> [/php] 使用舉例 在程序目錄下建templates/default文件夾,裏面隨便寫個模板文件index.html,內容爲{$index} 在程序目錄下建index.php,內容以下 [php] <?php define('IN', TRUE); //定義常量,防止直接瀏覽模板編譯文件 $rootpath = dirname(__FILE__); //獲取站點根目錄 $tpl_refresh_time = 120;// 模板刷新(以秒爲單位)時間,0爲不緩存 $tpl_default_dir = $rootpath.'/templates/default';//默認模板存放目錄[推薦分別定義文件夾,而後組合] require $rootpath.'/template.php'; $t = new template; $t->tpl_default_dir = $tpl_default_dir; $t->tpl_refresh_time = $tpl_refresh_time; $index = 'This is index'; include $t->tpl('index'); ?> [/php] 模板解析的規則    一、變量表示       {$name}被解析成<?=$name?>,表示顯示變量$name的值,其中的「name」由英文字母、數字和下劃線組成首字母必須是英文字母或者下劃線。    二、常量表示       {name}被解析成<?=name?>,表示顯示常量name的值,其中的「name」由英文字母、數字和下劃線組成首字母必須是英文字母或者下劃線。    三、條件判斷       {if *} * {else} * {elseif} * {/if} 或者 {if *} * {/if},其中{if *}中的*就是此判斷語句的條件表達式,符合php的表達式。    四、循環       {loop $a $b} * {/loop} 或者 {loop $a $b $c} * {/loop} ,{loop $a $b} * {/loop}被解析成<? if(is_array($a)) foreach($a AS $b) { ?> * <? } ?> ,而{loop $a $b $c} * {/loop}則被解析成 <? if(is_array($a)) foreach($a AS $b=>$c) { ?> * <? } ?>    五、函數       {$fun($a,$b)}被解析成<? fun($a,$b); ?> 呵呵,只是完成了基本功能,能夠簡單使用。 第一次在這裏發東西,你們多提意見...
相關文章
相關標籤/搜索