phpcms 整站**分析講解(六)之模板引擎
發布:水水
19 may
<?php
/**函式 template函式是在global.func.php 裡面定義的。 在前面的phpcms 的首頁 index.php 裡就見到了。 用法: include template() 用法很熟, 呵呵其實和 dz 的模板引擎一樣的用法。 但dz的模板引擎比 phpcms 的簡單很多,因為沒有用到模板的標籤技術。 大家有空可以研究下dz的模板引擎。這裡不說。 好分析下上面這個 模板的主要函式吧。 他的作用是返回編譯好的模板檔案路徑。也就是把模板 x.html(模板檔案) 用正則替換成 x.php(編譯後的php檔案).然後使用 include 函式。懂了吧! php的模板引擎都乙個鳥樣。 然後剩下的就是正則的東西了。等下再說。
*/function template($module = 'phpcms', $template = 'index')
}return $compiledtplfile; // 返回 模板編譯後的php檔案路徑。
}defined('in_phpcms') or exit('access denied');
function template_compile($module,$template) //和下面那個一樣是編譯模板啟動函式。不過兩函式的引數不一樣,按照上下文意思。這個函式是為了配合批量編譯模板而寫的。第乙個是模組目錄名,第二是模板檔名,解釋同下。請看下面那個
function template_refresh($tplfile,$compiledtplfile) //模板編譯啟動函式。 引數 第乙個是 模板檔名 第二個是 編譯後的php檔名
正則替換成 <?php if(xx > xx)
function template_module($module)//這個很有用。批量編譯某模組目錄下的模板檔案
}return true;
}function template_cache() //這個是比上面那個更大批量的生成。因為 $module 裡面的所有模組 $module 存在於快取檔案模板。前面已經說了。自己看吧
return true;
}/**
哇,別給它嚇到。其實都是些簡單的正則。只要知道他們是幹什麼的就好辦了。 在模板裡面我們使用了些自己定義的標籤呀。語句呀。這些東西不是php標準語法。所以根本不可能執行。
那麼怎麼辦呢。通過正則對我們自己定義的語法 。轉變成標準的php語法。然後寫到我們的 php檔案裡。所以下面正則都是對我們自己定義的語法進行編譯。
*/function template_parse($str)
\-\-\>/s", "",$str);
$str = preg_replace("/\/","\n<?php include template(\\1); ?>\n",$str);
/* 把模板裡面的 編譯成php標準寫法:<?php include template('xx','jj') ?> 大家可能一看就明白了: include template() 這個在那裡見過。對了。這個在php裡也可以執行的。因為 template() 函式不是定義了嗎。*/
$str = preg_replace("/\/","\n<?php include \\1; ?>\n",$str);
/* 模板裡面的 編譯成 php檔案裡的 <?php include xx.php?>**/
$str = preg_replace("/\/","\n<?php \\1?>\n",$str);
/* 模板裡面的 編譯成 <?php ***x?> 大家也應該明白了。 ***x 肯定是php的標準語法拉。 所以phpcms模板語句: 就是用來給你在模板裡寫要執行的php語句。在smarty 裡也有這功能**/
$str = preg_replace("/\/","<?php if(\\1) 編譯成 <?php if()/","<?php } else 轉 <?php } else /","<?php } elseif (\\1) 轉 <?php } elseif /","<?php } ?>",$str);
$str = preg_replace("/\/","<?php if(is_array(\\1)) foreach(\\1 as \\2) 其實編譯成了php的 foreach(xx as jj) 這樣大家都會用了吧**/
$str = preg_replace("/\/","\n<?php if(is_array(\\1)) foreach(\\1 as \\2 => \\3) 成 foreach(xx as jj=> yy)**/
$str = preg_replace("/\/","\n<?php } ?>\n",$str);
/* 迴圈結束別忘了 對應php的 <?php }?>**/
$str = preg_replace("/\]+)\}/e", "get_tag('\\1')", $str);
/* 替換為 get_tag('xx') get_tag() 函式是自己定義的函式,因為phpcms 的模板引擎應用了標籤功能。這個函式就是為了呼叫標籤的。**/
$str = preg_replace("/\]*)\))\}/","<?php echo \\1;?>",$str);
/* 這麼個奇怪的東西。因為奇怪所以我找了下phpcms的模板檔案。找了幾個檔案都沒發現這個怪物。大家有誰找到的說下我去看下。怕是我理解錯了正則。先謝了**/
$str = preg_replace("/\]*)\))\}/","<?php echo \\1;?>",$str);
/* 專換成 <?php echo ***(wwsd)?> 當然了 ***() 是程式中定義過的函式**/
$str = preg_replace("/\/]\\$[a-za-z_\x7f-\xff][a-za-z0-9_\x7f-\xff]*)\}/","<?php echo \\1;?>",$str);
/* 把 轉成 <?php echo $xxjj?> 當然了是把變數輸出**/
$str = preg_replace("/\/es", "addquote('<?php echo \\1;?>')",$str);
/* 主要是把 轉成 <?php echo $***['jj']?> addquote() 函式自己定義的看下面,二次過濾。有代驗證,頭昏了看太久的黃色字。我昏**/
$str = preg_replace("/\/s", "<?php echo \\1;?>",$str);
/* <?php echo xxjj?> xxjj 是我們定義的常量**/
$str = "<?php defined('in_phpcms') or exit('access denied'); ?>".$str;
/* 最後別忘了在自己的每個編譯後的檔案裡加上這個。以前講過了不明白找前面例子**/
return $str; //最後返回過濾完成的內容
}function get_tag($tagname) //這個函式在 上面這個編譯函式裡面看到了。 其實就是獲取對應標籤的內容,頭有點昏,下節再說標籤吧。
';$code = isset($html[$tagname]) ? 'tag_read('.$html[$tagname].')' : $tags[$tagname];
return "<?php echo $code;?>";
}function addquote($var)
?>
[size=xx-small][/size]
phpcms原始碼解析(2)
1 程式啟動邏輯 2 路由初始化 程式啟動之初有乙個路由初始化的過程 param pc base load sys class param returnself load class param path,initialize 目的只是為了載入 phpcms libs classes param.c...
vue原始碼解析2 模板解析
從上節的第 5 步,引出模板解析,將el的所有子節點取出,新增到乙個新建的文件fragment物件中,對fragment中的所有層次子節點遞迴進行編譯解析處理。文字節點 從data中取出表示式對應的屬性值,設定為文字節點的textcontent 元素節點 獲取節點屬性,判斷是否是指令 解析指令 fu...
phpcms原始碼跟蹤(1)
本次跟蹤解決幾個問題 1 快取檔案從 來,過程中被刪除了怎麼辦 2 模板html是如何被引入的 進入首頁時,通過最初的呼叫,進入控制器 phpcms modules content index.php init 中 public function init else siteid globals s...