Chinaunix首页 | 论坛 | 博客
  • 博客访问: 295441
  • 博文数量: 153
  • 博客积分: 3347
  • 博客等级: 中校
  • 技术积分: 1556
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-30 17:50
文章分类

全部博文(153)

文章存档

2013年(7)

2012年(21)

2011年(46)

2010年(16)

2009年(63)

我的朋友

分类:

2011-03-22 13:14:39

模板的作用:表现与实现相分离.

项目中考虑 Smarty或其它模板引擎,过于庞大,功能较多,但项目中使用的较少. 

另外,模板语法过于复杂,增加了开发人员的学习成本.

故,自行开发了一个小模板引擎,实现了编译及缓存功能.

代码如下:

/**
 * 模板类
    一.for循环
                      
       
        缺陷:如表达式中有>(大于号),将导致视图在DW中出现多余字符
    二.foreach循环
        $v)>                   
       
        缺陷:'=>' 将导致视图在DW中出现多余字符
    三.if判断
        5)>
        2)>
       
       
        缺陷:如果表达式中有>(大于号),将导致视图在DW中出现多余字符
    四.嵌套原生代码
       
       

    五.子模板包含
       
        注意:紧密连接
    六.自我感知
       
        注意:这个与PHP语法实在无法一致了,中间是空格分开的,此句等同于 方法(参数表) ?>
    七.显示函数返回值
        {date('Y-m-d H;i:s')}
        注意:既然是函数调用,最后就应该是')'结束
    八.显示变量的值
        {$变量}
        {$对象.属性}
        {$数组[下标]}
    九.赋值
       

    全局注意:
        '' 以及 '' 必须紧密连接
        ''以及'' 必须紧密连接
        其它标签也是如此
 */
class STemplate{
   
    /**
     * 显示视图,如果需要,智能编译
     *
     * @param string $view 视图
     * @param array $params 参数
     */
    static public function display($view,$params){
        extract($params);
        include(self::getTpl($view));
    }
   
    /**
     * 根据视图获取编译后的模板文件,会自动进行智能编译
     *
     * @param string $view 视图
     * @return string 模板文件(带路径)
     */
    static private function getTpl($view){
        $source=SConfig::system('dir_view').$view.'.'.SConfig::system('suffix_view');
        $target=SConfig::system('dir_template').$view.'.'.SConfig::system('suffix_template');
        if(!file_exists($source)){
            throw new Exception('View file not exist:'.$view);
        }
       
        //调试模式 或 缓存文件不存在 或 缓存文件过期 则:重新编译
        if(!file_exists($target) or filemtime($source)>filemtime($target)){
            $dirs=explode('/',$view);
            $path=SConfig::system('dir_template');
            for($i=0;$i                $path.=$dirs[$i];
                if(!is_dir($path)){
                    mkdir($path);
                }
                $path.=DIRECTORY_SEPARATOR;
            }
            $content=self::complie($view,file_get_contents($source));
            file_put_contents($target,$content);           
        }
        return $target;
    }
   
    /**
     * 预编译模板
     *
     * @param string $view        模板名称
     * @param string $source    原模板内容
     * @return string            编译后结果
     */
    static private function complie($view,$source){
        //不允许出现PHP代码
        if (strpos($source,'            throw new Exception('Cant\'t user php code in template:'.$view);
        }
       
        //替换
        $target=preg_replace(
            array(
                '//',                            //匹配 for 循环开始,与PHP语法一致
                '//',                                    //匹配 for 循环结束
                '//',                        //匹配 foreach 循环开始,与PHP语法一致
                '//',                                //匹配 foreach 循环结束
                '//',                                //匹配 if 开始,与PHP语法一致
                '//',                            //匹配 elseif,与PHP语法一致
                '//',                                        //匹配 else
                '//',                                    //匹配 if 结束
                '//',                                        //匹配 原生代码开始
                '/<\/php>/',                                    //匹配 原生代码结束
                '//',                        //匹配 子模板包含,语法
                '//',    //匹配 自我感知,语法
                '/{(.*\))}/',                                    //匹配 显示函数返回值,与PHP语法一致
                '/{\$([^}]*)}/',                                //匹配 显示变量的值,与PHP语法一致
                '//',                            //匹配 赋值
            ),
            array(
                '',                                    //替换 For 循环开始
                '',                                    //替换 For 循环结束
                '',                                //替换 Foreach 循环开始
                '',                                //替换 Foreach 循环结束
                '',                                    //替换 If 开始
                '',                                //替换 Elseif
                '',                                    //替换 Else
                '',                                    //替换 If 结束
                '                '?>',                                            //替换 原生代码结束
                '',                                //替换 子模板包含
                '\3?>',                    //替换 自我感知
                '',                                        //替换 显示函数返回值的开始
                '',                                        //替换 显示变量的值   
                '',                                        //替换 赋值
            ),$source);
           
            //如果不是调试模式,则去除首尾空格
            if(!SDebug::isDebug()){
                $target=preg_replace('/^\s*|\s*$/m','',$target);
            }
        return $target;
    }
}



注:大家使用时,要将其中的部分代码进行修改.  将路径,后缀修改为自己项目中的实际路径与后缀,同时调试代码去除.

阅读(384) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~