Discuz의 템플릿 엔진은 비교적 좋은 템플릿 엔진 클래스입니다. 오래 전에 인터넷에서 찾았습니다. 시각적으로 보면 이 Discuz 템플릿 엔진은 DZ7.2 이전 버전입니다. . 저도 사용하기가 너무 쉬워서 이 템플릿 클래스를 공유하고 싶습니다. 파일이 2개 있습니다. 템플릿 클래스, 템플릿 교체에 꼭 필요한 함수 원주소 : http://blog.qita.in
- ?/**
- * 템플릿 클래스 - Discuz 템플릿 엔진을 사용하여 구문 분석
- * http://blog.qita.in
- */
-
- require_once(DIR_ROOT . '/../function/template.func.php ');
- 클래스 템플릿 {
- const DIR_SEP = DIRECTORY_SEPARATOR;
-
- /**
- * 템플릿 인스턴스
- *
- * @staticvar
- * @var object 템플릿
- */
- protected static $_instance;
-
- /**
- * 템플릿 매개변수 정보
- *
- * @var array
- */
- 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' => ' template' . self :: DIR_SEP . 'cache' . self :: DIR_SEP, // 캐시 파일이 저장되는 디렉토리
- 'auto_update' => false, // 템플릿 파일 수정 시 캐시를 재생성할지 여부
- 'cache_lifetime' => 0, // 캐시 수명 주기(분), 0은 영구적임을 의미합니다.
- );
- }
-
- /**
- * 템플릿 매개변수 정보 설정
- *
- * @param array $options 매개변수 배열
- * @return void
- */
- 공개 함수 setOptions (배열 $options) {
- foreach ($options as $name => $value)
- $this -> set($name, $value);
- }
-
- / **
- * 템플릿 매개변수 설정
- *
- * @param string $name 매개변수 이름
- * @param 혼합 $value 매개변수 값
- * @return void
- * /
- 공용 함수 세트($name, $value) {
- 스위치($name) {
- 케이스 'template_dir':
- $value = $this -> ($value);
- if (!file_exists($value))
- $this -> _options['template_dir'] = $value;
- break;
- case 'cache_dir':
- $value = $this -> _trimpath($value);
- if (!file_exists($value) ))
- $this -> _throwException("지정된 캐시 디렉터리 "$value""를 찾을 수 없습니다);
- $this -> _options['cache_dir'] = $value;
- break;
- 케이스 'auto_update':
- $this -> _options['auto_update'] = (부울) $value;
- break;
- 케이스 'cache_lifetime':
- $this -> _options['cache_lifetime'] = ( float) $value;
- break;
- 기본값:
- $this -> _throwException("알 수 없는 템플릿 구성 옵션 "$name"");
- }
- }
-
- /**
- * 매직 메소드를 통해 템플릿 매개변수 설정
- *
- * @see Template::set()
- * @param string $name 매개변수 이름
- * @param 혼합 $value 매개변수 값
- * @return 무효
- */
- 공개 함수 __set($name, $value) {
- $this -> set($name, $value);
- }
-
- /**
- * 템플릿 파일 가져오기
- *
- * @param string $file 템플릿 파일 이름
- * @return 문자열
- */
- 공용 함수 getfile($file) {
- $cachefile = $this -> _getCacheFile($file);
- if (! file_exists($cachefile))
- $this -> 캐시($file);
- return $cachefile;
- }
-
- /**
- * 템플릿 파일의 캐시 업데이트 여부 감지
- *
- * @param string $file 템플릿 파일 이름
- * @param string $md5data 템플릿 파일 md5 확인 정보
- * @param 정수 $ md5data 템플릿 파일 만료 시간 확인 정보
- * @return void
- */
- 공개 함수 check($file, $md5data , $expireTime) {
- if ($this -> _options['auto_update'] && md5_file($this -> _getTplFile($file)) != $md5data)
- $this -> 캐시( $file);
- 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_reader($tplfile)) {
- $this -> _throwException("템플릿 파일 "$tplfile"은 찾을 수 없거나 열 수 없음");
- }
- // 템플릿 콘텐츠 가져오기
- $template = file_get_contents($tplfile);
- // 필터
- $template = preg_replace(" //s", "{\1}", $template)
- // 언어 팩 변수 교체
- // $template = preg_replace( "/{langs (. ?)}/ies", "언어var('\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]*{템플릿 (. ?)}[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",
- "stripvtags(' 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]*{루프 (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 코드 구분선과 줄 사이의 추가 공백을 삭제합니다. break
- $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]*{블록 ([a-zA-Z0-9_] )}(. ?) { /block}/ies",
- "stripblock('\1', '\2')",
- $template
- );
- // md5 및 만료 확인 추가
- $md5data = md5_file($tplfile);
- $expireTime = time();
- $template = " if (!class_exists('template')) die('Access Denied');"
- . "$template->getInstance()->check('$file', '$md5data', $expireTime);"
- . "?>rn$template"
- // 쓰기 캐시 파일
- $cachefile = $this -> _getCacheFile($file);
- $makepath = $this -> _makepath($cachefile);
- if ($makepath !== true)
- $this -> _throwException("캐시 디렉터리 "$makepath"를 생성할 수 없습니다");
- file_put_contents($cachefile, $template);
- }
-
- /**
- * 운영체제에 맞는 형태로 경로를 수정하세요
- *
- * @param string $path path name
- * @return string
- * /
- 보호 함수 _trimpath($path) {
- return str_replace(array('/', '\', '//', '\\'), self :: DIR_SEP, $path);
- }
-
- /**
- * 템플릿 파일 이름 및 경로 가져오기
- *
- * @param string $file 템플릿 파일 이름
- * @return string
- */
- 보호 함수 _getTplFile($file) {
- return $this -> _trimpath($this -> _options['template_dir'] . 자기: DIR_SEP .$file);
- }
-
- /**
- * 템플릿 캐시 파일 이름 및 경로 가져오기
- *
- * @param string $file 템플릿 파일 이름
- * @return string
- */
- 보호 함수 _getCacheFile($file) {
- $file = preg_replace('/.[a-z0-9-_] $/i', '.cache.php', $file);
- return $this -> _trimpath($this -> _options['cache_dir'] . self :: DIR_SEP . $file);
- }
-
- /**
- * 지정된 경로를 기반으로 존재하지 않는 폴더 생성
- *
- * @param string $path 경로/폴더 이름
- * @return string
- */
- 보호 함수 _makepath($path ) {
- $dirs = 폭발(self :: DIR_SEP, dirname($this -> _trimpath($path)));
- $tmp = '';
- foreach($dirs를 $dir로) {
- $tmp .= $dir . self :: DIR_SEP;
- if (!file_exists($tmp) && !@mkdir($tmp, 0777))
- return $tmp;
- }
- return true;
- }
-
- /**
- * 오류 메시지 던지기
- *
- * @param string $message
- * @return void
- */
- 보호 함수 _throwException($message) {
- throw new Exception($message);
- }
- }
-
- ?> ;
-
-
复代码
- 模板函数文件
-
/**
- * 템플릿 교체에 필요한 기능
- * http://blog.qita.in
- */
-
- 함수 transamp($template) {
- $ template = str_replace('&', '&', $template);
- $template = str_replace('&', '&', $template);
- $template = str_replace(' "', '"', $template);
- return $template;
- }
-
- function Stripvtags($expr, $statement) {
- $expr = str_replace("\"" , """, preg_replace("/=(\$. ?)?>/s", "\1", $expr));
- $statement = str_replace("\"", " "", $statement);
- $expr을 반환합니다. $statement;
- }
-
- function addquote($var) {
- return str_replace("\"", """, preg_replace("/[([a-zA-Z0-9_- .x7f-xff] )]/s", "['\1']", $var));
- }
-
- function Stripscriptamp($s) {
- $s = str_replace( '&', '&', $s);
- return "";
- }
-
- function Stripblock($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] as $const) {
- $constadd .= '$__' . $const .' = ' . $const . ';';
- }
- $s = preg_replace("/=(. ?)?>/", "{$__\1}", $s);
- $s = str_replace('?>', "n$$var .= $s = str_replace('', "nEOF;n", $ s);
- "";
- }
- ?>
复代码
|