Dec 5

fanso php模板引擎 不指定

shuguang , 08:48 , 模板引擎 , 评论(0) , 引用(0) , 阅读(10165) , Via 本站原创 | |
程序名称:fanso模板
开发者/组织名称:心若水寒
运行环境:php+文本
官方网站:http://www.phpfans.net
下载地址:
请下载附件中的源码,不要直接复制 (已下载 1281 次)

文章来源:http://www.OSphp.com.cn
程序介绍:
//开源代码OSPhP.COm.CN

fanso模板简介
fanso模板是php爱好者站为本站设计并使用的一套模板。为了方便fanso模板性能的改善和大家的使用以及自己的提高,所以将此模板公开。希望大家可以对它进行改善与扩充。该模板参考了smarty的源码和语法。语法与smarty大同小异,但更少的冗余代码和更快的执行速度。

为什么要设计fanso模板
      MVC需要模板。MVC分别代表了"模型"、"视图"和"控制",目的就是让不同的开发角色在大中型项目中各司其职。在网络应用程序的开发中,如果可以将逻辑与表示分开,程序员和美工同时进行工作,那一定会大幅度提供工作效率。模板正是要实现这种功能。

      传统模板的局限性。 smarty像php一样有丰富的函数库,从统计字数到自动缩进、文字环绕以及正则表达式都可以直接使用;smarty还可以通过插件的形式进行扩充。如此多的功能不可能在项目开发中都用到。像一些需要实时更新的内容,这类型的程序使用smarty会使模板处理速度变慢。不适用于小项目。小项目使用smarty会增加大量的冗余代码。因此smarty更适合于大中型项目的开发。使用smarty开发小项目会丧失php开发迅速的优点。 //PHP开源代码
      fanso模板,为用户定义了几种最基本最常用的语法。这些语法能够满足用户的基本需要。更少的冗余代码。更快的速度。
fanso模板是编译型模板

      模板又分为编译型和解释型。解释型模板仅仅是对html里的变量进行替换。所以每次接到请求后都要对html里的变量进行替换一遍。这无余降低了程序的效率。而编译模板接到请求后,先判断是否第一次请求该url,如果是,将该url所需的模板文件编译成php脚本,然后重定向;如果不是,就是说该url的模板已经被编译过了,可以马上重定向。除了第一次编译的成本比较高之外,只要不修改模板文件,编译好的cache脚本就随时可用,省去了大量的解释时间。 而这就是编译型比解释型快的原理了。fanso模板是一个编译型模板。
fanso模板能做什么

      fanso模板分开了逻辑程序和外在界面的内容,提供了一种更易于管理的方法,协调程序员和美工的工作。在web编程中,最好让应用程序逻辑远离页面表现, 页面表现远离应用程序逻辑。这将在以后使得系统更容易管理,程序更容易升级。 //OSPHP.com.CN

      相对于传统的php编程,php脚本和html混杂在一起。使用模板更易于修改和维护。

<?php
class Fanso{
    
//左定界符
    
var $left_delimiter '{';
    
//右定界符
    
var $right_delimiter '}'; //开源代码OSPHP.COM.Cn
    
//模板文件所在目录
    
var $template_dir 'templates';
    
//编译文件所在目录
    
var $compile_dir 'templates_c';
    
// 强制编译
    
var $force_compile false;

//OSPHP.COM.Cn开源


    
//编译文件过期时间 0 表示没限制
    
var $exp_time 0;
    
//保存模板变量
    
var $fanso_vars = array();
    
//保存section变量
    
var $_sections = array();

    
/*
    * 模板变量赋值

//开源代码OSPhP.COm.CN


    */
    
function assign($vars,$value=null){
        if(
is_array($vars)){
            foreach(
$vars as $key => $val){
                if(
$key != ''){
//开源代码OSPHP.COM.Cn

                    
$this->fanso_vars[$key] = $val;
                }
            }
        }
        else{
            if(
$vars != ''){
                
$this->fanso_vars[$vars] = $value; //开源OSPhP.COM.CN
            }
        }
    }

    
/*
    * 内容输出
    */
    
function display($file_name){
        
error_reporting(E_ALL E_NOTICE);
        echo(
$this->fetch($file_name)); //OSPHP.COm.CN
    }

    
/*
    * 获得输出内容
    */
    
function fetch($file_name){
        
$compiledfile_url $this->get_compiledfile_url($file_name);
        
ob_start();
        
$this->compile($file_name);

//开源代码OSPHP.COM.Cn


        include(
$compiledfile_url);
        
$content ob_get_contents();
        
ob_end_clean();
        return 
$content;
    }


    
/*
    * 模板文件路径
    */
    
function get_sourcefile_url($file_name){

//开源代码OSPHP.COM.Cn


        return 
preg_match('//$/',$this->template_dir)?$this->template_dir.$file_name:$this->template_dir.'/'.$file_name;
    }

    
/* //OsPHP.COM.CN
    * 编译文件路径
    */
    
function get_compiledfile_url($file_name){
        return 
preg_match('//$/',$this->compile_dir)?$this->compile_dir.$file_name.'.php':$this->compile_dir.'/'.$file_name.'.php';
//OsPHP.COM.CN

    }

    
/*
    * 正则字符转义
    */
    
function _quote($val){
        return 
preg_quote($val,'/');
    }

    
/*
    * 判定编译条件
    */
    
function is_compiled($file_name){ //开源代码OSPHP.COM.Cn
        if(
$this->force_compile){
            return 
false;
        }
        else{
            
$sourcefile_url $this->get_sourcefile_url($file_name);
            
$compiledfile_url $this->get_compiledfile_url($file_name); //OSPHP.COM.Cn开源
            if(!
file_exists($compiledfile_url) || filemtime($sourcefile_url) > filemtime($compiledfile_url)){
                return 
false;
            }
            elseif(
$this->exp_time && time()-filemtime($compiledfile_url)>$this->exp_time){ //oSPHP.COM.CN
                return 
false;
            }
            else
            return 
true;
        }
    }

    
/*
    * 编译
    */
    
function compile($file_name){
        
$content $this->get_contents($file_name);
//开源代码OSPHP.COM.Cn

        
$content $this->parse_include($content);
        if(!
$this->is_compiled($file_name)){
            
$content $this->parse_assign($content); //开源代码OSPHP.COM.Cn
            
$content $this->parse_variable($content);
            
$content $this->parse_include_php($content);
            
$content $this->parse_php($content); //开源代码OSPhP.COm.CN
            
$content $this->parse_code($content);
            
$content $this->parse_if($content);
            
$content $this->parse_elseif($content); //OSPHP.COm.CN
            
$content $this->parse_else($content);
            
$content $this->parse_section($content);
            
$content $this->parse_sectionelse($content); //开源代码OSPHP.COM.Cn
            
$content $this->parse_cycle($content);
            
$content $this->parse_end($content);
            
$this->write_file($file_name,$content);
//OSPHP.COm.CN

        }
    }

    
/*
    * 读取模板
    */
    
function get_contents($file_name){
        
$sourcefile_url $this->get_sourcefile_url($file_name);
        if(!
file_exists($sourcefile_url) || !($content file_get_contents($sourcefile_url))) { //oSPHP.COM.CN
            
$this->show_messages("无法读取模板文件{$file_name},请检查文件是否存在。");
        }
        return 
$content;
    }

    
/*
    * 解析 code 语句
    */
    
function parse_code($content){
//oSPHP.COM.CN

        
$code_regular '/'.$this->_quote($this->left_delimiter).'code'.$this->_quote($this->right_delimiter).'(.+?)'.$this->_quote($this->left_delimiter).'/code'.$this->_quote($this->right_delimiter).'/is';
//oSPHP.COM.CN

        if(
preg_match_all($code_regular,$content,$code_arr)){
            
$content preg_replace($code_regular,'<?php1?>',$content);
            
$ext_arr $code_arr[1];
//PHP开源代码

            foreach (
$code_arr[1] as $key=>$value){
                if(
preg_match_all('/$w([w.[]]*[w]])?/',$value,$code_arr1)){
                    foreach (
$code_arr1[0] as $key1 => $value1){

//oSPHP.COM.CN


                        
$ext_arr[$key] = preg_replace('/'.$this->_quote($value1).'/',$this->parse_vars($value1),$ext_arr[$key],1); //开源代码OSPHP.COM.Cn
                    }
                    
$content preg_replace('/'.$this->_quote($code_arr[1][$key]).'/',$ext_arr[$key],$content,1);

//开源代码OSPHP.COM.Cn


                }
            }
        }
        return 
$content;
    }

    
/*
    * 解析 php 语句
    */
    
function parse_php($content){
        
$php_regular '/'.$this->_quote($this->left_delimiter).'php'.$this->_quote($this->right_delimiter).'(.+?)'.$this->_quote($this->left_delimiter).'/php'.$this->_quote($this->right_delimiter).'/is'; //OSPHP.COM.Cn开源
        
$content preg_replace($php_regular,"<?php1?>",$content);
        return 
$content;
    }

    
/*
    * 模板变量处理
    */
    
function parse_vars($vars){
//oSPHP.COM.CN

        
$vars_arr explode('.',$vars);
        foreach (
$vars_arr as $key=>$value){
            if(
$key == 0){
                if(
preg_match_all('/(w+)([w+])*?/',$value,$vars_arr1)){

//oSPHP.COM.CN


                    foreach (
$vars_arr1[0] as $key2=>$value2) {
                        if(
$key2 == 0) {
                            
$rep[] = '$this->fanso_vars[''.$value2.'']'; //OSPHP.com.CN
                        }
                        else{
                            
$rep[] = "[$this->fanso_vars['fanso']['section']['".$value2."']['index']]";
                        } //开源代码OSPHP.COM.Cn
                    }
                }
            }
            else{
                if(
preg_match_all('/(w+)([w+])*?/',$value,$vars_arr1)){
                    foreach (
$vars_arr1[0] as $key2=>$value2) { //OSPHP.com.CN
                        if(
$key2 == 0) {
                            
$rep[] = '[''.$value2.'']';
                        }
                        else{
                            
$rep[] = "[$this->fanso_vars['fanso']['section']['".$value2."']['index']]";
//OsPHP.COM.CN

                        }
                    }
                }
            }
        }
        
$replace implode('',$rep);
        return 
$replace;

//开源代码OSPHP.COM.Cn


    }

    
/*
    * 解析 模板变量
    */
    
function parse_variable($content){
        
$variable_regular '/'.$this->_quote($this->left_delimiter).'$(w([w.[]]*[w]])?)'.$this->_quote($this->right_delimiter).'/'; //OSPHP.COM.Cn开源
        if(
preg_match_all($variable_regular,$content,$variable_arr)){
            foreach (
$variable_arr[1] as $key=>$value){
                
$rep "<?php echo ";
//OSPHP.COM.Cn开源

                
$rep .= $this->parse_vars($value);
                
$rep .= ";?>";
                
$content preg_replace('/'.$this->_quote($variable_arr[0][$key]).'/',$rep,$content,1);
//开源代码OSPhP.COm.CN

            }
        }
        return 
$content;
    }

    
/*
    * 解析 assign
    */
    
function parse_assign($content){
        
$assign_regular '/'.$this->_quote($this->left_delimiter).'assigns+vars*=s*['"](w+)['"]s+values*=s*['"](.+?)['"]'.$this->_quote($this->right_delimiter).'/';

//OsPHP.COM.CN


        
$content = preg_replace($assign_regular,'<?php $this->assign('1','2');?>',$content);
        return 
$content;
    }

    /*
    * cycle 处理
    */
    function _cycle(
$value){
        static 
$cycle_index; //OSPHP.COM.Cn开源
        if(!isset(
$cycle_index)) $cycle_index = 0;
        
$cycle_arr = explode(',',$value);
        
$cycle_value = $cycle_arr[$cycle_index];
        if(
$cycle_index >= count($cycle_arr)-1) $cycle_index = 0;

//oSPHP.COM.CN


        else 
$cycle_index++;
        return 
$cycle_value;
    }

    /*
    * 解析 cycle
    */
    function parse_cycle(
$content){
        
$cyle_regular = '/'.$this->_quote($this->left_delimiter).'cycles+valuess*=s*['"](.+?)['"]'.$this->_quote($this->right_delimiter).'/i'; //开源代码OSPhP.COm.CN
        
$content preg_replace($cyle_regular,'<?php echo $this->_cycle('1');?>',$content);
        return 
$content;
    }

    
/*
    * 解析 if 语句
    */
    
function parse_if($content){

//开源OSPhP.COM.CN


        
$if_regular '/'.$this->_quote($this->left_delimiter).'ifs+((!?(*s*$([w.[]]+)s*)*s*((==|<|>|>=|<=|!=|<>|===)s*(d+|['"](.*)['"]))*)*s*(or|and|&&|||)s*)*!?(*s*$([w.[]]+)s*((==|<|>|>=|<=|!=|<>|===)s*(d+|['"](.*)['"]))*)*)'.$this->_quote($this->right_delimiter).'/isU';
//OSPHP.com.CN

        if(preg_match_all(
$if_regular,$content,$if_arr)){
            foreach (
$if_arr[0] as $key=>$value){
                if(preg_match_all('/$[w.[]]+/',
$value,$if_arr1)){
//OSPHP.com.CN

                    foreach (
$if_arr1[0] as $key1=>$value1){
                        
$if_arr[1][$key] = preg_replace('/'.$this->_quote($value1).'/',$this->parse_vars($value1),$if_arr[1][$key],1); //OSPHP.COM.Cn开源
                    }
                    
$rep =     "<?phprnif(".$if_arr[1][$key]."){rn?>";
                    $content = preg_replace('/'.$this->_quote($value).'/',$rep,$content,1); //开源代码OSPHP.COM.Cn
                }
            }
        }
        return $content;
    }

    /*
    * 解析 elseif 语句
    */
    function parse_elseif($content){
        $if_regular = '/'.$this->_quote($this->left_delimiter).'elseifs+((!?(*s*$([w.[]]+)s*)*s*((==|<|>|>=|<=|!=|<>|===)s*(d+|['"](.*)['"]))*)*s*(or|and|&&|||)s*)*!?(*s*$([w.[]]+)s*((==|<|>|>=|<=|!=|<>|===)s*(d+|['"](.*)['"]))*)*)'.$this->_quote($this->right_delimiter).'/isU';
        if(preg_match_all($if_regular,$content,$if_arr)){
//开源OSPhP.COM.CN

            foreach ($if_arr[0] as $key=>$value){
                if(preg_match_all('/$[w.[]]+/',$value,$if_arr1)){
                    foreach ($if_arr1[0] as $key1=>$value1){
                        $if_arr[1][$key] = preg_replace('/'.$this->_quote($value1).'/',$this->parse_vars($value1),$if_arr[1][$key],1);
                    }
                    $rep =     "<?phprn}rnelseif(".$if_arr[1][$key]."){rn?>";

//OSPHP.com.CN


                    $content = preg_replace('/'.$this->_quote($value).'/',$rep,$content,1);
                }
            }
        }
        return $content;
    }

    /*
    * 解析 else 语句
    */
    function parse_else($content){
        $else_regular = '/'.$this->_quote($this->left_delimiter).'else'.$this->_quote($this->right_delimiter).'/i';
        $rep = "<?phprn}rnelsern{rn?>";
//OSPHP.COM.Cn开源

        $content = preg_replace($else_regular,$rep,$content);
        return $content;
    }

    /*
    * 解析 section 语句
    */
    function parse_section($content){
        $section_regular =  '/'.$this->_quote($this->left_delimiter).'sections+names*=s*(w+)s+loops*=s*$([w[].]+)(s+starts*=s*(d+))?(s+steps*=s*(d+))?'.$this->_quote($this->right_delimiter).'/';
        if(preg_match_all($section_regular,$content,$section_arr)){    //print_r($section_arr);exit;
            foreach($section_arr[2] as $key=>$val){
                preg_match_all('/loop=$([w.]+)/i',$section_arr[0][$key],$output1);

//oSPHP.COM.CN


                $output = $this->parse_vars($output1[1][0]);
                $tag_val = "$this->_sections['".$section_arr[1][$key]."']";
                $section_val = "$this->fanso_vars['fanso']['section']['".$section_arr[1][$key]."']";
                if(!empty($section_arr[4][$key])) $start_value = $section_arr[4][$key];
                else $start_value = 0;
                if(!empty($section_arr[6][$key])) $step_value = $section_arr[6][$key];

//OsPHP.COM.CN


                else $step_value = 1;
                $rep = array();
                $rep[] = "<?php";
                
$rep[] = "unset({$tag_val});";
                
$rep[] = "{$tag_val}['name']  = '1';"; //开源OSPhP.COM.CN
                
$rep[] = "{$tag_val}['start'] = {$start_value};";
                
$rep[] = "{$tag_val}['step'] = {$step_value};";
//oSPHP.COM.CN

                
$rep[] = "{$section_val}['loop'] = is_array({$output})?count({$output}):0;";
                
$rep[] = "{$section_val}['total'] = ceil(({$section_val}['loop']-{$tag_val}['start'])/{$tag_val}['step']);"; //OSPHP.com.CN
                
$rep[] = "if({$section_val}['total'] > 0){";
                
$rep[] = "    for({$section_val}['index'] = {$tag_val}['start'],{$section_val}['iteration'] = 1;"; //OsPHP.COM.CN
                
$rep[] = "        {$section_val}['index'] < {$section_val}['loop'];";
                
$rep[] = "        {$section_val}['index'] += {$tag_val}['step'],{$section_val}['iteration']++)";

//OSPHP.COM.Cn开源


                
$rep[] = "    {";
                
$rep[] = "        {$output}[{$section_val}['index']]['index_prev'] = {$section_val}['index'] - {$tag_val}['step'];";
//OSPHP.com.CN

                
$rep[] = "        {$output}[{$section_val}['index']]['index_next'] = {$section_val}['index'] + {$tag_val}['step'];";

//OsPHP.COM.CN


                
$rep[] = "        {$section_val}['first'] = ({$section_val}['iteration'] == 1);";
                
$rep[] = "        {$section_val}['last'] = ({$section_val}['iteration'] == {$section_val}['total']);";
//OsPHP.COM.CN

                
$rep[] = "        {$section_val}['rownum'] = {$section_val}['iteration'];";
                
$rep[] = "?>";
                $rs = implode("rn",$rep); //oSPHP.COM.CN
                $content = preg_replace('/'.$this->_quote($section_arr[0][$key]).'/s',$rs,$content,1);
                unset($rs);
            }
        }
        return $content;
    }

    /*
    * 解析 sectionelse 语句
    */
    function parse_sectionelse($content){
        $sectionelse_regular = '/'.$this->_quote($this->left_delimiter).'sectionelse'.$this->_quote($this->right_delimiter).'(.+?)'.$this->_quote($this->left_delimiter).'/section'.$this->_quote($this->right_delimiter).'/is'; //开源代码OSPHP.COM.Cn
        $content = preg_replace($sectionelse_regular,"<?phprn    }rn}rnelse{rn?>1<?phprn}rn?>",$content);
        return $content;
    }

    /*
    * 解析 section 和 if 结束标记
    */
    function parse_end($content){
        $section_end_regular = '/'.$this->_quote($this->left_delimiter).'/section'.$this->_quote($this->right_delimiter).'/'; //OSPHP.COm.CN
        $section_rep = "<?phprn    }rn}rn?>";
        $content = preg_replace($section_end_regular,$section_rep,$content);
        $if_end_regular = '/'.$this->_quote($this->left_delimiter).'/if'.$this->_quote($this->right_delimiter).'/';
        $if_rep = "<?phprn}rn?>";
        $content = preg_replace($if_end_regular,$if_rep,$content);
        return $content; //PHP开源代码
    }

    /*
    * 解析 include 语句
    */
    function parse_include($content){
        $include_regular = '/'.$this->_quote($this->left_delimiter).'includes+files*=s*["']([w.]+?)["']'.$this->_quote($this->right_delimiter).'/i';
        if(preg_match_all($include_regular,$content,$include_arr)){
            foreach ($include_arr[1] as $key=>$value){
                $this->compile($value);
            }
            $content = preg_replace($include_regular,"<?phprninclude('1.php');rn?>",$content); //PHP开源代码
        }
        return $content;
    }

    /*
    * 解析 include_php 语句
    */
    function parse_include_php($content){
        $include_php_regular = '/'.$this->_quote($this->left_delimiter).'include_phps+files*=s*["']([w./]+?)["']'.$this->_quote($this->right_delimiter).'/i';
        $content = preg_replace($include_php_regular,"<?php include_once('1');?>",$content);
        return $content; //OSPHP.COM.Cn开源
    }

    /*
    * 写编译文件
    */
    function write_file($file_name,$content){
        $compiledfile_url = $this->get_compiledfile_url($file_name);
        if(!is_dir($this->compile_dir)){
            mkdir($this->compile_dir,0777);
        }
        if(!is_writable($this->compile_dir)){
            $this->show_messages("请先将编译文件夹".$this->compile_dir."和该文件夹中的所有文件的属性改成777。");
        }
        $fp = fopen($compiledfile_url,'wb'); //开源代码OSPHP.COM.Cn
        fwrite($fp,$content);
        fclose($fp);
    }

    /*
    * 信息提示
    */
    function show_messages($message){
        echo $message;
        exit;
    }
}
?>
收藏本文到网摘: 添加到“Google书签” 添加到“Yahoo收藏” 添加到“QQ书签” 搜狐网摘 添加到“百度搜藏” 添加到“新浪ViVi收藏夹” 添加到“Del.icio.us” 添加到“365天天网摘” 添加到“天极网摘” 我摘·网摘·网络书签 添加到“POCO网摘” YouNote网摘 添加到“和讯网摘” 添加到“Bolaa博客收录中心” 添加到“igooi网摘” 添加到“天下图摘”
  • 中查看更多“fanso php模板引擎”相关内容
  • 中查看更多“fanso php模板引擎”相关内容
  • 中查看更多“fanso php模板引擎”相关内容
  • 中查看更多“fanso php模板引擎”相关内容
  • 中查看更多“fanso php模板引擎”相关内容
  • 中查看更多“fanso php模板引擎”相关内容
  • 中查看更多“fanso php模板引擎”相关内容
  • 中查看更多“fanso php模板引擎”相关内容

  • 最后编辑: shuguang 编辑于2007/12/05 10:16
    Tags: , ,
    发表评论

    昵称

    网址

    电邮

    打开HTML 打开UBB 打开表情 隐藏 记住我 [登录系统] [注册]