从此不求人:自主研发一套PHP前端开发框架(28)

18 篇文章 0 订阅
15 篇文章 0 订阅

MVC静态模板开发:标签拓展和使用

cFunction.inc

<?php
       function strong($str){
        return '<b style="color:red;">'.$str.'</b>';
       }
       function genericinput($str){
        return '输入'.$str.'<input type="text" name="username" value="'.$str.'"/>';
       }
?>

html 模板

{foreach:memberinfo name="members"}

            {members.username}<br/>

            {foreach:info name="news"}

                <!-- &nbsp;&nbsp;&nbsp;&nbsp;这是第{news.rowNumber}条新闻.{strong('news.remark')}</b><br/> -->
                {genericinput('news.remark')}<br/>

            {/foreach}

{/foreach}

_Master.inc

<?php 

    require(LKPHP_PATH.'/MVC/Controller/cFunctions.inc');
    $foreach_id = array();
    $plugif_id=array();
    function foreach_callback($match)
     {
        $id=md5(uniqid()+mt_rand());//注意这里要特别注意一下 因为uniqid是按照微妙来生成的值的如果调用函数时时间相差很小那么可能这个值是一样的所以需要使用一个
        //随机函数来保证不一样 这个郁闷了好久 我还以为老师写的代码有问题??
        global $foreach_id;
        $foreach_id[]=$id;
        return "{".$match[1].":".$match[2].":".$id;
     }
  //所有controller的父类 抽象类 
  abstract class _Master{
     var $_view='index';//模板名称
     var $_vars = array();
     var $_cachetime=0;//缓存时间
     function setView($viewName){
         $this->_view = $viewName;
     }
     function getView(){
        return LKPHP_PATH.'/MVC/View/'.LKPHP_VIEWPATH.'/'.$this->_view.'.'.LKPHP_EXTENSION;
     }
     function setVar($varName,$varValue){
         //设置变量
        $this->_vars[$varName] = $varValue;
     }
     function hasVarCache(){
        if(the_cache($this->_view)){
            return true;
        }
        return false;
     }
     function run(){

        //解包变量
        if($this->_cachetime > 0){
            $getVars_cache = the_cache($this->_view);
            if($getVars_cache){
                echo '<b>这是从memcache中获取的数据</b><br/>';
                extract($getVars_cache);
            }else{
                //同时要设置缓存
                set_cache($this->_view,$this->_vars,0,$this->_cachetime);
                extract($this->_vars);
            }
        }else{
            extract($this->_vars);
        }
        extract($this->_vars);
        if(LKPHP_IS_OPEN_FILE_CACHE){
            //这里我们要讲写入缓冲区
            $tpl='';
            ob_start();
            //加载头部模板
            include(LKPHP_PATH.'/MVC/View/'.LKPHP_VIEWPATH.'/'.LKPHP_VIEWHEADER.'.'.LKPHP_EXTENSION);
            include($this->getView());//加载模板body
            include(LKPHP_PATH.'/MVC/View/'.LKPHP_VIEWPATH.'/'.LKPHP_VIEWFOOTER.'.'.LKPHP_EXTENSION);//尾部
            $tpl = ob_get_contents();

            ob_clean();
            $file_name = md5($_SERVER['REQUEST_URI']);
            $cache_file='Cache/'.$file_name;
            if(file_exists($cache_file)){
                echo  file_get_contents($cache_file);
            }else{
                file_put_contents($cache_file,$tpl);
                echo $tpl;
            }
        }else{
            $tpl='';
            ob_start();
            //加载头部模板
            include(LKPHP_PATH.'/MVC/View/'.LKPHP_VIEWPATH.'/'.LKPHP_VIEWHEADER.'.'.LKPHP_EXTENSION);
            include($this->getView());//加载模板body
            include(LKPHP_PATH.'/MVC/View/'.LKPHP_VIEWPATH.'/'.LKPHP_VIEWFOOTER.'.'.LKPHP_EXTENSION);//尾部
            $tpl = ob_get_contents();
            ob_clean();
            //循环优先
            $tpl = $this->genForeach($tpl);
            $tpl=$this->genSimpleVars($tpl);
            echo $tpl;
        }

     }

     function genForeach($tplCnt){
          global $foreach_id;

          //对每一个foreach加上一个唯一标识符
          $tplCnt = preg_replace_callback('/{(foreach):(\w{1,30})/is','foreach_callback',$tplCnt);

          $foreach_id = array_reverse($foreach_id);//对数组进行翻转操作

          foreach ($foreach_id as $fid) {

              if(preg_match_all('/{foreach:(?<varObject>\w{1,30}?):'.$fid.'\s+name=\"(?<varName>\w{1,30}?)\"}/is',$tplCnt,$result)){
                 $finalResult = "";
                 $varObject = $result['varObject'][0];
                 $varName = $result['varName'][0];
                 if(array_key_exists($varObject,$this->_vars)){
                     $pattern = '/{foreach:'.$varObject.':'.$fid.'\s+.*?}(?<replaceCnt>.*?){\/foreach}/is';
                     preg_match($pattern,$tplCnt,$cntResult);
                     $cntResult = $cntResult['replaceCnt'];
                     $index=1;
                     foreach($this->_vars[$varObject] as $row){
                         $system=array('rowNumber'=>$index);//拓展代码
                         $tmp = $this->replaceForeachVar($cntResult,$varName,$row,$fid,$system);
                         $index++;
                         $finalResult .= $tmp;
                     }
                 }
                 //替换最终的某个foreach的值
                 $tplCnt = preg_replace('/{foreach:'.$varObject.':'.$fid.'\s+.*?}.*?{\/foreach}/is',$finalResult,$tplCnt);
              }
          }
          return $tplCnt;
     }


     function replaceForeachVar($cnt,$varName,$row,$fid,$system){
        //合并数组
        $row = array_merge($row,$system);
        //替换循环内部内容

        if(preg_match_all('/{(.*?)}/is',$cnt,$result)){//首先去除{} 里面的内容
            $result = $result[1];
            foreach ($result as $r) {
                //分别根据{}里面的内容获取变量值 如user.username ,注意:取的是username,user是$varName,是已知的
                if(!preg_match_all('/'.$varName.'\.(?<varValue>\w{1,30})/is',$r,$varResult))continue;
                   $varList = $varResult['varValue'];
                   if(count($varList) ===1 && $varName.'.'.$varList[0] === trim($r)){
                      $varValue = $varList[0];//没有函数只会有一个变量
                      if($row[$varValue]){
                         $cnt = preg_replace('/{'.$varName.'\.'.$varValue.'}/is',$row[$varValue],$cnt);
                      }
                   }else{
                    //代表有函数
                    $newr = $r;
                    foreach($varList as $varValue){//有函数的情况下要循环里面的变量
                        if(!$row[$varValue]){
                            continue;
                        }
                        $newr = preg_replace('/'.$varName.'\.'.$varValue.'/is',$row[$varValue],$newr);
                    }
                    eval('$last='.$newr.';');
                    if($last){
                        $cnt=str_replace('{'.$r.'}',$last,$cnt);
                    }
                   }

            }
        }

        return $cnt;
     }
     //魔术方法
    function __get($p){
        $c=load_class($p);
        return $c;
    }
    //解析简单变量
    function genSimpleVars($getTpl){
        $pattern = "/\{\s*(\w{1,20})\s*\}/is";

        if(preg_match_all($pattern,$getTpl,$result)){
            $result = $result[1];
            foreach ($result as $r) {
                if(array_key_exists($r, $this->_vars)){
                   $replace_pattern = "/\{\s*".$r."\s*\}/is";
                   $getTpl = preg_replace($replace_pattern,$this->_vars[$r],$getTpl);
                }
            }
        }
        return $getTpl;
    }

  }
 ?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值