<?php
/**
* ä¸ä¸ªå°åçPHPæ¨¡æ¿æ¸²æå¼æ.
* {loop $array $key $value}..........{/loop} 循ç¯
* {loop $array $value}..........{/loop} 循ç¯
* {if condition}...{elseif condition}..{else}..{/if} ifæ¡ä»¶è¯å¥
* {$val} è¾åºåéå¼
* {eval echo "ok";} è¿è¡PHP代ç
* {template file} å
å«å¦å¤ä¸ä¸ªæ¨¡ç
* å¯¹è±¡æ¹æ³:
* setTplDir($dir)
* setReal($real)
* setExtName($ext)
* setTmpDir($dir)
* setU(&$dispatcher)
* assign($name, $value=null)
* getVal($name)
* saveHtml($tFile, $html)
* display($tFile)
* usage:
* [code/]
* require_once('Template.php');
* $tpl=new Tpl();
* $tpl->assign('val','test');
* $tpl->display('tplfile');//ä¸å¸¦åç¼,é»è®¤æ¨¡æ¿åç¼.html
* [/code]
* å¯é
ç½®ç项 :TPL_DIR (模æ¿åæ¾ç®å½)åTPL_C_DIR(ç¼ååæ¾ç®å½),TPL_REAL(boolæ¯å¦å®æ¶ç¼è¯)
*/
class tpl{
private $tDir=TPL_DIR; //模çæä»¶ç®å½
private $tTmpDir=TPL_C_DIR; //ç¼è¯å¥½åçæä»¶ç®å½
private $tVal; //模çåé
private $tFile; //模çæä»¶
private $tExtName = '.html'; //æ¨¡æ¿æä»¶çæ©å±å
private $tContent; //模çå
容
private $uDispatcher; //URLè°åº¦å¨
private $real = TPL_REAL; //宿¶ç¼è¯
public function __construct() {
$this->tVal = array();
}
/**
* 设置模çæä»¶ç®å½
* @param string $dir
*/
public function setTplDir($dir) {
$this->tDir = $dir;
}
/**
* æ¯å¦å®æ¶ç¼è¯
* @param bool $real
*/
public function setReal($real) {
$this->real = (bool) $real;
}
/**
* è®¾ç½®æ¨¡æ¿æä»¶çæ©å±å
* @param string $ext æ©å±å
*/
public function setExtName($ext) {
$this->tExtName = $ext;
}
/**
* ä¸´æ¶æä»¶ç®å½
* @param string $dir
*/
public function setTmpDir($dir) {
if (!file_exists($dir)) {
if (!mkdir($dir, 0, true))
die("tmp dir $dir can't to mkdir");
}
$this->tTmpDir = realpath($dir);
}
/**
* URLè°åº¦å¨
* @param Dispatcher $dispatcher
*/
public function setU(&$dispatcher) {
if (is_object($dispatcher) && method_exists($dispatcher, 'U')) {
$this->uDispatcher = $dispatcher;
}
}
/**
* 注åç¨æ·èªå·±ç彿°
* å½$functionæ¯stringæ¶åæ¯æ¹å½æ°ï¼å¦ææ¯é®å¼å¯¹æ°ç»æ¶å鮿¯ç±»åï¼å¼æ¯ç±»ä¸çéææ¹æ³
* @param mix $function 彿°
*/
public function registerFunction($function) {
if (is_array($function)) {
foreach ($function as $key => $value) {
$this->userFunctions['classes'][$key] = $value;
}
} else {
$this->userFunctions['functions'][] = $function;
}
}
/**
* åéèµå¼
* 妿$nameæ¯ä¸ä¸ªé®å¼å¯¹çæ°ç»ï¼åç´æ¥ä½¿ç¨å¯¹$nameæ°ç»è¿è¡èµå¼
* @param mixed $name åéå
* @param mixed $value å¼
*/
public function assign($name, $value=null) {
if (is_array($name)) {
foreach ($name as $key => $val) {
$this->tVal[$key] = $val;
}
} else {
$this->tVal[$name] = $value;
}
}
/**
* å徿¨¡ççåé
* @param string $name
*/
public function getVal($name) {
if (isset($this->tVal[$name])) {
return $this->tVal[$name];
}else
return false;
}
/**
* å°è¿è¡å¥½åçå
容ï¼ä¿åå°ä¸ä¸ªhtmlæä»¶ä¸
* @param string $tFile
* @param string $html
*/
public function saveHtml($tFile, $html) {
ob_start();
$this->display($tFile);
$buffer = ob_get_contents();
ob_end_clean();
file_put_contents($html, $buffer);
}
/**
* è¿è¡å¹¶æ¾ç¤ºæ¨¡çå
容
* @param string $tfile
*/
public function display($tFile) {
$this->tFile = $this->parseTemplatePath($tFile);
if (!file_exists($this->getTmpFile()) || $this->real) {
$this->parse();
}
extract($this->tVal, EXTR_OVERWRITE);
include $this->getTmpFile();
}
/**
* ç¼è¯å¥½åçæä»¶
* @return string $filepath
*/
private function getTmpFile() {
$basename = basename($this->tFile);
$pos = strrpos($basename, '.');
$tmp = 'tpl_' . substr($basename, 0, $pos) . '.php';
return $this->tTmpDir . '/' . $tmp;
}
private function parse() {
$this->tContent = file_get_contents($this->tFile);
$this->parseInclude();
$this->parseSection();
$this->parseVal();
$this->parseEval();
if (!$this->real) {
//妿æ¯å¨éè°è¯ç¯å¢ä¸ï¼åæ¿æ¢ä¸äºæ²¡ç¨çå
容
$search = array("/\r?\n/", "/\s{2,}/");
$repace = array('', '');
$this->tContent = preg_replace($search, $repace, $this->tContent);
}
file_put_contents($this->getTmpFile(), $this->tContent);
}
/**
* è§£ææ¨¡æ¿ä¸ç忍¡æ¿
*/
private function parseInclude() {
for ($i = 0; $i < 6; $i++) {
$this->tContent = preg_replace("/\{template\s+([a-zA-z0-9\._]+)\}/ies", "\$this->subtemplate('$1')", $this->tContent);
}
}
/**
* è·ååªæ¨¡ç
* @param string $file
*/
private function subtemplate($file) {
return file_get_contents($this->parseTemplatePath($file));
}
/**
* è§£ææ¨¡çè·¯å¾
* @param string $file
* @return string $filepath
*/
private function parseTemplatePath($tFile) {
$tFile.=$this->tExtName;
$tFile = $this->tDir ? $this->tDir . '/' . $tFile : $tFile;
if (!file_exists($tFile)) {
if($this->real) die("No template file $tFile");
else die('Something Wrong');
} else {
$tFile = realpath($tFile);
}
return $tFile;
}
/**
* è§£æåé
*/
private function parseVal() {
$this->tContent = preg_replace("/\{(\\$\S+?)\}/is", "<?php echo \\1 ;?>", $this->tContent);
}
/**
* è§£ææ®µè½
*/
private function parseSection() {
//é»è¾
$this->tContent = preg_replace("/\{elseif\s+(.+?)\}/ies", "\$this->stripvtags('<?php } elseif(\\1) { ?>','')", $this->tContent);
$this->tContent = preg_replace("/\{else\}/is", "<?php } else { ?>", $this->tContent);
$this->tContent = preg_replace("/\{U\((.+?)\)\}/ies", "\$this->parseUrl('$1')", $this->tContent);
//循ç¯
for ($i = 0; $i < 6; $i++) {
$this->tContent = preg_replace("/\{loop\s+(\S+)\s+(\S+)\}(.+?)\{\/loop\}/ies", "\$this->stripvtags('<?php if(is_array(\\1)) { foreach(\\1 as \\2) { ?>','\\3<?php } } ?>')", $this->tContent);
$this->tContent = preg_replace("/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}(.+?)\{\/loop\}/ies", "\$this->stripvtags('<?php if(is_array(\\1)) { foreach(\\1 as \\2 => \\3) { ?>','\\4<?php } } ?>')", $this->tContent);
$this->tContent = preg_replace("/\{if\s+(.+?)\}(.+?)\{\/if\}/ies", "\$this->stripvtags('<?php if(\\1) { ?>','\\2<?php } ?>')", $this->tContent);
}
}
private function stripvtags($expr, $statement='') {
$expr = str_replace("\\\"", "\"", preg_replace("/\<\?\=(\\\$.+?)\?\>/s", "\\1", $expr));
$statement = str_replace("\\\"", "\"", $statement);
return $expr . $statement;
}
/**
* è§£æPHPè¯å¥
*/
private function parseEval() {
$this->tContent = preg_replace("/\{eval\s+(.+?)\}/is", "<?php $1 ?>", $this->tContent);
}
/**
* è§£æURL
*/
private function parseUrl($url) {
if (is_object($this->uDispatcher)) {
return $this->uDispatcher->U($url);
} else {
return $url;
}
}
}