当前位置 : 主页 > 网络编程 > PHP >

iSmarty.php

来源:互联网 收集:自由互联 发布时间:2021-06-28
iSmarty.php * @date 2016-07-01 * DEMO: $tpl = new iSmarty(); $tpl-assign('Name','名字');$data['title']='标题';$data['url']='http://127.0.0.1';$tpl-assign($data);$tpl-display('template.htm'); */class iSmarty{ /* * 模板目录 * @var str
iSmarty.php
 
 * @date 2016-07-01
 * DEMO:
  $tpl = new iSmarty();
  $tpl->assign('Name','名字');

	$data['title']='标题';
	$data['url']='http://127.0.0.1';
	$tpl->assign($data);
	$tpl->display('template.htm');
 */
class iSmarty{
    /*
     * 模板目录
     * @var string
     */
    public $templatedir = './Template';
     
    /*
     * 缓存编译目录
     * @var string
     */
    public $compiledir = './Temp';
     
    /*
     * 模板变量
     * @var array
     */
    protected $vars = array();
     
    /*
     * 编译PHP标签
     * @param string $tpl (template file)
     */
    protected function parse($tpl){
        // 加载模板文件 //
		$tplfile = $this->templatedir .$tpl;
        $fp   = @fopen($tplfile, 'r');
        $text = fread($fp, filesize($tplfile));
        fclose($fp);
        // 替换模板标签的PHP标签 //
        $text        = str_replace('{/if}', '
 ', $text);
        $text        = str_replace('{/loop}', '
 ', $text);
        $text        = str_replace('{foreachelse}', '
 ', $text);
        $text        = str_replace('{/foreach}', '
 ', $text);
        $text        = str_replace('{else}', '
 ', $text);
        $text        = str_replace('{loopelse}', '
 ', $text);
        // 模板标签 //
        $pattern     = array(
            '/\$(\w*[a-zA-Z0-9_])/',
            '/\$this\-\>vars\[\'(\w*[a-zA-Z0-9_])\'\]+\.(\w*[a-zA-Z0-9])/',
            '/\{include file=(\"|\'|)(\w*[a-zA-Z0-9_\.][a-zA-Z]\w*)(\"|\'|)\}/',
            '/\{\$this\-\>vars(\[\'(\w*[a-zA-Z0-9_])\'\])(\[\'(\w*[a-zA-Z0-9_])\'\])?\}/',
            '/\{if (.*?)\}/',
            '/\{elseif (.*?)\}/',
            '/\{loop \$(.*) as (\w*[a-zA-Z0-9_])\}/',
            '/\{foreach \$(.*) (\w*[a-zA-Z0-9_])\=\>(\w*[a-zA-Z0-9_])\}/'
        );
        // 替换PHP标签 //
        $replacement = array(
            '$this->vars[\'\1\']',
            '$this->vars[\'\1\'][\'\2\']',
            '
 display(\'\2\')?>',
            '
 vars\1\3?>',
            '
 ',
            '
 ',
            '
 vars[\'\2\']) {?>',
            '
 vars[\'\2\']=>$this->vars[\'\3\']) {?>'
        );
        // 替换模板标签的PHP标签 //
        $text = preg_replace($pattern, $replacement, $text);
         
        // 创建编译文件 //
        $compliefile = $this->compiledir . md5($tpl) . '.php';
        if ($fp = @fopen($compliefile, 'w')) {
            fputs($fp, $text);
            fclose($fp);
        }
    }
     
    /*
     * 模板变量值赋
     * @param array|string $k the template variable name(s)
     * @param mixed $v the value to assign
     */
    public function assign($k, $v = null)
    {
		if(is_array($k) && $v==null){
			foreach($k as $key=>$value){
				$this->vars[$key] = $value;
			}
		}else{
			$this->vars[$k] = $v;
		}
    }
     
    /*
     * 设置模板目录
     * @param string $str (path)
     */
    protected function templateDir($path)
    {
        $this->templatedir = $this->pathCheck($path);
    }
     
    /*
     * 设置模板编译路径
     * @param string $str (path)
     */
    protected function compileDir($path){
        $this->compiledir = $this->pathCheck($path);
    }
     
    /*
     * 检查路径的最后一个字符
     * @param string $str (path)
     * @return string
     */
    protected function pathCheck($str){
        return (preg_match('/\/$/', $str)) ? $str : $str . '/';
    }
     
    /*
     * 执行与显示模板的结果
     * @param string $tpl (template file)
     */
    public function display($tpl){
        $tplfile = $this->templatedir . $tpl;
        if (!file_exists($tplfile)) {
            exit('can not load template file : ' . $tplfile);
        }
        $compliefile = $this->compiledir . md5($tpl) . '.php';

        if (!file_exists($compliefile) || filemtime($tplfile) > filemtime($compliefile)) {
            $this->parse($tpl);
        }
        include_once($compliefile);
    }
}
 
?>
网友评论