phpcms 原始碼解析 模板引擎

2021-08-31 19:41:23 字數 3646 閱讀 2854

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...