当前位置:首页 > CMS教程 > phpcms > 列表

phpcms 模版源码分析

发布:smiling 来源: PHP粉丝网  添加日期:2013-11-15 20:35:06 浏览: 评论:0 
  1. /**  
  2. * 模板调用  
  3. *  
  4. * @param $module  
  5. * @param $template  
  6. * @param $istag  
  7. * @return unknown_type  
  8. */ 
  9. function template($module = 'content'$template = 'index'$style = '') {  
  10.  
  11. if(strpos($module'plugin/')!== false) {  
  12. $plugin = str_replace('plugin/'''$module);  
  13. return p_template($plugin$template,$style);  
  14. }  
  15. $module = str_replace('/', DIRECTORY_SEPARATOR, $module);  
  16. if(!emptyempty($style) && preg_match('/([a-z0-9\-_]+)/is',$style)) {  
  17. elseif (emptyempty($style) && !defined('STYLE')) {  
  18. if(defined('SITEID')) {  
  19. $siteid = SITEID;  
  20. else {  
  21. $siteid = param::get_cookie('siteid');  
  22. }  
  23. if (!$siteid$siteid = 1;  
  24. $sitelist = getcache('sitelist','commons');  
  25. if(!emptyempty($siteid)) {  
  26. $style = $sitelist[$siteid]['default_style'];  
  27. }  
  28. elseif (emptyempty($style) && defined('STYLE')) {  
  29. $style = STYLE;  
  30. else {  
  31. $style = 'default';  
  32. }  
  33. if(!$style$style = 'default';  
  34. $template_cache = pc_base::load_sys_class('template_cache');  
  35. $compiledtplfile = PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_template'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.php';  
  36. if(file_exists(PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html')) {  
  37. if(!file_exists($compiledtplfile) || (@filemtime(PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html') > @filemtime($compiledtplfile))) {  
  38. $template_cache->template_compile($module$template$style);  
  39. }  
  40. else {  
  41. $compiledtplfile = PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_template'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.php';  
  42. if(!file_exists($compiledtplfile) || (file_exists(PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html') && filemtime(PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html') > filemtime($compiledtplfile))) {  
  43. $template_cache->template_compile($module$template'default');  
  44. elseif (!file_exists(PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html')) {  
  45. showmessage('Template does not exist.'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html');  
  46. }  
  47. }  
  48. return $compiledtplfile;  
  49. }  
  50.  
  51.    
  52.  
  53. /**
  54. * 模板解析缓存  
  55. */ 
  56. final class template_cache {  
  57.  
  58. /**
  59. * 编译模板  
  60. *  
  61. * @param $module    模块名称  
  62. * @param $template  模板文件名  
  63. * @param $istag 是否为标签模板  
  64. * @return unknown  
  65. */ 
  66.  
  67. public function template_compile($module$template$style = 'default') {  
  68. if(strpos($module'/')=== false) {  
  69. $tplfile = $_tpl = PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html';  
  70. elseif (strpos($module'yp/') !== false) {  
  71. $module = str_replace('/', DIRECTORY_SEPARATOR, $module);  
  72. $tplfile = $_tpl = PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html';  
  73. else {  
  74. $plugin = str_replace('plugin/'''$module);  
  75. $module = str_replace('/', DIRECTORY_SEPARATOR, $module);  
  76. $tplfile = $_tpl = PC_PATH.'plugin'.DIRECTORY_SEPARATOR.$plugin.DIRECTORY_SEPARATOR.'templates'.DIRECTORY_SEPARATOR.$template.'.html';  
  77. }  
  78. if ($style != 'default' && !file_exists ( $tplfile )) {  
  79. $style = 'default';  
  80. $tplfile = PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html';  
  81. }  
  82. if (! file_exists ( $tplfile )) {  
  83. showmessage ( "templates".DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.".html is not exists!" );  
  84. }  
  85. $content = @file_get_contents ( $tplfile );  
  86.  
  87. $filepath = CACHE_PATH.'caches_template'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR;  
  88. if(!is_dir($filepath)) {  
  89. mkdir($filepath, 0777, true);  
  90. }  
  91. $compiledtplfile = $filepath.$template.'.php';  
  92. $content = $this->template_parse($content);  
  93. $strlen = file_put_contents ( $compiledtplfile$content );  
  94. chmod ( $compiledtplfile, 0777 );  
  95. return $strlen;  
  96. }  
  97.  
  98. /**
  99. * 更新模板缓存  
  100. *  
  101. * @param $tplfile   模板原文件路径  
  102. * @param $compiledtplfile   编译完成后,写入文件名  
  103. * @return $strlen 长度  
  104. */ 
  105. public function template_refresh($tplfile$compiledtplfile) {  
  106. $str = @file_get_contents ($tplfile);  
  107. $str = $this->template_parse ($str);  
  108. $strlen = file_put_contents ($compiledtplfile$str );  
  109. chmod ($compiledtplfile, 0777);  
  110. return $strlen;  
  111. }  
  112. /**
  113. * 解析模板  
  114. *  
  115. * @param $str   模板内容  
  116. * @return ture  
  117. */ 
  118. public function template_parse($str) {  
  119. $str = preg_replace ( "/\{template\s+(.+)\}/""<?php include template(\\1); ?>"$str );  
  120. $str = preg_replace ( "/\{include\s+(.+)\}/""<?php include \\1; ?>"$str );  
  121. $str = preg_replace ( "/\{php\s+(.+)\}/""<?php \\1?>"$str );  
  122. $str = preg_replace ( "/\{if\s+(.+?)\}/""<?php if(\\1) { ?>"$str );  
  123. $str = preg_replace ( "/\{else\}/""<?php } else { ?>"$str );  
  124. $str = preg_replace ( "/\{elseif\s+(.+?)\}/""<?php } elseif (\\1) { ?>"$str );  
  125. $str = preg_replace ( "/\{\/if\}/""<?php } ?>"$str );  
  126. //for 循环  
  127. $str = preg_replace("/\{for\s+(.+?)\}/","<?php for(\\1) { ?>",$str);  
  128. $str = preg_replace("/\{\/for\}/","<?php } ?>",$str);  
  129. //++ --  
  130. $str = preg_replace("/\{\+\+(.+?)\}/","<?php ++\\1; ?>",$str);  
  131. $str = preg_replace("/\{\-\-(.+?)\}/","<?php ++\\1; ?>",$str);  
  132. $str = preg_replace("/\{(.+?)\+\+\}/","<?php \\1++; ?>",$str);  
  133. $str = preg_replace("/\{(.+?)\-\-\}/","<?php \\1--; ?>",$str);  
  134. $str = preg_replace ( "/\{loop\s+(\S+)\s+(\S+)\}/""<?php \$n=1;if(is_array(\\1)) foreach(\\1 AS \\2) { ?>"$str );  
  135. $str = preg_replace ( "/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/""<?php \$n=1; if(is_array(\\1)) foreach(\\1 AS \\2 => \\3) { ?>"$str );  
  136. $str = preg_replace ( "/\{\/loop\}/""<?php \$n++;}unset(\$n); ?>"$str );  
  137. $str = preg_replace ( "/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/""<?php echo \\1;?>"$str );  
  138. $str = preg_replace ( "/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/""<?php echo \\1;?>"$str );  
  139. $str = preg_replace ( "/\{(\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/""<?php echo \\1;?>"$str );  
  140. $str = preg_replace("/\{(\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\}/es""\$this->addquote('<?php echo \\1;?>')",$str);  
  141. $str = preg_replace ( "/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/s""<?php echo \\1;?>"$str );  
  142. $str = preg_replace("/\{pc:(\w+)\s+([^}]+)\}/ie""self::pc_tag('$1','$2', '$0')"$str);  
  143. $str = preg_replace("/\{\/pc\}/ie""self::end_pc_tag()"$str);  
  144. $str = "<?php defined('IN_PHPCMS') or exit('No permission resources.'); ?>" . $str;  
  145. return $str;  
  146. }  
  147.  
  148. /**
  149. * 转义 // 为 /  
  150. *  
  151. * @param $var   转义的字符  
  152. * @return 转义后的字符  
  153. */ 
  154. public function addquote($var) {  
  155. return str_replace ( "\\\"""\"", preg_replace ( "/\[([a-zA-Z0-9_\-\.\x7f-\xff]+)\]/s""['\\1']"$var ) );  
  156. }  
  157.  
  158. /**
  159. * 解析PC标签  
  160. * @param string $op 操作方式  
  161. * @param string $data 参数  
  162. * @param string $html 匹配到的所有的HTML代码  
  163. */ 
  164. public static function pc_tag($op$data$html) {  
  165. preg_match_all("/([a-z]+)\=[\"]?([^\"]+)[\"]?/i"stripslashes($data), $matches, PREG_SET_ORDER);  
  166. $arr = array('action','num','cache','page''pagesize''urlrule''return''start');  
  167. $tools = array('json''xml''block''get');  
  168. $datas = array();  
  169. $tag_id = md5(stripslashes($html));  
  170. //可视化条件  
  171. $str_datas = 'op='.$op.'&tag_md5='.$tag_id;  
  172. foreach ($matches as $v) {  
  173. $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]));  
  174. if(in_array($v[1], $arr)) {  
  175. $$v[1] = $v[2];  
  176. continue;  
  177. }  
  178. $datas[$v[1]] = $v[2];  
  179. }  
  180. $str = '';  
  181. $num = isset($num) && intval($num) ? intval($num) : 20;  
  182. $cache = isset($cache) && intval($cache) ? intval($cache) : 0;  
  183. $return = isset($return) && trim($return) ? trim($return) : 'data';  
  184. if (!isset($urlrule)) $urlrule = '';  
  185. if (!emptyempty($cache) && !isset($page)) {  
  186. $str .= '$tag_cache_name = md5(implode(\'&\','.self::arr_to_html($datas).').\''.$tag_id.'\');if(!$'.$return.' = tpl_cache($tag_cache_name,'.$cache.')){';  
  187. }  
  188. if (in_array($op,$tools)) {  
  189. switch ($op) {  
  190. case 'json':  
  191. if (isset($datas['url']) && !emptyempty($datas['url'])) {  
  192. $str .= '$json = @file_get_contents(\''.$datas['url'].'\');';  
  193. $str .= '$'.$return.' = json_decode($json, true);';  
  194. }  
  195. break;  
  196.  
  197. case 'xml':  
  198. $str .= '$xml = pc_base::load_sys_class(\'xml\');';  
  199. $str .= '$xml_data = @file_get_contents(\''.$datas['url'].'\');';  
  200. $str .= '$'.$return.' = $xml->xml_unserialize($xml_data);';  
  201. break;  
  202.  
  203. case 'get':  
  204. $str .= 'pc_base::load_sys_class("get_model", "model", 0);';  
  205. if ($datas['dbsource']) {  
  206. $dbsource = getcache('dbsource''commons');  
  207. if (isset($dbsource[$datas['dbsource']])) {  
  208. $str .= '$get_db = new get_model('.var_export($dbsource,true).', \''.$datas['dbsource'].'\');';  
  209. else {  
  210. return false;  
  211. }  
  212. else {  
  213. $str .= '$get_db = new get_model();';  
  214. }  
  215. $num = isset($num) && intval($num) > 0 ? intval($num) : 20;  
  216. if (isset($start) && intval($start)) {  
  217. $limit = intval($start).','.$num;  
  218. else {  
  219. $limit = $num;  
  220. }  
  221. if (isset($page)) {  
  222. $str .= '$pagesize = '.$num.';';  
  223. $str .= '$page = intval('.$page.') ? intval('.$page.') : 1;if($page<=0){$page=1;}';  
  224. $str .= '$offset = ($page - 1) * $pagesize;';  
  225. $limit = '$offset,$pagesize';  
  226. if ($sql = preg_replace('/select([^from].*)from/i'"SELECT COUNT(*) as count FROM "$datas['sql'])) {  
  227. $str .= '$r = $get_db->sql_query("'.$sql.'");$s = $get_db->fetch_next();$pages=pages($s[\'count\'], $page, $pagesize, $urlrule);';  
  228. }  
  229. }  
  230.  
  231.  
  232. $str .= '$r = $get_db->sql_query("'.$datas['sql'].' LIMIT '.$limit.'");while(($s = $get_db->fetch_next()) != false) {$a[] = $s;}$'.$return.' = $a;unset($a);';  
  233. break;  
  234.  
  235. case 'block':  
  236. $str .= '$block_tag = pc_base::load_app_class(\'block_tag\', \'block\');';  
  237. $str .= 'echo $block_tag->pc_tag('.self::arr_to_html($datas).');';  
  238. break;  
  239. }  
  240. else {  
  241. if (!isset($action) || emptyempty($action)) return false;  
  242. if (module_exists($op) && file_exists(PC_PATH.DIRECTORY_SEPARATOR.'modules'.DIRECTORY_SEPARATOR.$op.DIRECTORY_SEPARATOR.'classes'.DIRECTORY_SEPARATOR.$op.'_tag.class.php')) {  
  243. $str .= '$'.$op.'_tag = pc_base::load_app_class("'.$op.'_tag", "'.$op.'");if (method_exists($'.$op.'_tag, \''.$action.'\')) {';   
  244. if (isset($start) && intval($start)) {  
  245. $datas['limit'] = intval($start).','.$num;  
  246. else {  
  247. $datas['limit'] = $num;  
  248. }  
  249. if (isset($page)) {  
  250. $str .= '$pagesize = '.$num.';';  
  251. $str .= '$page = intval('.$page.') ? intval('.$page.') : 1;if($page<=0){$page=1;}';  
  252. $str .= '$offset = ($page - 1) * $pagesize;';  
  253. $datas['limit'] = '$offset.",".$pagesize';  
  254. $datas['action'] = $action;  
  255. $str .= '$'.$op.'_total = $'.$op.'_tag->count('.self::arr_to_html($datas).');';  
  256. $str .= '$pages = pages($'.$op.'_total, $page, $pagesize, $urlrule);';  
  257. }  
  258. $str .= '$'.$return.' = $'.$op.'_tag->'.$action.'('.self::arr_to_html($datas).');';  
  259. $str .= '}';  
  260. }   
  261. }  
  262. if (!emptyempty($cache) && !isset($page)) {  
  263. $str .= 'if(!empty($'.$return.')){setcache($tag_cache_name, $'.$return.', \'tpl_data\');}';  
  264. $str .= '}';  
  265. }  
  266. return "<"."?php if(defined('IN_ADMIN') && !defined('HTML')) {echo \"<div class=\\\"admin_piao\\\" pc_action=\\\"".$op."\\\" data=\\\"".$str_datas."\\\"><a href=\\\"javascript:void(0)\\\" class=\\\"admin_piao_edit\\\">".($op=='block' ? L('block_add') : L('edit'))."</a>\";}".$str."?".">";  
  267. }  
  268.  
  269. /**
  270. * PC标签结束  
  271. */ 
  272. static private function end_pc_tag() {  
  273. return '<?php if(defined(\'IN_ADMIN\') && !defined(\'HTML\')) {echo \'</div>\';}?>';  
  274. }  
  275.  
  276. /**
  277. * 转换数据为HTML代码  
  278. * @param array $data 数组  
  279. */ 
  280. private static function arr_to_html($data) {  
  281. if (is_array($data)) {  
  282. $str = 'array(';  
  283. foreach ($data as $key=>$val) {  
  284. if (is_array($val)) {  
  285. $str .= "'$key'=>".self::arr_to_html($val).",";  
  286. else {  
  287. if (strpos($val'$')===0) {  
  288. $str .= "'$key'=>$val,";  
  289. else {  
  290. $str .= "'$key'=>'".new_addslashes($val)."',";  
  291. }  
  292. }  
  293. }  
  294. return $str.')';  
  295. }  
  296. return false;  
  297. }  
  298. }  
  299. ?> 

Tags: phpcms 模版 源码

分享到: