PConline 发表于 2008-4-28 08:17:40

CI中实现视图页面的可视化编辑

这个也是我个人开发的习惯才这么做的,达到了本人的目标,但性能上没有优化,希望各位多多执教。谢谢!

动机:在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函数中稍作修改就行。
ob_start();

$content = file_get_contents($_ci_path);
//替换包含文件
$content=$this->replace_template($content);

下面是replace_template函数,添加到改文件最后就行:
/**
* 对模版中的变量进行替换
*
* @param string $template
*/
function replace_template($template)
{
/***
   * 替换模板如果存在子模板则进行替换,子模板格式为:
   * <!--#include file="module-action.htm" -->
   */
$sub = preg_match_all('/<!--#include file="(+)" -->/i', $template, $var);
if (!empty ($sub)) {
   foreach ($var 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 as $tag) {
    if (preg_match('/^*(if|elseif|loop)*/i', $tag, $match)) {
   $pattern = '<!--{' . $tag . '}-->';
   $arg = substr($tag, strlen($match));
   if ($match == 'loop') { //loop
      $rpc = $this->_parseLoop($arg);
   }elseif($match == 'if' || $match == 'elseif'){
      $rpc=$this->_parseIf($arg,$match);
   }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('/($*)/',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);
    $cnt=count($arr);
    if($cnt===4){
   $counter=$arr;
   $rtn=$var. ' as '.$arr.'=>'.$arr;
    }elseif($cnt==3){
   $rtn=$var. ' as '.$arr.'=>'.$arr;
    }elseif($cnt==2){
   $rtn=$var. ' as '.$arr;
    }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('/($*)/',trim($str),$var)){
   $rpc=$this->_parseVarMore($var);
   $str=str_replace($var,$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;
}
}

PConline 发表于 2008-4-28 08:21:18

原来代码高亮要这样弄啊。。。晕死。。。

Hex 发表于 2008-4-28 09:38:37

呵呵,我修改了几个单引号,因为 DZ 论坛的代码处理关系,呵呵~

missquiet 发表于 2010-3-31 10:05:12

:lol
{:2_42:}
页: [1]
查看完整版本: CI中实现视图页面的可视化编辑