用户
 找回密码
 入住 CI 中国社区
搜索
查看: 4725|回复: 3
收起左侧

[讨论/交流] CI中实现视图页面的可视化编辑

[复制链接]
发表于 2008-4-28 08:17:40 | 显示全部楼层 |阅读模式
这个也是我个人开发的习惯才这么做的,达到了本人的目标,但性能上没有优化,希望各位多多执教。谢谢!

动机:在ci中感觉要加载样式,图片,js等都的放到主目录下,在views目录中的视图文件中,无法看到自己页面设计的怎么样,感觉很不舒服,自己对网页编辑一直都是dw,现在我想要是能够实现可视化多好。

架构:views目录下文件存放位置吧,呵呵,如下:
views
       misc
             style
             js
             images
       index.php
       default.php
其中misc是用来存放这些js,style,images的目录。

思路:
     1.我在视图文件中,如index.php,你可以包含文件:<!--#include file='head.php'--->;你可以直接写css的加载:<link href="misc/style/default.css" rel="stylesheet" type="text/css" />;你可以直接加载js文件:<script type="text/javascript" src="misc/js/admin-index.js"></script>;你还可以加载php变量<!-{$abc}-->
     2.想办法在模版解析前用正则将这些匹配出来。如:<!--#include file='head.php'--->,匹配到head.php,就知道包含head.php文件,匹配到misc就在前面加上绝对路径。匹配到<!-{}-->就让他echo里面的变量。。。。等等你可以写很多自己想要的东西。

程序:
    只要在loader.php中_ci_load函数中稍作修改就行。
PHP复制代码
  ob_start();
 
  $content = file_get_contents($_ci_path);
  //替换包含文件
  $content=$this->replace_template($content);
复制代码


下面是replace_template函数,添加到改文件最后就行:
PHP复制代码
/**
  * 对模版中的变量进行替换
  *
  * @param string $template
  */
function replace_template($template)
{
  /***
   * 替换模板如果存在子模板则进行替换,子模板格式为:
   * <!--#include file="module-action.htm" -->
   */
  $sub = preg_match_all('/<!--#include file="([a-zA-Z0-9?._-]+)" -->/i', $template, $var);
  if (!empty ($sub)) {
   foreach ($var[1] as $subfile) {
    if ($this->_check_subfile($subfile)) {
     $replace = implode('', file($this->_ci_view_path . $subfile));//读取子模板内容
    }
    else {
     $replace = '<br />;Parser Error: Subtemplate not found: [' . $subfile . ']<br />';
    }
    $template = str_replace('<!--#include file="' . $subfile . '" -->', $replace, $template);
   }
  }
  /**
   * 替换<!--{else}-->
   * <!--{/loop}-->
   * <!--{/if}-->
   */
  $pattern = array (
   '/<!--{/if}-->/',
   '/<!--{else}-->/',
   '/<!--{/loop}-->/'
  );
  $rpc = array (
   "<?phpnt}n?>",
   "<?phpnt}else{n?>",
   "<?phpnt}ntt}n?>"
  );
  $template = preg_replace($pattern, $rpc, $template);
  /**
   * 替换:
   * <!--{loop $array $key=>$value}-->
   * <!--{if expresion}-->
   * <!--{elseif expresion}-->
   */
  if (preg_match_all("/<!--{(.+?)}-->/", $template, $var)) {
   foreach ($var[1] as $tag) {
    if (preg_match('/^*(if|elseif|loop)*/i', $tag, $match)) {
     $pattern = '<!--{' . $tag . '}-->';
     $arg = substr($tag, strlen($match[0]));
     if ($match[1] == 'loop') { //loop
      $rpc = $this->_parseLoop($arg);
     }elseif($match[1] == 'if' || $match[1] == 'elseif'){
      $rpc=$this->_parseIf($arg,$match[1]);
     }else{
      $rpc=false;
     }
     if($rpc){
      $template = str_replace($pattern, $rpc, $template);
     }
    }else{
     //替换<!--{$xxx}-->
     $pattern='<!--{'.$tag.'}-->';
     $rpc="<?=" .$this->_parseExprssion($tag)."?>";
     $template = str_replace($pattern, $rpc, $template);
    }
   }
  }
  //更换misc资源
  $tpl_url_root = view_url();
  $pattern = array (
   '"misc/',
   "'misc/",
   'url(misc/',
   '=misc/'
  );
  $rpc = array (
   '"' . $tpl_url_root . 'misc/',
   "'" . $tpl_url_root . 'misc/',
   'url(' . $tpl_url_root . 'misc/',
   '=' . $tpl_url_root . 'misc/',
  );
  $template = str_replace($pattern, $rpc, $template);
  return $template;
}
 
