首页 > CMS > PhpCMS > 正文

phpcms-v9,index.php文件分析-前台首页模板文件的解析过程分析

2024-09-10 07:15:33
字体:
来源:转载
供稿:网友

第一步:前台首页默认执行的是:index.php?m=content&c=index&a=init,代码如下:

  1. //首页   
  2. public function init() {   
  3.         if(isset($_GET['siteid'])) {   
  4.             $siteid = intval($_GET['siteid']);          //当前站点ID   
  5.         } else {   
  6.             $siteid = 1;                        //当前站点ID   
  7.         }   
  8.         $siteid = $GLOBALS['siteid'] = max($siteid,1);   
  9.         define('SITEID'$siteid);   
  10.         $_userid = $this->_userid;   
  11.         $_username = $this->_username;   
  12.         $_groupid = $this->_groupid;   
  13.         $SEO = seo($siteid);                        //查看第二步,获取当前站点当前栏目下生成的SEO信息   
  14.         $sitelist  = getcache('sitelist','commons');                //缓存后台设置的所有站点配置信息   
  15.         $default_style = $sitelist[$siteid]['default_style'];       //当前站点默认模板风格配置   
  16.         $CATEGORYS = getcache('category_content_'.$siteid,'commons');   //当前站点所有栏目详细配置信息   
  17.         include template('content','index',$default_style);     //查看第三步:模版调用   
  18. }   

第二步:获取SEO信息:phpcms/libs/functions/global.func.php,代码如下:

  1. /**   
  2.  * 生成SEO   
  3.  * @param $siteid       站点ID   
  4.  * @param $catid        栏目ID   
  5.  * @param $title        标题   
  6.  * @param $description  描述   
  7.  * @param $keyword      关键词   
  8.  */   
  9. function seo($siteid$catid = ''$title = ''$description = ''$keyword = '') {   
  10.     if (!emptyempty($title))$title = strip_tags($title);                     //过滤title   
  11.     if (!emptyempty($description)) $description = strip_tags($description);  //过滤description   
  12.     if (!emptyempty($keyword)) $keyword = str_replace(' '','strip_tags($keyword));//过滤keyword   
  13.     $sites = getcache('sitelist''commons');                           //所有站点详细配置信息   
  14.     $site = $sites[$siteid];                                            //当前站点详细配置信息   
  15.     $cat = array();   
  16.     if (!emptyempty($catid)) {                                               //栏目ID不为空   
  17.         $siteids = getcache('category_content','commons');              //所有栏目对应的站点ID缓存文件,格式:栏目ID=>站点ID   
  18.         $siteid = $siteids[$catid];                                     //当前栏目对应的站点ID   
  19.         $categorys = getcache('category_content_'.$siteid,'commons');   //当前站点下所有栏目的详细配置信息   
  20.         $cat = $categorys[$catid];                                      //当前站点下当前栏目的详细配置信息                       
  21.         $cat['setting'] = string2array($cat['setting']);                //当前站点当前栏目详细配置信息的setting设置信息,转化为数组   
  22.     }   
  23.     //站点title   
  24.     $seo['site_title'] =isset($site['site_title']) && !emptyempty($site['site_title']) ? $site['site_title'] : $site['name'];   
  25.     //关键词   
  26.     $seo['keyword'] = !emptyempty($keyword) ? $keyword : $site['keywords'];   
  27.     //描述   
  28.     $seo['description'] = isset($description) && !emptyempty($description) ? $description : (isset($cat['setting']['meta_description']) && !emptyempty($cat['setting']['meta_description']) ? $cat['setting']['meta_description'] : (isset($site['description']) && !emptyempty($site['description']) ? $site['description'] : ''));   
  29.     //标题   
  30.     $seo['title'] =  (isset($title) && !emptyempty($title) ? $title.' - ' : '').(isset($cat['setting']['meta_title']) && !emptyempty($cat['setting']['meta_title']) ? $cat['setting']['meta_title'].' - ' : (isset($cat['catname']) && !emptyempty($cat['catname']) ? $cat['catname'].' - ' : ''));   
  31.     foreach ($seo as $k=>$v) {   
  32.         $seo[$k] = str_replace(array("/n","/r"),    ''$v);            //将seo信息中/n和/r替换为空   
  33.     }   
  34.     return $seo;                                                        //返回seo数组信息   
  35. }   

