ホームページ  >  記事  >  バックエンド開発  >  Discuz テンプレート エンジン

Discuz テンプレート エンジン

WBOY
WBOYオリジナル
2016-07-25 09:06:181354ブラウズ
Discuz テンプレート エンジン

Discuz のテンプレート エンジンは、かなり前にインターネットで見つけたもので、見た目的には非常に古いバージョンのはずですが、私もそれを使用しています。このテンプレート クラスをダウンロードしてください。

2 つのファイルがあります。テンプレートクラス、テンプレートの置換で使用する必要がある関数
元のアドレス: http://blog.qita.in

  1. ?/**
  2. * テンプレート クラス - Discuz テンプレート エンジンを使用して解析されます
  3. * http://blog.qita.in
  4. */
  5. require_once (DIR_ROOT . '/../function/template.func.php');
  6. class Template {
  7. const DIR_SEP = DIRECTORY_SEPARATOR;
  8. /**
  9. * テンプレートインスタンス
  10. *
  11. * @staticvar
  12. * @var オブジェクト Template
  13. */
  14. protected static $_instance;
  15. /**
  16. * テンプレートパラメータ情報
  17. *
  18. * @var 配列
  19. */
  20. protected $_options = array();
  21. /**
  22. * シングルトンモード呼び出しメソッド
  23. *
  24. * @static
  25. * @return object Template
  26. */
  27. public static function getInstance( ) {
  28. if (!self :: $_instance instanceof self)
  29. self :: $_instance = new self();
  30. return self :: $_instance;
  31. }
  32. /**
  33. * コンストラクター
  34. *
  35. * @return void
  36. */
  37. プライベート関数 __construct () {
  38. $this -> _options = array('template_dir' => 'templates' . self :: DIR_SEP, // テンプレート ファイルがあるディレクトリ
  39. 'cache_dir' => 'templates' . self :: DIR_SEP . self :: DIR_SEP, // キャッシュ ファイルが保存されるディレクトリ
  40. 'auto_update' => // テンプレート ファイルが変更されたときにキャッシュを再生成するかどうか
  41. 'cache_lifetime' => 0, // キャッシュのライフ サイクル (分)、0 は永続的を意味します
  42. );
  43. }
  44. /**
  45. * テンプレートパラメータ情報を設定します
  46. *
  47. * @param array $options パラメータ配列
  48. * @return void
  49. */
  50. public function setOptions(array $options) {
  51. foreach ($options as $name => $value)
  52. $this - > set($name, $value);
  53. }
  54. /**
  55. * テンプレートパラメータを設定します
  56. *
  57. * @param string $name パラメータ名
  58. * @parammixed $value パラメータ値
  59. * @return void
  60. */
  61. public function set($name, $value) {
  62. switch ($name) {
  63. case 'template_dir':
  64. $ value = $this ->trimpath($value);
  65. if (!file_exists($value))
  66. $this -> _throwException("指定されたテンプレート ディレクトリ "$value"" はありませんでした見つかりました);
  67. $this -> ; _options['template_dir'] = $value;
  68. ブレーク;
  69. case 'cache_dir':
  70. $value = $this -> _trimpath($value);
  71. if (!file_exists($) value))
  72. $this -> ; _throwException("指定されたキャッシュ ディレクトリ "$value" が見つかりませんでした);
  73. $this -> _options['cache_dir'] = $value;
  74. Break;
  75. case 'auto_update' :
  76. $this -> _options[ 'auto_update'] = (ブール値) $value;
  77. ブレーク;
  78. case 'cache_lifetime':
  79. $this -> _options['cache_lifetime'] = (float) $value;
  80. ブレーク;
  81. デフォルト:
  82. $this -> ; _throwException("不明なテンプレート構成オプション "$name"");
  83. }
  84. }
  85. /**
  86. * マジックメソッドでテンプレートパラメータを設定します
  87. *
  88. * @see Template::set()
  89. * @param string $name パラメータ名
  90. * @parammixed $value パラメータ値
  91. * @return void
  92. */
  93. public function __set($name, $value) {
  94. $this -> set( $name, $value);
  95. }
  96. /**
  97. * テンプレートファイルを取得
  98. *
  99. * @param string $file テンプレートファイル名
  100. * @return string
  101. */
  102. public function getfile($file) {
  103. $cachefile = $this -> _getCacheFile($file) ;
  104. if (!file_exists($cachefile))
  105. $this ->cache($file);
  106. return $cachefile;
  107. }
  108. /**
  109. * テンプレートファイルのキャッシュ更新が必要か確認
  110. *
  111. * @param string $file テンプレートファイル名
  112. * @param string $md5data テンプレートファイル md5検証情報
  113. * @param integer $md5data テンプレートファイルの有効期限検証情報
  114. * @return void
  115. */
  116. public function check($file, $md5data) , $expireTime) {
  117. if ( $this -> _options['auto_update'] && md5_file($this -> _getTplFile($file)) != $md5data)
  118. $this ->
  119. if ($this -> _options['cache_lifetime'] != 0 && (time() - $expireTime >= $this -> _options['cache_lifetime'] * 60))
  120. $this -> ($file);
  121. }
  122. /**
  123. * テンプレート ファイルをキャッシュします
  124. *
  125. * @param string $file テンプレート ファイル名
  126. * @return void
  127. */
  128. パブリック関数キャッシュ($file) {
  129. $tplfile = $this -> _getTplFile($file);
  130. if (!is_readable($tplfile) )) {
  131. $this -> ; _throwException("テンプレート ファイル "$tplfile" が見つからないか、開けませんでした");
  132. }
  133. // テンプレートのコンテンツを取得します
  134. $template = file_get_contents($tplfile);フィルタ/s", "{\1}", $template);
  135. // 言語パック変数を置換します
  136. // $template = preg_replace("/{langs+(.+?)}/ies", " languagevar('\1')", $template);
  137. // PHP 改行文字を置換します
  138. $template = str_replace("{LF}", "="\n"?>", $template);
  139. // 直接変数の出力を置き換えます
  140. $varRegexp = "((\$[a-zA-Z_x7f-xff][a-zA- Z0-9_x7f-xff]*)"
  141. . "([[a-zA-Z0-9_-."'[]$x7f-xff]+])*)";
  142. $template = preg_replace("/{( \$[a-zA-Z0-9_[]'"$.x7f-xff]+)}/s", "=\1?>", $template);
  143. $template = preg_replace(" /$varRegexp/es", "addquote('=\1?>')", $template);
  144. $template = preg_replace("/==$varRegexp?>? >/es", "addquote('=\1?>')", $template);
  145. // テンプレート読み込みコマンドを置き換えます
  146. $template = preg_replace("/[nrt]*{templates+( [ a-z0-9_]+)}[nrt]*/is",
  147. "rn include($template->getfile('\1')) ?>rn",
  148. $template
  149. );
  150. $template = preg_replace("/[nrt]*{templates+(.+?)}[nrt]*/is",
  151. "rn include($template->getfile(\1)); ?> ; rn",
  152. $template
  153. );
  154. // 特定の関数を置換
  155. $template = preg_replace("/[nrt]*{evals+(.+?)}[nrt]*/ies",
  156. "stripvtags('< ; ? \1 ?>','')",
  157. $template
  158. );
  159. $template = preg_replace("/[nrt]*{echos+(.+?)}[nrt]*/ies",
  160. " (' echo \1; ?>','')",
  161. $template
  162. );
  163. $template = preg_replace("/([nrt]*){elseifs+(.+?)}([ nrt ]*)/ies",
  164. "stripvtags('\1 } elseif(\2) { ?>\3','')",
  165. $template
  166. );
  167. $template = preg_replace("/ ( [nrt]*){else}([nrt]*)/is",
  168. "\1 } else { ?>\2",
  169. $template
  170. );
  171. // ループ関数と条件判定文を置き換える
  172. $nest = 5;
  173. for ($i = 0; $i $template = preg_replace("/[nrt]*{loops+(S+)s+(S+)}[nr ] *(.+?)[nr]*{/loop}[nrt]*/ies",
  174. "stripvtags(' if(is_array(\1)) { foreach(\1 as \2) { ? > ;','\3 } } ?>')",
  175. $template
  176. );
  177. $template = preg_replace("/[nrt]*{loops+(S+)s+(S+)s+(S+)} [ nrt]*(.+?)[nrt]*{/loop}[nrt]*/ies",
  178. "stripvtags(' if(is_array(\1)) { foreach(\1 as \2 = > ; \3) { ?>','\4 } } ?>')",
  179. $template
  180. );
  181. $template = preg_replace("/([nrt]*){ifs+(.+ ? )}([nr]*)(.+?)([nr]*){/if}([nrt]*)/ies",
  182. "stripvtags('\1 if(\2) { ? > ;\3','\4\5 } ?>\6')",
  183. $template
  184. );
  185. }
  186. // 定数置換
  187. $template = preg_replace("/{([a-zA - Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)}/s",
  188. "=\1?>",
  189. $template
  190. );
  191. // PHP コードブレーク 余分なスペースを削除と改行
  192. $template = preg_replace("/ ?>[nr]* /s", " ", $template);
  193. // その他の置換
  194. $template = preg_replace("/"(http )? [w./:]+?[^"]+?&[^"]+?"/e",
  195. "transamp('\0')",
  196. $template
  197. );
  198. $template = preg_replace (" /<script>]*?src="(.+?)".*?>s*</script>/ise",
  199. "stripscriptamp('\1')",
  200. $template
  201. );
  202. $template = preg_replace("/[nrt]*{blocks+([a-zA-Z0-9_]+)}(.+?){/block}/ies",
  203. "stripblock(' \1 ', '\2')",
  204. $template
  205. );
  206. // md5 と有効期限チェックを追加します
  207. $md5data = md5_file($tplfile);
  208. $expireTime = time();
  209. $template = "< ;? (!class_exists('template')) die('アクセスが拒否されました');"
  210. . "$template->getInstance()->check('$file', '$md5data', $expireTime) ;"
  211. . "?>rn$template";
  212. // キャッシュファイルを書き込む
  213. $cachefile = $this -> _makepath($cachefile); makepath !== true)
  214. $this -> _throwException("キャッシュ ディレクトリ "$makepath" を作成できません");
  215. file_put_contents($cachefile, $template);
  216. }
  217. /**
  218. * オペレーティング システムに適した形式にパスを修正します
  219. *
  220. * @param string $path パス名
  221. * @return string
  222. */
  223. protected function _trimpath($path) {
  224. return str_replace(array('/', '\', '//', '\\'), self :: DIR_SEP, $path);
  225. }
  226. / **
  227. * テンプレートファイル名とパスを取得します
  228. *
  229. * @param string $file テンプレートファイル名
  230. * @return string
  231. */
  232. protected function _getTplFile($file) {
  233. return $this -> _trimpath($this -> _options['template_dir'] . self :: DIR_SEP . $file);
  234. }
  235. /**
  236. * テンプレートキャッシュファイル名とパスを取得します
  237. *
  238. * @param string $file テンプレートファイル名
  239. * @return string
  240. */
  241. 保護関数 _getCacheFile($file) {
  242. $file = preg_replace('/.[a-z0-9-_]+$/i', '.cache.php', $file);
  243. $this を返す -> _trimpath($this -> _options['cache_dir'] . self :: DIR_SEP . $file);
  244. }
  245. /**
  246. * 指定されたパスに基づいて存在しないフォルダーを作成します
  247. *
  248. * @param string $path パス/フォルダー名
  249. * @return string
  250. */
  251. 保護された関数 _makepath($path) {
  252. $dirs =explode( self :: DIR_SEP, dirname($this -> _trimpath($path)));
  253. $tmp = '';
  254. foreach ($dirs as $dir) {
  255. $tmp .= $dir . self :: DIR_SEP;
  256. if (!file_exists($tmp) && !@mkdir($tmp, 0777))
  257. return $tmp;
  258. }
  259. return true;
  260. }
  261. /**
  262. * エラーメッセージをスローします
  263. *
  264. * @param string $message
  265. * @return void
  266. */
  267. protected function _throwException($message) {
  268. throw new Exception($message);
  269. }
  270. }
  271. ?>
复制代
  1. モパネル関数文件
  2. /**
  3. * テンプレートの差し替えに必要な機能
  4. * http://blog.qita.in
  5. */
  6. function transamp($template) {
  7. $template = str_replace('&', '&', $template);
  8. $template = str_replace('&', '&', $template);
  9. $template = str_replace('"', '"', $template);
  10. return $template;
  11. }
  12. functionstripvtags ($expr, $statement) {
  13. $expr = str_replace("\"", """, preg_replace("/=(\$.+?)?>/s", "\1", $expr));
  14. $statement = str_replace("\"", """, $statement);
  15. return $expr 。 $statement;
  16. }
  17. function addquote($var) {
  18. return str_replace("\"", """, preg_replace("/[([a-zA-Z0-9_-.x7f-xff]+)] /s", "['\1']", $var));
  19. }
  20. functionstripscriptamp($s) {
  21. $s = str_replace('&', '&', $s);
  22. return "";
  23. }
  24. functionstripblock($var, $s) {
  25. $s = str_replace('\"' , '"', $s);
  26. $s = preg_replace("/=\$(.+?)?>/", "{$\1}", $s);
  27. preg_match_all(" /=(.+?)?>/e", $s, $constary);
  28. $constadd = '';
  29. $constary[1] = array_unique($constary[1]);
  30. foreach( $constary[1] を $const) {
  31. $constadd .= '$__' 。 $const 。 = ' 。 $const 。 ';';
  32. }
  33. $s = preg_replace("/=(.+?)?>/", "{$__\1}", $s);
  34. $s = str_replace('? >', "n$$var .= $s = str_replace('', "nEOF;n", $s);
  35. return "";
  36. }
  37. ?>
复制幣


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。