标签:style http io os ar for 文件 数据 div
CodeIgniter 很适合小站点应用开发,但是它自带的view功能可能会给不懂PHP的前端人员带来麻烦。 相比之下phpcms的view模板解析就强大多了,所以这里就把PHPCMS的模板解析功能剥离出来,加到PHPCMS上。
首先在CodeIgniter libraries中 增加 template_cache.php老品牌娱乐城
001 |
<?php if (!defined( ‘BASEPATH‘ )) exit ( ‘No direct script access allowed‘ ); |
002 |
/** |
003 |
* 模板解析缓存 |
004 |
*/ |
005 |
final class template_cache { |
006 |
|
007 |
public $cache_path ; |
008 |
public function __construct() |
009 |
{ |
010 |
//$CI =& get_instance(); |
011 |
$this ->cache_path = APPPATH. ‘views‘ ; |
012 |
} |
013 |
|
014 |
/** |
015 |
* 编译模板 |
016 |
* |
017 |
* @param $module 模块名称 |
018 |
* @param $template 模板文件名 |
019 |
* @param $istag 是否为标签模板 |
020 |
* @return unknown |
021 |
*/ |
022 |
|
023 |
public function template_compile( $module , $template , $style = ‘default‘ ) { |
024 |
|
025 |
$tplfile = APPPATH. ‘views‘ .DIRECTORY_SEPARATOR. $module .DIRECTORY_SEPARATOR. $template . ‘.php‘ ; |
026 |
|
027 |
if (! file_exists ( $tplfile )) { |
028 |
show_error( $tplfile , 500 , ‘Template does not exist(1)‘ ); |
029 |
} |
030 |
|
031 |
$content = @ file_get_contents ( $tplfile ); |
032 |
033 |
$filepath = $this ->cache_path.DIRECTORY_SEPARATOR. ‘caches_template‘ .DIRECTORY_SEPARATOR. $style .DIRECTORY_SEPARATOR. $module .DIRECTORY_SEPARATOR; |
034 |
|
035 |
|
036 |
if (! is_dir ( $filepath )) { |
037 |
mkdir ( $filepath , 0777, true); |
038 |
} |
039 |
$compiledtplfile = $filepath . $template . ‘.php‘ ; |
040 |
$content = $this ->template_parse( $content ); |
041 |
$strlen = file_put_contents ( $compiledtplfile , $content ); |
042 |
chmod ( $compiledtplfile , 0777 ); |
043 |
return $strlen ; |
044 |
} |
045 |
|
046 |
/** |
047 |
* 更新模板缓存 |
048 |
* |
049 |
* @param $tplfile 模板原文件路径 |
050 |
* @param $compiledtplfile 编译完成后,写入文件名 |
051 |
* @return $strlen 长度 |
052 |
*/ |
053 |
public function template_refresh( $tplfile , $compiledtplfile ) { |
054 |
$str = @ file_get_contents ( $tplfile ); |
055 |
$str = $this ->template_parse ( $str ); |
056 |
$strlen = file_put_contents ( $compiledtplfile , $str ); |
057 |
chmod ( $compiledtplfile , 0777); |
058 |
return $strlen ; |
059 |
} |
060 |
|
061 |
062 |
/** |
063 |
* 解析模板 |
064 |
* |
065 |
* @param $str 模板内容 |
066 |
* @return ture |
067 |
*/ |
068 |
public function template_parse( $str ) { |
069 |
$str = preg_replace ( "/\{template\s+(.+)\}/" , "<?php include template(\\1); ?>" , $str ); |
070 |
$str = preg_replace ( "/\{include\s+(.+)\}/" , "<?php include \\1; ?>" , $str ); |
071 |
$str = preg_replace ( "/\{view\s+(.+)\}/" , "<?php \$this->load->view(\\1); ?>" , $str ); |
072 |
$str = preg_replace ( "/\{php\s+(.+)\}/" , "<?php \\1?>" , $str ); |
073 |
//alex fix |
074 |
$str = preg_replace ( "/\{{if\s+(.+?)\}}/" , "``if \\1``" , $str ); |
075 |
$str = preg_replace ( "/\{{else\}}/" , "``else``" , $str ); |
076 |
$str = preg_replace ( "/\{{\/if\}}/" , "``/if``" , $str ); |
077 |
|
078 |
$str = preg_replace ( "/\{if\s+(.+?)\}/" , "<?php if(\\1) { ?>" , $str ); |
079 |
$str = preg_replace ( "/\{else\}/" , "<?php } else { ?>" , $str ); |
080 |
$str = preg_replace ( "/\{elseif\s+(.+?)\}/" , "<?php } elseif (\\1) { ?>" , $str ); |
081 |
$str = preg_replace ( "/\{\/if\}/" , "<?php } ?>" , $str ); |
082 |
|
083 |
//for 循环 |
084 |
$str = preg_replace( "/\{for\s+(.+?)\}/" , "<?php for(\\1) { ?>" , $str ); |
085 |
$str = preg_replace( "/\{\/for\}/" , "<?php } ?>" , $str ); |
086 |
//++ -- |
087 |
$str = preg_replace( "/\{\+\+(.+?)\}/" , "<?php ++\\1; ?>" , $str ); |
088 |
$str = preg_replace( "/\{\-\-(.+?)\}/" , "<?php ++\\1; ?>" , $str ); |
089 |
$str = preg_replace( "/\{(.+?)\+\+\}/" , "<?php \\1++; ?>" , $str ); |
090 |
$str = preg_replace( "/\{(.+?)\-\-\}/" , "<?php \\1--; ?>" , $str ); |
091 |
//alex fix |
092 |
$str = preg_replace ( "/\``if\s+(.+?)\``/" , "{{if \\1}}" , $str ); |
093 |
$str = preg_replace ( "/\``else``/" , "{{else}}" , $str ); |
094 |
$str = preg_replace ( "/\``\/if\``/" , "{{/if}}" , $str ); |
095 |
|
096 |
$str = preg_replace ( "/\{loop\s+(\S+)\s+(\S+)\}/" , "<?php \$n=1;if(is_array(\\1)) foreach(\\1 AS \\2) { ?>" , $str ); |
097 |
$str = preg_replace ( "/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/" , "<?php \$n=1; if(is_array(\\1)) foreach(\\1 AS \\2 => \\3) { ?>" , $str ); |
098 |
$str = preg_replace ( "/\{\/loop\}/" , "<?php \$n++;}unset(\$n); ?>" , $str ); |
099 |
$str = preg_replace ( "/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/" , "<?php echo \\1;?>" , $str ); |
100 |
$str = preg_replace ( "/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/" , "<?php echo \\1;?>" , $str ); |
101 |
$str = preg_replace ( "/\{(\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/" , "<?php echo \\1;?>" , $str ); |
102 |
$str = preg_replace( "/\{(\\$[a-zA-Z0-9_\[\]\‘\"\$\x7f-\xff]+)\}/es" , "\$this->addquote(‘<?php echo \\1;?>‘)" , $str ); |
103 |
$str = preg_replace ( "/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/s" , "<?php echo \\1;?>" , $str ); |
104 |
$str = preg_replace( "/\{pc:(\w+)\s+([^}]+)\}/ie" , "self::pc_tag(‘$1‘,‘$2‘, ‘$0‘)" , $str ); |
105 |
$str = preg_replace( "/\{\/pc\}/ie" , "self::end_pc_tag()" , $str ); |
106 |
$str = "<?php defined(‘BASEPATH‘) or exit(‘No direct script access allowed.‘); ?>" . $str ; |
107 |
return $str ; |
108 |
} |
109 |
110 |
/** |
111 |
* 转义 // 为 / |
112 |
* |
113 |
* @param $var 转义的字符 |
114 |
* @return 转义后的字符 |
115 |
*/ |
116 |
public function addquote( $var ) { |
117 |
return str_replace ( "\\\"" , "\"" , preg_replace ( "/\[([a-zA-Z0-9_\-\.\x7f-\xff]+)\]/s" , "[‘\\1‘]" , $var ) ); |
118 |
} |
119 |
|
120 |
/** |
121 |
* 解析PC标签 |
122 |
* @param string $op 操作方式 |
123 |
* @param string $data 参数 |
124 |
* @param string $html 匹配到的所有的HTML代码 |
125 |
*/ |
126 |
public static function pc_tag( $op , $data , $html ) { |
127 |
preg_match_all( "/([a-z]+)\=[\"]?([^\"]+)[\"]?/i" , stripslashes ( $data ), $matches , PREG_SET_ORDER); |
128 |
$arr = array ( ‘action‘ , ‘num‘ , ‘cache‘ , ‘page‘ , ‘pagesize‘ , ‘urlrule‘ , ‘return‘ , ‘start‘ , ‘setpages‘ ); |
129 |
$tools = array ( ‘json‘ , ‘xml‘ , ‘block‘ , ‘get‘ ); |
130 |
$datas = array (); |
131 |
$tag_id = md5( stripslashes ( $html )); |
132 |
//可视化条件 |
133 |
$str_datas = ‘op=‘ . $op . ‘&tag_md5=‘ . $tag_id ; |
134 |
foreach ( $matches as $v ) { |
135 |
$str_datas .= $str_datas ? "&$v[1]=" .( $op == ‘block‘ && strpos ( $v [2], ‘$‘ ) === 0 ? $v [2] : urlencode( $v [2])) : "$v[1]=" .( strpos ( $v [2], ‘$‘ ) === 0 ? $v [2] : urlencode( $v [2])); |
136 |
if (in_array( $v [1], $arr )) { |
137 |
$ $v [1] = $v [2]; |
138 |
continue ; |
139 |
} |
140 |
$datas [ $v [1]] = $v [2]; |
141 |
} |
142 |
$str = ‘‘ ; |
143 |
$setpages = isset( $setpages ) && intval ( $setpages ) ? intval ( $setpages ) : 10; |
144 |
$num = isset( $num ) && intval ( $num ) ? intval ( $num ) : 20; |
145 |
$cache = isset( $cache ) && intval ( $cache ) ? intval ( $cache ) : 0; |
146 |
$return = isset( $return ) && trim( $return ) ? trim( $return ) : ‘data‘ ; |
147 |
if (!isset( $urlrule )) $urlrule = ‘‘ ; |
148 |
if (! empty ( $cache ) && !isset( $page )) { |
149 |
$str .= ‘$tag_cache_name = md5(implode(\‘&\‘,‘ .self::arr_to_html( $datas ). ‘).\‘‘ . $tag_id . ‘\‘);if(!$‘ . $return . ‘ = tpl_cache($tag_cache_name,‘ . $cache . ‘)){‘ ; |
150 |
} |
151 |
if (in_array( $op , $tools )) { |
152 |
switch ( $op ) { |
153 |
case ‘json‘ : |
154 |
if (isset( $datas [ ‘url‘ ]) && ! empty ( $datas [ ‘url‘ ])) { |
155 |
$str .= ‘$json = @file_get_contents(\‘‘ . $datas [ ‘url‘ ]. ‘\‘);‘ ; |
156 |
$str .= ‘$‘ . $return . ‘ = json_decode($json, true);‘ ; |
157 |
} |
158 |
break ; |
159 |
|
160 |
case ‘block‘ : |
161 |
$str .= ‘$block_tag = pc_base::load_app_class(\‘block_tag\‘, \‘block\‘);‘ ; |
162 |
$str .= ‘echo $block_tag->pc_tag(‘ .self::arr_to_html( $datas ). ‘);‘ ; |
163 |
break ; |
164 |
} |
165 |
} else { |
166 |
if (!isset( $action ) || empty ( $action )) return false; |
167 |
if ( file_exists (APPPATH. ‘libraries‘ .DIRECTORY_SEPARATOR. $op . ‘_tag.php‘ )) { |
168 |
$str .= ‘if(!isset($CI))$CI =& get_instance();$CI->load->library("‘ . $op . ‘_tag");if (method_exists($CI->‘ . $op . ‘_tag, \‘‘ . $action . ‘\‘)) {‘ ; |
169 |
if (isset( $start ) && intval ( $start )) { |
170 |
$datas [ ‘limit‘ ] = intval ( $start ). ‘,‘ . $num ; |
171 |
} else { |
172 |
$datas [ ‘limit‘ ] = $num ; |
173 |
} |
174 |
if (isset( $page )) { |
175 |
$str .= ‘$pagesize = ‘ . $num . ‘;‘ ; |
176 |
$str .= ‘$page = intval(‘ . $page . ‘) ? intval(‘ . $page . ‘) : 1;if($page<=0){$page=1;}‘ ; |
177 |
$str .= ‘$offset = ($page - 1) * $pagesize;$urlrule="‘ . $urlrule . ‘";‘ ; |
178 |
$datas [ ‘limit‘ ] = ‘$offset.",".$pagesize‘ ; |
179 |
$datas [ ‘action‘ ] = $action ; |
180 |
$str .= ‘$‘ . $op . ‘_total = $CI->‘ . $op . ‘_tag->count(‘ .self::arr_to_html( $datas ). ‘);‘ ; |
181 |
|
182 |
$str .= ‘if($‘ . $op . ‘_total>$pagesize){ $pages = pages($‘ . $op . ‘_total, $page, $pagesize, $urlrule); } else { $pages="" ;}‘ ; |
183 |
} |
184 |
$str .= ‘$‘ . $return . ‘ = $CI->‘ . $op . ‘_tag->‘ . $action . ‘(‘ .self::arr_to_html( $datas ). ‘);‘ ; |
185 |
$str .= ‘}‘ ; |
186 |
} |
187 |
} |
188 |
if (! empty ( $cache ) && !isset( $page )) { |
189 |
$str .= ‘if(!empty($‘ . $return . ‘)){setcache($tag_cache_name, $‘ . $return . ‘, \‘tpl_data\‘);}‘ ; |
190 |
$str .= ‘}‘ ; |
191 |
} |
192 |
return "<" . "?php " . $str . "?" . ">" ; |
193 |
} |
194 |
|
195 |
/** |
196 |
* PC标签结束 |
197 |
*/ |
198 |
static private function end_pc_tag() { |
199 |
return ‘<?php if(defined(\‘IN_ADMIN\‘) && !defined(\‘HTML\‘)) {if(isset($data))unset($data);echo \‘</div>\‘;}?>‘ ; |
200 |
} |
201 |
|
202 |
/** |
203 |
* 转换数据为HTML代码 |
204 |
* @param array $data 数组 |
205 |
*/ |
206 |
private static function arr_to_html( $data ) { |
207 |
if ( is_array ( $data )) { |
208 |
$str = ‘array(‘ ; |
209 |
foreach ( $data as $key => $val ) { |
210 |
if ( is_array ( $val )) { |
211 |
$str .= "‘$key‘=>" .self::arr_to_html( $val ). "," ; |
212 |
} else { |
213 |
if ( strpos ( $val , ‘$‘ )===0) { |
214 |
$str .= "‘$key‘=>$val," ; |
215 |
} else { |
216 |
$str .= "‘$key‘=>‘" .self::new_addslashes( $val ). "‘," ; |
217 |
} |
218 |
} |
219 |
} |
220 |
return $str . ‘)‘ ; |
221 |
} |
222 |
return false; |
223 |
} |
224 |
|
225 |
/** |
226 |
* 返回经addslashes处理过的字符串或数组 |
227 |
* @param $string 需要处理的字符串或数组 |
228 |
* @return mixed |
229 |
*/ |
230 |
function new_addslashes( $string ){ |
231 |
if (! is_array ( $string )) return addslashes ( $string ); |
232 |
foreach ( $string as $key => $val ) $string [ $key ] = new_addslashes( $val ); |
233 |
return $string ; |
234 |
} |
235 |
} |
然后在global_helper中增加一个 template函数
01 |
if ( ! function_exists( ‘template‘ )) |
02 |
{ |
03 |
/** |
04 |
* 模板调用 |
05 |
* |
06 |
* @param $module |
07 |
* @param $template |
08 |
* @param $istag |
09 |
* @return unknown_type |
10 |
*/ |
11 |
function template( $module = ‘expatree‘ , $template = ‘index‘ , $style = ‘expatree‘ , $return_full_path =true) { |
12 |
global $CI ; |
13 |
if (!isset( $CI )) $CI =& get_instance(); |
14 |
if (! $style ) $style = ‘default‘ ; |
15 |
$CI ->load->library( ‘template_cache‘ , ‘template_cache‘ ); |
16 |
$template_cache = $CI ->template_cache; |
17 |
//编译模板生成地址 |
18 |
$compiledtplfile = $template_cache ->cache_path.DIRECTORY_SEPARATOR. ‘caches_template‘ .DIRECTORY_SEPARATOR. $style .DIRECTORY_SEPARATOR. $module .DIRECTORY_SEPARATOR. $template .EXT; |
19 |
//视图文件 |
20 |
$tplfile = APPPATH. ‘views‘ .DIRECTORY_SEPARATOR. $module .DIRECTORY_SEPARATOR. $template .EXT; |
21 |
if ( file_exists ( $tplfile )) { |
22 |
if (! file_exists ( $compiledtplfile ) || (@ filemtime ( $tplfile ) > @ filemtime ( $compiledtplfile ))) { |
23 |
$template_cache ->template_compile( $module , $template , $style ); |
24 |
} |
25 |
} else { |
26 |
//如果没有就调取默认风格模板 |
27 |
$compiledtplfile = $template_cache ->cache_path.DIRECTORY_SEPARATOR. ‘caches_template‘ .DIRECTORY_SEPARATOR. ‘default‘ .DIRECTORY_SEPARATOR. $module .DIRECTORY_SEPARATOR. $template .EXT; |
28 |
if (! file_exists ( $compiledtplfile ) || ( file_exists ( $tplfile ) && filemtime ( $tplfile ) > filemtime ( $compiledtplfile ))) { |
29 |
$template_cache ->template_compile( $module , $template , ‘default‘ ); |
30 |
} elseif (! file_exists ( $tplfile )) { |
31 |
show_error( $tplfile , 500 , ‘Template does not exist(0)‘ ); |
32 |
} |
33 |
} |
34 |
35 |
if ( $return_full_path ) |
36 |
return $compiledtplfile ; |
37 |
else |
38 |
return ‘caches_template‘ .DIRECTORY_SEPARATOR. $style .DIRECTORY_SEPARATOR. $module .DIRECTORY_SEPARATOR. $template ; |
39 |
} |
40 |
} |
然后在MY_Controller.php,增加一个方法
01 |
/** |
02 |
* 自动模板调用 |
03 |
* |
04 |
* @param $module |
05 |
* @param $template |
06 |
* @param $istag |
07 |
* @return unknown_type |
08 |
*/ |
09 |
protected function view( $view_file , $page_data =false, $cache =false) |
10 |
{ |
11 |
$view_file = $this ->template( $this ->page_data[ ‘controller_name‘ ]. $this ->page_data[ ‘module_name‘ ], $view_file ); |
12 |
|
13 |
$this ->load->view( $view_file , $page_data ); |
14 |
} |
这样基本上完成了,可以直接phpcms模板语法了。
标签:style http io os ar for 文件 数据 div
原文地址:http://www.cnblogs.com/laoyangman/p/3987583.html