/**
  * 检查文件是否存在
  *
  * @param string $subfile
  * @return bool
  */
function _check_subfile($subfile) {
  $pos = strpos($subfile, '.php');
  if ($pos !== false) {
   $file = $this->_ci_view_path . substr($subfile, 0, $pos +4);
   if (file_exists($file)) {
    return true;
   } else {
    return false;
   }
  } else {
   return false;
  }
}
 
function _parseIf($str='',$if_else='if'){
  if(preg_match_all('/($[a-zA-Z_][a-zA-Z0-9._]*)/',trim($str),$var)){
   $str=$this->_parseExprssion($str);//debug($str,$var);
   if($if_else==='if'){
    return "<?phpntif(".$str."){n?>";
   }else{
    return "<?phpnt}elseif(".$str."){n?>";
   }
  }else{
   return false;
  }
}
function _parseLoop($str = null) {
  static $i=0;
  $str=preg_replace('/(s)+/',' ',$str);
  $rtn='';
  $counter='$i';
  if($i)$counter.$i;
  if($str){
   if(strpos($str,' ')){
    $arr= explode(' ', trim($str));
    $var=$this->_parseExpressName($arr[0]);
    $cnt=count($arr);
    if($cnt===4){
     $counter=$arr[3];
     $rtn=$var. ' as '.$arr[1].'=>'.$arr[2];
    }elseif($cnt==3){
     $rtn=$var. ' as '.$arr[1].'=>'.$arr[2];
    }elseif($cnt==2){
     $rtn=$var. ' as '.$arr[1];
    }else{
     return false;
    }
   }else{
    $var=$this->_parseExpressName($str);
    $rtn='('.$var.' as $value){';
   }
   $str="<?phpnif(!empty(".$var.") && is_array(".$var.")){nt$counter=-1;ntforeach(" .$rtn.'){'."ntt$counter++n?>";
   $i++;
   return $str;
  }else{
   return false;
  }
}
function _parseExprssion($str=''){
  if(preg_match_all('/($[a-zA-Z_][a-zA-Z0-9.$_]*)/',trim($str),$var)){
   $rpc=$this->_parseVarMore($var[1]);
   $str=str_replace($var[1],$rpc,$str);
  }
  return $str;
}
function _parseVarMore($arr){
  if(is_array($arr) && $arr){
   foreach($arr as $key=>$value){
    $arr[$key]=$this->_parseExpressName($value);
   }
   return $arr;
  }else{
   return false;
  }
}
function _parseExpressName($tag) {
  if (strpos($tag, '.')) {
   list ($parent, $tag) = explode('.', $tag, 2);
   $obj = $parent;
   while (is_int(strpos($tag, '.'))) {
    list ($parent, $tag) = explode('.', $tag, 2);
    if(is_numeric($parent)) {
     $obj .= '[' . $parent . ']';
    } else {
     $obj .= '["' . $parent . '"]';
    }
   }
   if (!is_numeric($tag)) {
    $obj .= '["' . $tag . '"]';
   } else {
    $obj .= "[$tag]";
   }
  } else {
   if($tag){
    $obj = $tag;
   }else{
    $obj='';
   }
  }
  return $obj;
}
function _regexFuncVars($arr){
  if(is_array($arr) && $arr){
   foreach($arr as $key=>$value){
    $arr[$key]='/'.$value.'(?!()/';
   }
   return $arr;
  }else{
   return false;
  }
}
复制代码
未命名.gif

评分

参与人数 1威望 +5 收起 理由
Hex + 5 原创内容

查看全部评分

 楼主| 发表于 2008-4-28 08:21:18 | 显示全部楼层
原来代码高亮要这样弄啊。。。晕死。。。
发表于 2008-4-28 09:38:37 | 显示全部楼层
呵呵,我修改了几个单引号,因为 DZ 论坛的代码处理关系,呵呵~
发表于 2010-3-31 10:05:12 | 显示全部楼层

本版积分规则