创建TPL自定义模板

文件布局

 

 

<!--1d7c7a527b6335cc7a623305ca940e1findex.tpl.html-->
   <!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html";charset="utf-8">
    <title>小明在线</title>
</head>
<body>
小明你在干嘛?<!--我是静态页面-->
<hr/>

<div>我是二号页面</div>
<hr/>

    0...1<br/>
    1...2<br/>
    2...3<br/>
    3...4<br/>
    4...5<br/>
    5...6<br/>
    6...7<br/>

分页数是10</body>
</html>



<!--系统变量文件 profile.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <taglib>
        <name>webname</name>
        <value>小明在线</value>
    </taglib>

    <taglib>
        <name>pagesize</name>
        <value>10</value>
    </taglib>
</root>



<!--Parser.class.php解析类-->
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2015/8/28
 * Time: 10:27
 */
//模板解析类
class Parser {
    //字段保存模板类内容
    private $_tpl;

    function __construct($_tplFile){
        if(!$this->_tpl=file_get_contents($_tplFile)){
            exit('ERROR:模板文件读取错误!');
        }
    }

    //解析普通变量
    private function parVar(){
        $_pattern='/\{\$([\w]+)\}/';
        if(preg_match($_pattern,$this->_tpl)){
            $this->_tpl=preg_replace($_pattern,"<?php echo \$this->_vars['$1'];?>",$this->_tpl);
        }
    }

    //解析if else语句
    private function parIf(){
        $_patternStartIf='/\{if\s+\$([\w]+)\}/';
        $_patternEndIf='/\{\/if\}/';
        $_patternStartElse='/\{else\}/';
        $_patternEndElse='/\{\/else\}/';
        if(preg_match($_patternStartIf,$this->_tpl)){
            $this->_tpl=preg_replace($_patternStartIf,"<?php if(\$this->_vars['$1']){?>",$this->_tpl);
            if(preg_match($_patternEndIf,$this->_tpl)){
                $this->_tpl=preg_replace($_patternEndIf,"<?php }?>",$this->_tpl);
                if(preg_match($_patternStartElse,$this->_tpl)){
                    $this->_tpl=preg_replace($_patternStartElse,"<?php }else{?>",$this->_tpl);
                }
            }else{
                exit('ERROR:if语句没有关闭!');
            }
        }
    }

    //PHP注释解析
    private function parCommon(){
        $_patternCommon='/\{#(.*)#\}/';
        if(preg_match($_patternCommon,$this->_tpl)){
            $this->_tpl=preg_replace($_patternCommon,"<?php /* $1 */?>",$this->_tpl);
        }else{
            exit('ERROR:PHP注释解析错误!');
        }
    }

    //foreach语句解析
    private function parForeach(){
        $_patternStartForeach='/\{foreach\s+\$([\w]+)\(([\w]+),([\w]+)\)\}/';
        $_patternEndForeach='/\{\/foreach\}/';
        $_patternKeyOrValue='/\{@([\w]+)\}/';
        if(preg_match($_patternStartForeach,$this->_tpl)){
            if(preg_match($_patternEndForeach,$this->_tpl)){
                $this->_tpl=preg_replace($_patternStartForeach,"<?php foreach(\$this->_vars['$1'] as \$$2=>\$$3){?>",$this->_tpl);
                $this->_tpl=preg_replace($_patternEndForeach,"<?php }?>",$this->_tpl);
                if(preg_match($_patternKeyOrValue,$this->_tpl)){
                    $this->_tpl=preg_replace($_patternKeyOrValue,"<?php echo \$$1;?>",$this->_tpl);
                }
            }else{
                exit('ERROR:foreach语句没有关闭!');
            }
        }
    }

    //include语句解析
    private function parInclude(){
        $_patternInclude='/\{include\s+file=\"([\w\.\_]+)\"\}/';
        if(preg_match($_patternInclude,$this->_tpl,$_file)){
            if(!file_exists($_file[1])||empty($_file)){
                exit('ERROR:包含文件出错!');
            }
            $this->_tpl=preg_replace($_patternInclude,"<?php include ROOT_PATH.'/$1';?>",$this->_tpl);
        }
    }

    //系统变量解析
    private function parConfig(){
        $_patternConfig='/<!--\{([\w]+)\}-->/';
        if(preg_match($_patternConfig,$this->_tpl)){
           $this->_tpl=preg_replace($_patternConfig,"<?php echo \$this->_config['$1'];?>",$this->_tpl);
        }
    }

    //对外公共接口
    public function compile($_parFile){
        //解析模板内容
        $this->parVar();
        $this->parIf();
        $this->parCommon();
        $this->parForeach();
        $this->parInclude();
        $this->parConfig();
        //生成编译文件
        if(!file_put_contents($_parFile,$this->_tpl)){
            exit('ERROR:编译文件出错!');
        }
    }
}

?> 
 
 
<!--Templates.class.php模板类-->
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2015/8/28
 * Time: 10:26
 */
//模板类
class Templates {
    //动态接收 变量
    private $_vars=array();
    //保存系统变量
    private $_config=array();

