Discuz のテンプレート エンジンは、かなり前にインターネットで見つけたもので、見た目的には非常に古いバージョンのはずですが、私もそれを使用しています。このテンプレート クラスをダウンロードしてください。 2 つのファイルがあります。テンプレートクラス、テンプレートの置換で使用する必要がある関数 元のアドレス: http://blog.qita.in
- ?/**
- * テンプレート クラス - Discuz テンプレート エンジンを使用して解析されます
- * http://blog.qita.in
- */
-
- require_once (DIR_ROOT . '/../function/template.func.php');
- class Template {
- const DIR_SEP = DIRECTORY_SEPARATOR;
-
- /**
- * テンプレートインスタンス
- *
- * @staticvar
- * @var オブジェクト Template
- */
- protected static $_instance;
-
- /**
- * テンプレートパラメータ情報
- *
- * @var 配列
- */
- protected $_options = array();
-
- /**
- * シングルトンモード呼び出しメソッド
- *
- * @static
- * @return object Template
- */
- public static function getInstance( ) {
- if (!self :: $_instance instanceof self)
- self :: $_instance = new self();
- return self :: $_instance;
- }
-
- /**
- * コンストラクター
- *
- * @return void
- */
- プライベート関数 __construct () {
- $this -> _options = array('template_dir' => 'templates' . self :: DIR_SEP, // テンプレート ファイルがあるディレクトリ
- 'cache_dir' => 'templates' . self :: DIR_SEP . self :: DIR_SEP, // キャッシュ ファイルが保存されるディレクトリ
- 'auto_update' => // テンプレート ファイルが変更されたときにキャッシュを再生成するかどうか
- 'cache_lifetime' => 0, // キャッシュのライフ サイクル (分)、0 は永続的を意味します
- );
- }
-
- /**
- * テンプレートパラメータ情報を設定します
- *
- * @param array $options パラメータ配列
- * @return void
- */
- public function setOptions(array $options) {
- foreach ($options as $name => $value)
- $this - > set($name, $value);
- }
-
- /**
- * テンプレートパラメータを設定します
- *
- * @param string $name パラメータ名
- * @parammixed $value パラメータ値
- * @return void
- */
- public function set($name, $value) {
- switch ($name) {
- case 'template_dir':
- $ value = $this ->trimpath($value);
- if (!file_exists($value))
- $this -> _throwException("指定されたテンプレート ディレクトリ "$value"" はありませんでした見つかりました);
- $this -> ; _options['template_dir'] = $value;
- ブレーク;
- case 'cache_dir':
- $value = $this -> _trimpath($value);
- if (!file_exists($) value))
- $this -> ; _throwException("指定されたキャッシュ ディレクトリ "$value" が見つかりませんでした);
- $this -> _options['cache_dir'] = $value;
- Break;
- case 'auto_update' :
- $this -> _options[ 'auto_update'] = (ブール値) $value;
- ブレーク;
- case 'cache_lifetime':
- $this -> _options['cache_lifetime'] = (float) $value;
- ブレーク;
- デフォルト:
- $this -> ; _throwException("不明なテンプレート構成オプション "$name"");
- }
- }
-
- /**
- * マジックメソッドでテンプレートパラメータを設定します
- *
- * @see Template::set()
- * @param string $name パラメータ名
- * @parammixed $value パラメータ値
- * @return void
- */
- public function __set($name, $value) {
- $this -> set( $name, $value);
- }
-
- /**
- * テンプレートファイルを取得
- *
- * @param string $file テンプレートファイル名
- * @return string
- */
- public function getfile($file) {
- $cachefile = $this -> _getCacheFile($file) ;
- if (!file_exists($cachefile))
- $this ->cache($file);
- return $cachefile;
- }
-
- /**
- * テンプレートファイルのキャッシュ更新が必要か確認
- *
- * @param string $file テンプレートファイル名
- * @param string $md5data テンプレートファイル md5検証情報
- * @param integer $md5data テンプレートファイルの有効期限検証情報
- * @return void
- */
- public function check($file, $md5data) , $expireTime) {
- if ( $this -> _options['auto_update'] && md5_file($this -> _getTplFile($file)) != $md5data)
- $this ->
- if ($this -> _options['cache_lifetime'] != 0 && (time() - $expireTime >= $this -> _options['cache_lifetime'] * 60))
- $this -> ($file);
- }
-
- /**
- * テンプレート ファイルをキャッシュします
- *
- * @param string $file テンプレート ファイル名
- * @return void
- */
- パブリック関数キャッシュ($file) {
- $tplfile = $this -> _getTplFile($file);
-
- if (!is_readable($tplfile) )) {
- $this -> ; _throwException("テンプレート ファイル "$tplfile" が見つからないか、開けませんでした");
- }
- // テンプレートのコンテンツを取得します
- $template = file_get_contents($tplfile);フィルタ/s", "{\1}", $template);
- // 言語パック変数を置換します
- // $template = preg_replace("/{langs+(.+?)}/ies", " languagevar('\1')", $template);
- // PHP 改行文字を置換します
- $template = str_replace("{LF}", "="\n"?>", $template);
- // 直接変数の出力を置き換えます
- $varRegexp = "((\$[a-zA-Z_x7f-xff][a-zA- Z0-9_x7f-xff]*)"
- . "([[a-zA-Z0-9_-."'[]$x7f-xff]+])*)";
- $template = preg_replace("/{( \$[a-zA-Z0-9_[]'"$.x7f-xff]+)}/s", "=\1?>", $template);
- $template = preg_replace(" /$varRegexp/es", "addquote('=\1?>')", $template);
- $template = preg_replace("/==$varRegexp?>? >/es", "addquote('=\1?>')", $template);
- // テンプレート読み込みコマンドを置き換えます
- $template = preg_replace("/[nrt]*{templates+( [ a-z0-9_]+)}[nrt]*/is",
- "rn include($template->getfile('\1')) ?>rn",
- $template
- );
- $template = preg_replace("/[nrt]*{templates+(.+?)}[nrt]*/is",
- "rn include($template->getfile(\1)); ?> ; rn",
- $template
- );
- // 特定の関数を置換
- $template = preg_replace("/[nrt]*{evals+(.+?)}[nrt]*/ies",
- "stripvtags('< ; ? \1 ?>','')",
- $template
- );
- $template = preg_replace("/[nrt]*{echos+(.+?)}[nrt]*/ies",
- " (' echo \1; ?>','')",
- $template
- );
- $template = preg_replace("/([nrt]*){elseifs+(.+?)}([ nrt ]*)/ies",
- "stripvtags('\1 } elseif(\2) { ?>\3','')",
- $template
- );
- $template = preg_replace("/ ( [nrt]*){else}([nrt]*)/is",
- "\1 } else { ?>\2",
- $template
- );
- // ループ関数と条件判定文を置き換える
- $nest = 5;
- for ($i = 0; $i $template = preg_replace("/[nrt]*{loops+(S+)s+(S+)}[nr ] *(.+?)[nr]*{/loop}[nrt]*/ies",
- "stripvtags(' if(is_array(\1)) { foreach(\1 as \2) { ? > ;','\3 } } ?>')",
- $template
- );
- $template = preg_replace("/[nrt]*{loops+(S+)s+(S+)s+(S+)} [ nrt]*(.+?)[nrt]*{/loop}[nrt]*/ies",
- "stripvtags(' if(is_array(\1)) { foreach(\1 as \2 = > ; \3) { ?>','\4 } } ?>')",
- $template
- );
- $template = preg_replace("/([nrt]*){ifs+(.+ ? )}([nr]*)(.+?)([nr]*){/if}([nrt]*)/ies",
- "stripvtags('\1 if(\2) { ? > ;\3','\4\5 } ?>\6')",
- $template
- );
- }
- // 定数置換
- $template = preg_replace("/{([a-zA - Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)}/s",
- "=\1?>",
- $template
- );
- // PHP コードブレーク 余分なスペースを削除と改行
- $template = preg_replace("/ ?>[nr]* /s", " ", $template);
- // その他の置換
- $template = preg_replace("/"(http )? [w./:]+?[^"]+?&[^"]+?"/e",
- "transamp('\0')",
- $template
- );
- $template = preg_replace (" /<script>]*?src="(.+?)".*?>s*</script>/ise",
- "stripscriptamp('\1')",
- $template
- );
- $template = preg_replace("/[nrt]*{blocks+([a-zA-Z0-9_]+)}(.+?){/block}/ies",
- "stripblock(' \1 ', '\2')",
- $template
- );
- // md5 と有効期限チェックを追加します
- $md5data = md5_file($tplfile);
- $expireTime = time();
- $template = "< ;? (!class_exists('template')) die('アクセスが拒否されました');"
- . "$template->getInstance()->check('$file', '$md5data', $expireTime) ;"
- . "?>rn$template";
- // キャッシュファイルを書き込む
- $cachefile = $this -> _makepath($cachefile); makepath !== true)
- $this -> _throwException("キャッシュ ディレクトリ "$makepath" を作成できません");
- file_put_contents($cachefile, $template);
- }
-
- /**
- * オペレーティング システムに適した形式にパスを修正します
- *
- * @param string $path パス名
- * @return string
- */
- protected function _trimpath($path) {
- return str_replace(array('/', '\', '//', '\\'), self :: DIR_SEP, $path);
- }
-
- / **
- * テンプレートファイル名とパスを取得します
- *
- * @param string $file テンプレートファイル名
- * @return string
- */
- protected function _getTplFile($file) {
- return $this -> _trimpath($this -> _options['template_dir'] . self :: DIR_SEP . $file);
- }
-
- /**
- * テンプレートキャッシュファイル名とパスを取得します
- *
- * @param string $file テンプレートファイル名
- * @return string
- */
- 保護関数 _getCacheFile($file) {
- $file = preg_replace('/.[a-z0-9-_]+$/i', '.cache.php', $file);
- $this を返す -> _trimpath($this -> _options['cache_dir'] . self :: DIR_SEP . $file);
- }
-
- /**
- * 指定されたパスに基づいて存在しないフォルダーを作成します
- *
- * @param string $path パス/フォルダー名
- * @return string
- */
- 保護された関数 _makepath($path) {
- $dirs =explode( self :: DIR_SEP, dirname($this -> _trimpath($path)));
- $tmp = '';
- foreach ($dirs as $dir) {
- $tmp .= $dir . self :: DIR_SEP;
- if (!file_exists($tmp) && !@mkdir($tmp, 0777))
- return $tmp;
- }
- return true;
- }
-
- /**
- * エラーメッセージをスローします
- *
- * @param string $message
- * @return void
- */
- protected function _throwException($message) {
- throw new Exception($message);
- }
- }
-
- ?>
-
-
复制代
- モパネル関数文件
-
/**
- * テンプレートの差し替えに必要な機能
- * http://blog.qita.in
- */
-
- function transamp($template) {
- $template = str_replace('&', '&', $template);
- $template = str_replace('&', '&', $template);
- $template = str_replace('"', '"', $template);
- return $template;
- }
-
- functionstripvtags ($expr, $statement) {
- $expr = str_replace("\"", """, preg_replace("/=(\$.+?)?>/s", "\1", $expr));
- $statement = str_replace("\"", """, $statement);
- return $expr 。 $statement;
- }
-
- function addquote($var) {
- return str_replace("\"", """, preg_replace("/[([a-zA-Z0-9_-.x7f-xff]+)] /s", "['\1']", $var));
- }
-
- functionstripscriptamp($s) {
- $s = str_replace('&', '&', $s);
- return "";
- }
-
- functionstripblock($var, $s) {
- $s = str_replace('\"' , '"', $s);
- $s = preg_replace("/=\$(.+?)?>/", "{$\1}", $s);
- preg_match_all(" /=(.+?)?>/e", $s, $constary);
- $constadd = '';
- $constary[1] = array_unique($constary[1]);
- foreach( $constary[1] を $const) {
- $constadd .= '$__' 。 $const 。 = ' 。 $const 。 ';';
- }
- $s = preg_replace("/=(.+?)?>/", "{$__\1}", $s);
- $s = str_replace('? >', "n$$var .= $s = str_replace('', "nEOF;n", $s);
- return "";
- }
- ?>
复制幣
|