第三步:模板调用:phpcms/libs/functions/global.func.php,代码如下:

  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) { //一般情况下不会执行if里面的代码   
  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')) {                                    //是否定义了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');//模板解析类,路径:phpcms/libs/classes/template_cache.class.php   
  35.     //编译文件缓存路径:根目录/caches/caches_template/default/content/index.php   
  36.     $compiledtplfile = PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_template'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.php';   
  37.     //路径:phpcms/templates/dafault/content/index.html ,如:首页模板文件   
  38.     if(file_exists(PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html')) {   
  39.         //如果编译文件不存在或者说模板文件的创建时间大于编译文件的生成时间,则重新编译   
  40.         if(!file_exists($compiledtplfile) || (@filemtime(PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html') > @filemtime($compiledtplfile))) {   
  41.             $template_cache->template_compile($module$template$style);//查看第四步:适用模板风格不是default的情况   
  42.         }   
  43.     } else {   
  44.         //编译文件缓存路径:根目录/caches/caches_template/default/content/index.php   
  45.         $compiledtplfile = PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_template'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.php';   
  46.         //如果编译文件不存在或者说前台公共的模板文件存在,并且前台公共模板文件的创建时间大于编译文件的生成时间   
  47.         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))) {   
  48.             //重新编译   
  49.             $template_cache->template_compile($module$template'default');//查看第四步:适用于模板风格为default的情况   
  50.         } elseif (!file_exists(PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html')) {   
  51.             //如果前台公共的模板文件不存在的话,则提示模板不存在   
  52.             showmessage('Template does not exist.'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html');   
  53.         }  //Vevb.com 
  54.     }   
  55.     //返回编译文件   
  56.     return $compiledtplfile;   
  57. }   

第四步:模板解析:phpcms/libs/classes/template_cache.class.php,代码如下:

  1.        /**   
  2.  * 编译模板   
  3.  *   
  4.  * @param $module   模块名称   
  5.  * @param $template 模板文件名   
  6.  * @param $istag    是否为标签模板   
  7.  * @return unknown   
  8.  */   
  9.    
  10. public function template_compile($module$template$style = 'default') {   
  11.     if(strpos($module'/')=== false) {//如果"/"不存在   
  12.         //路径:phpcms/templates/default/content/index.html ,如:首页公共模板文件   
  13.         $tplfile = $_tpl = PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html';   
  14.     } elseif (strpos($module'yp/') !== false) {   
  15.         $module = str_replace('/', DIRECTORY_SEPARATOR, $module);   
  16.         $tplfile = $_tpl = PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html';   
  17.     } else {   
  18.         $plugin = str_replace('plugin/'''$module);   
  19.         $module = str_replace('/', DIRECTORY_SEPARATOR, $module);   
  20.         $tplfile = $_tpl = PC_PATH.'plugin'.DIRECTORY_SEPARATOR.$plugin.DIRECTORY_SEPARATOR.'templates'.DIRECTORY_SEPARATOR.$template.'.html';   
  21.     }   
  22.     if ($style != 'default' && !file_exists ( $tplfile )) {   
  23.         $style = 'default';   
  24.         $tplfile = PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html';   
  25.     }   
  26.     if (! file_exists ( $tplfile )) {   
  27.         //如果公共模板文件不存在,则提示模板文件不存在,如:/templates/default/content/index.html is not exists!   
  28.         showmessage ( "templates".DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.".html is not exists!" );   
  29.     }   
  30.     //获取公共模板文件中的内容   
  31.     $content = @file_get_contents ( $tplfile );   
  32.     //要生成的编译文件所在目录   
  33.     $filepath = CACHE_PATH.'caches_template'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR;   
  34.     if(!is_dir($filepath)) {   
  35.         //如果目录不存在,则层级创建所有目录   
  36.         mkdir($filepath, 0777, true);   
  37.     }   
  38.     //编译文件的全路径   
  39.     $compiledtplfile = $filepath.$template.'.php';   
  40.     //解析公共模板文件中的内容及标签,并返回解析后的内容   
  41.     $content = $this->template_parse($content);//查看第五步   
  42.     //将解析后的公共模板文件内容写入到要生成的编译文件中   
  43.     $strlen = file_put_contents ( $compiledtplfile$content );   
  44.     //给生成的编译文件设置权限   
  45.     chmod ( $compiledtplfile, 0777 );   
  46.     return $strlen;//返回写入编译文件的字节数   
  47. }   

第五步:模板解析:phpcms/libs/classes/template_cache.class.php,代码如下:

  1.       /**   
  2.  * 解析模板   
  3.  *   
  4.  * @param $str  模板内容   
  5.  * @return ture   
  6.  */   
  7. public function template_parse($str) {   
  8.     $str = preg_replace ( "//{template/s+(.+)/}/""<?php include template(//1); ?>"$str );   
  9.     $str = preg_replace ( "//{include/s+(.+)/}/""<?php include //1; ?>"$str );   
  10.     $str = preg_replace ( "//{php/s+(.+)/}/""<?php //1?>"$str );   
  11.     $str = preg_replace ( "//{if/s+(.+?)/}/""<?php if(//1) { ?>"$str );   
  12.     $str = preg_replace ( "//{else/}/""<?php } else { ?>"$str );   
  13.     $str = preg_replace ( "//{elseif/s+(.+?)/}/""<?php } elseif (//1) { ?>"$str );   
  14.     $str = preg_replace ( "//{//if/}/""<?php } ?>"$str );   
  15.     //for 循环   
  16.     $str = preg_replace("//{for/s+(.+?)/}/","<?php for(//1) { ?>",$str);   
  17.     $str = preg_replace("//{//for/}/","<?php } ?>",$str);   
  18.     //++ --   
  19.     $str = preg_replace("//{/+/+(.+?)/}/","<?php ++//1; ?>",$str);   
  20.     $str = preg_replace("//{/-/-(.+?)/}/","<?php ++//1; ?>",$str);   
  21.     $str = preg_replace("//{(.+?)/+/+/}/","<?php //1++; ?>",$str);   
  22.     $str = preg_replace("//{(.+?)/-/-/}/","<?php //1--; ?>",$str);   
  23.     $str = preg_replace ( "//{loop/s+(/S+)/s+(/S+)/}/""<?php /$n=1;if(is_array(//1)) foreach(//1 AS //2) { ?>"$str );   
  24.     $str = preg_replace ( "//{loop/s+(/S+)/s+(/S+)/s+(/S+)/}/""<?php /$n=1; if(is_array(//1)) foreach(//1 AS //2 => //3) { ?>"$str );   
  25.     $str = preg_replace ( "//{//loop/}/""<?php /$n++;}unset(/$n); ?>"$str );   
  26.     $str = preg_replace ( "//{([a-zA-Z_/x7f-/xff][a-zA-Z0-9_/x7f-/xff:]*/(([^{}]*)/))/}/""<?php echo //1;?>"$str );   
  27.     $str = preg_replace ( "//{//$([a-zA-Z_/x7f-/xff][a-zA-Z0-9_/x7f-/xff:]*/(([^{}]*)/))/}/""<?php echo //1;?>"$str );   
  28.     $str = preg_replace ( "//{(//$[a-zA-Z_/x7f-/xff][a-zA-Z0-9_/x7f-/xff]*)/}/""<?php echo //1;?>"$str );   
  29.     $str = preg_replace("//{(//$[a-zA-Z0-9_/[/]/'/"/$/x7f-/xff]+)/}/es""/$this->addquote('<?php echo //1;?>')",$str);   
  30.     $str = preg_replace ( "//{([A-Z_/x7f-/xff][A-Z0-9_/x7f-/xff]*)/}/s""<?php echo //1;?>"$str );   
  31.     $str = preg_replace("//{pc:(/w+)/s+([^}]+)/}/ie""self::pc_tag('$1','$2', '$0')"$str);//查看第六步:解析pc标签的开始标签   
  32.     $str = preg_replace("//{//pc/}/ie""self::end_pc_tag()"$str);//查看第六步:解析pc标签的结束标签   
  33.     $str = "<?php defined('IN_PHPCMS') or exit('No permission resources.'); ?>" . $str;   
  34.     return $str;   
  35. }   

第六步:pc标签的解析,代码如下:

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表