    //创建一个构造方法判断各个目录是否存在
    public function __construct()
    {
        if(!is_dir(TPL_DIR)||!is_dir(TPL_C_DIR)||!is_dir(CACHE_DIR)){
            exit('ERROR:模板文件目录或编译文件目录或缓存文件目录不存在,请手动添加!');
        }
        $_sxe=simplexml_load_file('config/profile.xml');
        $_taglib=$_sxe->xpath('/root/taglib');
        foreach($_taglib as $_tag){
            $this->_config["$_tag->name"]=$_tag->value;
        }
    }

    //assign()方法,用于注入变量
    public function assign($_var,$_value){
        //$_var用于同步模板里的变量,$_var相当于index.php里的name,那么在index.tpl中就是{$name}
        //$_value相当于index.php里的$_value,在index.php里就是$_name
        if(isset($_var)&&!empty($_var)){
            $this->_vars[$_var]=$_value;
        }else{
            exit('ERROR:请设置模板变量!');
        }
    }


    //display方法
    public function display($_file){
        //设置模板路径
        $_tplFile=TPL_DIR.$_file;
        //判断模板文件是否存在
        if(!file_exists($_tplFile)){
            exit('ERROR:模板文件不存在!');
        }
        //编译文件
        $_parFile=TPL_C_DIR.md5($_file).$_file.'.php';
        //缓存文件
        $_cacheFile=CACHE_DIR.md5($_file).$_file.'.html';
        //如果第二次运行相同的文件,只需要载入缓存文件
        if(IS_CACHE){
            //编译文件和缓存文件必须同时存在
            if(file_exists($_parFile)&&file_exists($_cacheFile)){
                //编译文件和缓存文件没有修改过
                if(filemtime($_parFile)>=filemtime($_tplFile)&&filemtime($_cacheFile)>=filemtime($_parFile)){
                    //载入缓存文件
                    include $_cacheFile;
                    return;
                }
            }
        }
        if(!is_file($_parFile)||filemtime($_parFile)<filemtime($_tplFile)){
            //引入模板解析类
            require ROOT_PATH.'/includes/Parser.class.php';
            $_parser=new Parser($_tplFile);
            $_parser->compile($_parFile);
        }
        //载入编译文件
        include $_parFile;
        if(IS_CACHE) {
            //获取缓存区里的数据,并创建缓存文件
            file_put_contents($_cacheFile, ob_get_contents());
            //清除缓冲区里(编译文件加载的内容)
            ob_clean();
            //载入缓存文件
            include $_cacheFile;
        }
    }
}

?> 



<!--index.tpl模板文件-->
<!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html";charset="utf-8">
    <title><!--{webname}--></title>
</head>
<body>
{$name}{$content}
<!--我是静态页面-->
{#我是php中注释#}
<hr/>

{if $a}
    <div>我是一号界面</div>
    {else}<div>我是二号页面</div>
{/if}
<hr/>

{foreach $array(key,value)}
    {@key}...{@value}<br/>
{/foreach}

分页数是<!--{pagesize}-->
</body>
</html>



<!--由模板生成的1d7c7a527b6335cc7a623305ca940e1findex.tpl.php解析文件-->
<!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html";charset="utf-8">
    <title><?php echo $this->_config['webname'];?></title>
</head>
<body>
<?php echo $this->_vars['name'];?><?php echo $this->_vars['content'];?>
<!--我是静态页面-->
<?php /* 我是php中注释 */?>
<hr/>

<?php if($this->_vars['a']){?>
    <div>我是一号界面</div>
    <?php }else{?><div>我是二号页面</div>
<?php }?>
<hr/>

<?php foreach($this->_vars['array'] as $key=>$value){?>
    <?php echo $key;?>...<?php echo $value;?><br/>
<?php }?>

分页数是<?php echo $this->_config['pagesize'];?>
</body>
</html>



<!--主页面index.php-->
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2015/8/28
 * Time: 10:02
 */
require dirname(__FILE__).'/template.inc.php';
//实例化模板类
$_tpl=new Templates();
//声明一个变量
$_name='小明';
$_content='你在干嘛?';
$_array=array(1,2,3,4,5,6,7);
//注入变量  name相当于index.tpl里的{$name}
$_tpl->assign('name',$_name);
$_tpl->assign('content',$_content);
$_tpl->assign('a',5<4);
$_tpl->assign('array',$_array);
//载入tpl文件
$_tpl->display('index.tpl');
?>



<!--template.inc.php辅助index.php的分担代码页面-->
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2015/8/29
 * Time: 20:05
 */
//开启缓冲区
ob_start();
//设置utf-8编码
header('content-type:text/html;charset="utf-8"');
//网站根目录
define('ROOT_PATH',dirname(__FILE__));
//模板文件目录
define('TPL_DIR',ROOT_PATH.'/templates/');
//编译文件目录
define('TPL_C_DIR',ROOT_PATH.'/templates_c/');
//缓存文件目录
define('CACHE_DIR',ROOT_PATH.'/cache/');
//是否开启缓冲区
define('IS_CACHE',true);
//判断是否开启缓冲区
IS_CACHE?ob_start():null;
//引入模板类
require ROOT_PATH.'/includes/Templates.class.php';
?> 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值