昨天跟到了phpcms系統初始化到控制器流程,今天阿唐屌絲帶大家一起分析phpcms模版機制,控制器 在進行一些邏輯操作后 就開始渲染 視圖顯示 用到 template函數,所以要搞清phpcms模版機制,這個函數是必須看的,代碼如下:
- function template($module = ‘content’, $template = ‘index’, $style = ”) {
- //默認模塊為content.默認模版文件為index
- if(strpos($module, ‘plugin/’)!== false) {
- //檢測模塊里面是否包含plugin字符 這里進行了對插件模版的判斷 插件模版需要用p_template解析
- $plugin = str_replace(‘plugin/’, ”, $module);
- return p_template($plugin, $template,$style);
- }
- $module = str_replace(‘/’, DIRECTORY_SEPARATOR, $module);
- //路徑兼容性處理
- if(!emptyempty($style) && preg_match(‘/([a-z0-9-_]+)/is’,$style)) {
- } elseif (emptyempty($style) && !defined(‘STYLE’)) {
- //變量STYLE暫時不曉得在哪里初始化的 存在當前網站模版名
- if(defined(‘SITEID’)) {
- $siteid = SITEID;
- } else {
- $siteid = param::get_cookie(‘siteid’);
- }
- if (!$siteid) $siteid = 1;
- $sitelist = getcache(‘sitelist’,'commons’);
- if(!emptyempty($siteid)) {
- $style = $sitelist[$siteid]['default_style'];
- }
- } elseif (emptyempty($style) && defined(‘STYLE’)) {
- $style = STYLE;
- } else {
- $style = ‘default’;
- }
- if(!$style) $style = ‘default’;
- //以上全部為判斷 當前網站 應該用哪個模版 風格
- $template_cache = pc_base::load_sys_class(‘template_cache’);
- //載入template_cache類
- $compiledtplfile = PHPCMS_PATH.’caches’.DIRECTORY_SEPARATOR.’caches_template’.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.’.php’;
- //組合當前模塊模版緩存文件地址
- if(file_exists(PC_PATH.’templates’.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.’.html’)) {
- //如果模版文件存在
- if(!file_exists($compiledtplfile) || (@filemtime(PC_PATH.’templates’.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.’.html’) > @filemtime($compiledtplfile))) {//如果緩存文件不存在既沒有編譯模版 或者 模版的修改時間超過了系統設置緩存更新時間 從新編譯模版緩存
- $template_cache->template_compile($module, $template, $style);
- }
- } else {
- //如果模版文件不存在
- $compiledtplfile = PHPCMS_PATH.’caches’.DIRECTORY_SEPARATOR.’caches_template’.DIRECTORY_SEPARATOR.’default’.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.’.php’;
- if(!file_exists($compiledtplfile) || (file_exists(PC_PATH.’templates’.DIRECTORY_SEPARATOR.’default’.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.’.html’) && filemtime(PC_PATH.’templates’.DIRECTORY_SEPARATOR.’default’.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.’.html’) > filemtime($compiledtplfile))) {//上面判斷了模版不存在,這個時候開始判斷默認模版路徑對應模版是否存在,可以做到知道用默認default模版替換,如果默認的模版的 緩存 文件 不存在 或者 存在 默認的模版 但時間超過了 系統設置緩存時間 在從新編譯模版
- $template_cache->template_compile($module, $template, ‘default’);
- } elseif (!file_exists(PC_PATH.’templates’.DIRECTORY_SEPARATOR.’default’.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.’.html’)) {//模版不存在
- showmessage(‘Template does not exist.’.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.’.html’);
- } //Vevb.com
- }
- return $compiledtplfile;//返回編譯文件
- }
整個邏輯很簡單 判斷 稍微有點長
這里我們可以分析到 phpcms模擬為編譯型的模版解析過程,template函數主要是控制 模版解析類工作 情況 整個編譯 過程 由template_cache類完成,要想了解整個模版編譯過程 還需要讀 這個類.
新聞熱點
疑難解答