|
这个也是我个人开发的习惯才这么做的,达到了本人的目标,但性能上没有优化,希望各位多多执教。谢谢!
动机:在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函数中稍作修改就行。
下面是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;
}
} 复制代码 |
-
评分
-
查看全部评分
|