转自:http://www.cnblogs.com/Braveliu/p/5100018.html

转在了解了《phpcms V9 URL访问解析》之后,我们已经知道首页最终执行的是content模块下index控制器的init方法。

下面, 我们逐步分析过程如下:

第一、首页默认执行的是index.php?m=content&c=index&a=init

如下代码(路径:phpcms\modules\content\index.php),先从init函数分析:

 1 class index
2 {
3 private $db;
4 function __construct()
5 {
6 $this->db = pc_base::load_model('content_model');
7 $this->_userid = param::get_cookie('_userid');
8 $this->_username = param::get_cookie('_username');
9 $this->_groupid = param::get_cookie('_groupid');
10 }
11 //首页
12 public function init()
13 {
14 if(isset($_GET['siteid']))
15 {
16 $siteid = intval($_GET['siteid']); //当前站点id 函数intval作用变量转成整数类型
17 }
18 else
19 {
20 $siteid = 1;
21 }
22 $siteid = $GLOBALS['siteid'] = max($siteid,1);
23 define('SITEID', $siteid);
24 $_userid = $this->_userid;
25 $_username = $this->_username;
26 $_groupid = $this->_groupid;
27 //SEO 搜索引擎优化信息
28 $SEO = seo($siteid); //调用第二步,获取当前站点当前栏目下生成的SEO信息
29 $sitelist = getcache('sitelist','commons'); //缓存后台设置的所有站点配置信息
30 $default_style = $sitelist[$siteid]['default_style']; //当前站点默认模板风格配置
31 $CATEGORYS = getcache('category_content_'.$siteid,'commons'); //当前站点所有栏目详细配置信息
32 include template('content','index',$default_style); //调用第三步:模板调用
33 }

第二、获取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 {
11 if (!empty($title))
12 $title = strip_tags($title); //过滤title。 strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。
13 if (!empty($description))
14 $description = strip_tags($description); //过滤description
15 if (!empty($keyword))
16 $keyword = str_replace(' ', ',', strip_tags($keyword)); //过滤keyword
17 $sites = getcache('sitelist', 'commons'); //获取所有站点详细配置信息
18 $site = $sites[$siteid]; //当前站点详细配置信息
19 $cat = array();
20 if (!empty($catid)) //栏目ID不为空
21 {
22 $siteids = getcache('category_content','commons'); //获取所有栏目对应的站点ID缓存文件,格式:栏目ID=>站点ID
23 $siteid = $siteids[$catid]; //当前栏目对应的站点ID
24 $categorys = getcache('category_content_'.$siteid,'commons'); //获取当前站点下所有栏目的详细配置信息
25 $cat = $categorys[$catid]; //当前站点下当前栏目的详细配置信息
26 $cat['setting'] = string2array($cat['setting']); //当前站点当前栏目详细配置信息的setting设置信息,转化为数组
27 }
28 //站点title
29 $seo['site_title'] =isset($site['site_title']) && !empty($site['site_title']) ? $site['site_title'] : $site['name'];
30 //关键字
31 $seo['keyword'] = !empty($keyword) ? $keyword : $site['keywords'];
32 //描述
33 $seo['description'] = isset($description) && !empty($description) ? $description : (isset($cat['setting']['meta_description']) && !empty($cat['setting']['meta_description']) ? $cat['setting']['meta_description'] : (isset($site['description']) && !empty($site['description']) ? $site['description'] : ''));
34 //标题
35 $seo['title'] = (isset($title) && !empty($title) ? $title.' - ' : '').(isset($cat['setting']['meta_title']) && !empty($cat['setting']['meta_title']) ? $cat['setting']['meta_title'].' - ' : (isset($cat['catname']) && !empty($cat['catname']) ? $cat['catname'].' - ' : ''));
36 foreach ($seo as $k=>$v)
37 {
38 $seo[$k] = str_replace(array("\n","\r"), '', $v); //将seo信息中\n和\r替换为空
39 }
40 return $seo; //返回seo数组信息
41 }

第三、模板调用:phpcms/libs/functions/global.func.php

 1 /**
2 * 模板调用
3 *
4 * @param $module 默认为content
5 * @param $template 默认为index
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字符,这里进行了对插件模板的判断,插件模板需要调用p_template过程解析
13 $plugin = str_replace('plugin/', '', $module);
14 return p_template($plugin, $template,$style);
15 }
16 $module = str_replace('/', DIRECTORY_SEPARATOR, $module);
17 if(!empty($style) && preg_match('/([a-z0-9\-_]+)/is',$style))
18 {
19 }
20 elseif (empty($style) && !defined('STYLE'))
21 {
22 if(defined('SITEID')) // 是否定义了SITEID常量
23 {
24 $siteid = SITEID;
25 }
26 else
27 {
28 $siteid = param::get_cookie('siteid');
29 }
30 if (!$siteid) $siteid = 1;
31 $sitelist = getcache('sitelist','commons'); //获取所有站点的详细配置信息
32 if(!empty($siteid))
33 {
34 $style = $sitelist[$siteid]['default_style']; //获取当前站点的默认模板风格
35 }
36 }
37 elseif (empty($style) && defined('STYLE'))
38 {
39 $style = STYLE;
40 }
41 else
42 {
43 $style = 'default';
44 }
45 if(!$style)
46 $style = 'default';
47 //模板解析类,文件路径:phpcms/libs/classes/template_cache.class.php
48 $template_cache = pc_base::load_sys_class('template_cache');
49 //编译文件缓存路径:根目录/caches/caches_template/default/content/index.php
50 $compiledtplfile = PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_template'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.php';
51 //首页模板文件,如文件路径:phpcms/templates/dafault/content/index.html
52 if(file_exists(PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html'))
53 {
54 //如果编译文件不存在或者说模板文件的创建时间大于编译文件的生成时间,则重新编译
55 if(!file_exists($compiledtplfile) || (@filemtime(PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html') > @filemtime($compiledtplfile)))
56 {
57 $template_cache->template_compile($module, $template, $style); //调用第四步:适用模板风格不是default的情况
58 }
59 }
60 else
61 {
62 //编译文件缓存路径:根目录/caches/caches_template/default/content/index.php
63 $compiledtplfile = PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_template'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.php';
64 //如果编译文件不存在或者说前台公共的模板文件存在,并且前台公共模板文件的创建时间大于编译文件的生成时间
65 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)))
66 {
67 //重新编译
68 $template_cache->template_compile($module, $template, 'default');
69 }
70 elseif (!file_exists(PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html'))
71 { //如果前台公共的模板文件不存在的话,则提示模板不存在
72 showmessage('Template does not exist.'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html');
73 }
74 }
75 //返回编译文件
76 return $compiledtplfile;
77 }

第四、模板解析:phpcms/libs/classes/template_cache.class.php

 1 /**
2 * 模板解析缓存
3 */
4 final class template_cache
5 {
6
7 /**
8 * 编译模板
9 *
10 * @param $module 模块名称
11 * @param $template 模板文件名
12 * @param $istag 是否为标签模板
13 * @return unknown
14 */
15
16 public function template_compile($module, $template, $style = 'default')
17 {
18 if(strpos($module, '/')=== false) // 如果“/”不存在
19 {
20 //路径:phpcms/templates/default/content/index.html 如:首页公共模板文件
21 $tplfile = $_tpl = PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html';
22 }
23 elseif (strpos($module, 'yp/') !== false)
24 {
25 $module = str_replace('/', DIRECTORY_SEPARATOR, $module);
26 $tplfile = $_tpl = PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html';
27 }
28 else
29 {
30 $plugin = str_replace('plugin/', '', $module);
31 $module = str_replace('/', DIRECTORY_SEPARATOR, $module);
32 $tplfile = $_tpl = PC_PATH.'plugin'.DIRECTORY_SEPARATOR.$plugin.DIRECTORY_SEPARATOR.'templates'.DIRECTORY_SEPARATOR.$template.'.html';
33 }
34 if ($style != 'default' && !file_exists ( $tplfile ))
35 {
36 $style = 'default';
37 $tplfile = PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html';
38 }
39 if (! file_exists ( $tplfile ))
40 {
41 //如果公共模板文件不存在,则提示模板文件不存在,如:/templates/default/content/index.html is not exists!
42 showmessage ( "templates".DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.".html is not exists!" );
43 }
44 //获取公共模板文件中的内容
45 $content = @file_get_contents ( $tplfile );
46 //要生成的编译文件所在目录
47 $filepath = CACHE_PATH.'caches_template'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR;
48 if(!is_dir($filepath))
49 {
50 //如果目录不存在,则层级创建所有目录
51 mkdir($filepath, 0777, true);
52 }
53 //编译文件的全路径
54 $compiledtplfile = $filepath.$template.'.php';
55 //解析公共模板文件中的内容及标签,并返回解析后的内容
56 $content = $this->template_parse($content); // 调用下一个过程
57 //将解析后的公共模板文件内容写入到要生成的编译文件中
58 $strlen = file_put_contents ( $compiledtplfile, $content );
59 //给生成的编译文件设置权限
60 chmod ( $compiledtplfile, 0777 );
61 //返回写入编译文件的字节数
62 return $strlen;
63 }
64
65 /**
66 * 解析模板
67 *
68 * @param $str 模板内容
69 * @return ture
70 */
71 public function template_parse($str) {
72 $str = preg_replace ( "/\{template\s+(.+)\}/", "<?php include template(\\1); ?>", $str );
73 $str = preg_replace ( "/\{include\s+(.+)\}/", "<?php include \\1; ?>", $str );
74 $str = preg_replace ( "/\{php\s+(.+)\}/", "<?php \\1?>", $str );
75 $str = preg_replace ( "/\{if\s+(.+?)\}/", "<?php if(\\1) { ?>", $str );
76 $str = preg_replace ( "/\{else\}/", "<?php } else { ?>", $str );
77 $str = preg_replace ( "/\{elseif\s+(.+?)\}/", "<?php } elseif (\\1) { ?>", $str );
78 $str = preg_replace ( "/\{\/if\}/", "<?php } ?>", $str );
79 //for 循环
80 $str = preg_replace("/\{for\s+(.+?)\}/","<?php for(\\1) { ?>",$str);
81 $str = preg_replace("/\{\/for\}/","<?php } ?>",$str);
82 //++ --
83 $str = preg_replace("/\{\+\+(.+?)\}/","<?php ++\\1; ?>",$str);
84 $str = preg_replace("/\{\-\-(.+?)\}/","<?php ++\\1; ?>",$str);
85 $str = preg_replace("/\{(.+?)\+\+\}/","<?php \\1++; ?>",$str);
86 $str = preg_replace("/\{(.+?)\-\-\}/","<?php \\1--; ?>",$str);
87 $str = preg_replace ( "/\{loop\s+(\S+)\s+(\S+)\}/", "<?php \$n=1;if(is_array(\\1)) foreach(\\1 AS \\2) { ?>", $str );
88 $str = preg_replace ( "/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/", "<?php \$n=1; if(is_array(\\1)) foreach(\\1 AS \\2 => \\3) { ?>", $str );
89 $str = preg_replace ( "/\{\/loop\}/", "<?php \$n++;}unset(\$n); ?>", $str );
90 $str = preg_replace ( "/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "<?php echo \\1;?>", $str );
91 $str = preg_replace ( "/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "<?php echo \\1;?>", $str );
92 $str = preg_replace ( "/\{(\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/", "<?php echo \\1;?>", $str );
93 $str = preg_replace("/\{(\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\}/es", "\$this->addquote('<?php echo \\1;?>')",$str);
94 $str = preg_replace ( "/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/s", "<?php echo \\1;?>", $str );
95 $str = preg_replace("/\{pc:(\w+)\s+([^}]+)\}/ie", "self::pc_tag('$1','$2', '$0')", $str);
96 $str = preg_replace("/\{\/pc\}/ie", "self::end_pc_tag()", $str);
97 $str = "<?php defined('IN_PHPCMS') or exit('No permission resources.'); ?>" . $str;
98 return $str;
99 }

第五、PC标签的解析:phpcms/libs/classes/template_cache.class.php 文件

  1 /**
2 * 解析PC标签
3 * @param string $op 操作方式
4 * @param string $data 参数
5 * @param string $html 匹配到的所有的HTML代码
6 */
7 public static function pc_tag($op, $data, $html)
8 {
9 preg_match_all("/([a-z]+)\=[\"]?([^\"]+)[\"]?/i", stripslashes($data), $matches, PREG_SET_ORDER);
10 $arr = array('action','num','cache','page', 'pagesize', 'urlrule', 'return', 'start');
11 $tools = array('json', 'xml', 'block', 'get');
12 $datas = array();
13 $tag_id = md5(stripslashes($html));
14 //可视化条件
15 $str_datas = 'op='.$op.'&tag_md5='.$tag_id;
16 foreach ($matches as $v)
17 {
18 $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]));
19 if(in_array($v[1], $arr))
20 {
21 $$v[1] = $v[2];//如果pc标签中参数在默认参数数组$arr中存在,则将参数转换为变量,如:$page=value等
22 continue;
23 }
24 $datas[$v[1]] = $v[2];//如果pc标签中参数不在默认参数数组$arr中存在,则直接将其放置到$datas[参数名]=value中
25 }
26 $str = '';
27 $num = isset($num) && intval($num) ? intval($num) : 20;
28 $cache = isset($cache) && intval($cache) ? intval($cache) : 0;
29 $return = isset($return) && trim($return) ? trim($return) : 'data';
30 if (!isset($urlrule)) $urlrule = '';
31 if (!empty($cache) && !isset($page))
32 {
33 $str .= '$tag_cache_name = md5(implode(\'&\','.self::arr_to_html($datas).').\''.$tag_id.'\');if(!$'.$return.' = tpl_cache($tag_cache_name,'.$cache.')){';
34 }
35 if (in_array($op,$tools))
36 { //pc标签分两大类:工具类和模块类。工具类执行如下代码
37 switch ($op)
38 {
39 case 'json':
40 if (isset($datas['url']) && !empty($datas['url']))
41 {
42 $str .= '$json = @file_get_contents(\''.$datas['url'].'\');';
43 $str .= '$'.$return.' = json_decode($json, true);';
44 }
45 break;
46
47 case 'xml':
48 $str .= '$xml = pc_base::load_sys_class(\'xml\');';
49 $str .= '$xml_data = @file_get_contents(\''.$datas['url'].'\');';
50 $str .= '$'.$return.' = $xml->xml_unserialize($xml_data);';
51 break;
52
53 case 'get':
54 $str .= 'pc_base::load_sys_class("get_model", "model", 0);';
55 if ($datas['dbsource'])
56 {
57 $dbsource = getcache('dbsource', 'commons');
58 if (isset($dbsource[$datas['dbsource']]))
59 {
60 $str .= '$get_db = new get_model('.var_export($dbsource,true).', \''.$datas['dbsource'].'\');';
61 }
62 else
63 {
64 return false;
65 }
66 }
67 else
68 {
69 $str .= '$get_db = new get_model();';
70 }
71 $num = isset($num) && intval($num) > 0 ? intval($num) : 20;
72 if (isset($start) && intval($start))
73 {
74 $limit = intval($start).','.$num;
75 }
76 else
77 {
78 $limit = $num;
79 }
80 if (isset($page))
81 {
82 $str .= '$pagesize = '.$num.';';
83 $str .= '$page = intval('.$page.') ? intval('.$page.') : 1;if($page<=0){$page=1;}';
84 $str .= '$offset = ($page - 1) * $pagesize;';
85 $limit = '$offset,$pagesize';
86 $sql = 'SELECT COUNT(*) as count FROM ('.$datas['sql'].') T';
87 $str .= '$r = $get_db->sql_query("'.$sql.'");$s = $get_db->fetch_next();$pages=pages($s[\'count\'], $page, $pagesize, $urlrule);';
88 }
89
90 $str .= '$r = $get_db->sql_query("'.$datas['sql'].' LIMIT '.$limit.'");while(($s = $get_db->fetch_next()) != false) {$a[] = $s;}$'.$return.' = $a;unset($a);';
91 break;
92
93 case 'block':
94 $str .= '$block_tag = pc_base::load_app_class(\'block_tag\', \'block\');';
95 $str .= 'echo $block_tag->pc_tag('.self::arr_to_html($datas).');';
96 break;
97 }
98 }
99 else
100 { //pc标签分两大类:工具类和模块类。模块类执行如下代码
101 if (!isset($action) || empty($action))
102 return false;
103 //content模块:phpcms/modules/content/classes/content_tag.class.php
104 if (module_exists($op) && file_exists(PC_PATH.DIRECTORY_SEPARATOR.'modules'.DIRECTORY_SEPARATOR.$op.DIRECTORY_SEPARATOR.'classes'.DIRECTORY_SEPARATOR.$op.'_tag.class.php'))
105 {
106 //content_tag.class.php 检查content_tag类中是否存在的某方法
107 $str .= '$'.$op.'_tag = pc_base::load_app_class("'.$op.'_tag", "'.$op.'");if (method_exists($'.$op.'_tag, \''.$action.'\')) {';
108 if (isset($start) && intval($start))
109 {
110 $datas['limit'] = intval($start).','.$num; //如:limit 0 , 10
111 }
112 else
113 {
114 $datas['limit'] = $num; //如:limit 10
115 }
116 if (isset($page)) //分页参数
117 {
118 $str .= '$pagesize = '.$num.';'; //每页显示数据量
119 $str .= '$page = intval('.$page.') ? intval('.$page.') : 1;if($page<=0){$page=1;}';//当前页码
120 $str .= '$offset = ($page - 1) * $pagesize;';//要查询数据的开始位置
121 $datas['limit'] = '$offset.",".$pagesize';
122 $datas['action'] = $action; //方法,如,content_tag.class.php中的lists方法
123 $str .= '$'.$op.'_total = $'.$op.'_tag->count('.self::arr_to_html($datas).');';//分页方法
124 $str .= '$pages = pages($'.$op.'_total, $page, $pagesize, $urlrule);';
125 }
126 //调用第七步:content_tag.class.php中方法
127 $str .= '$'.$return.' = $'.$op.'_tag->'.$action.'('.self::arr_to_html($datas).');';
128 $str .= '}';
129 }
130 }
131 if (!empty($cache) && !isset($page))
132 {
133 $str .= 'if(!empty($'.$return.')){setcache($tag_cache_name, $'.$return.', \'tpl_data\');}';
134 $str .= '}';
135 }
136 /**
137 * 解析结果大概如下所示:
138 <?php
139 if(defined('IN_ADMIN') && !defined('HTML'))
140 {
141 echo "<div class=\"admin_piao\" pc_action=\"content\" data=\"op=content&tag_md5=2d4b9e3c7c2cc4bd0cec8b1fac9ae764&action=position&posid=12&thumb=1&order=listorder+DESC&num=10\">
142 <a href=\"javascript:void(0)\" class=\"admin_piao_edit\">编辑</a>";
143 }
144 $content_tag = pc_base::load_app_class("content_tag", "content");
145 if (method_exists($content_tag, 'position'))
146 {
147 $data = $content_tag->position(array('posid'=>'12','thumb'=>'1','order'=>'listorder DESC','limit'=>'10',));
148 }
149 ?>
150 */
151 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."?".">";
152 }

第六、PC标签类。文件路径:phpcms/modules/content/classes/content_tag.class.php

  1 class content_tag
2 {
3 private $db;
4 public function __construct()
5 {
6 $this->db = pc_base::load_model('content_model'); //调用第七步,数据模型,对应数据表为news和news_data
7 $this->position = pc_base::load_model('position_data_model'); //数据模型
8 }
9 /**
10 * 初始化模型
11 * @param $catid
12 */
13 public function set_modelid($catid)
14 {
15 static $CATS;
16 $siteids = getcache('category_content','commons'); //获取所有栏目所属的站点id
17 if(!$siteids[$catid])
18 return false; //不存在此栏目,返回false
19 $siteid = $siteids[$catid]; //当前栏目所属站点id
20 if ($CATS[$siteid])
21 {
22 $this->category = $CATS[$siteid];
23 }
24 else
25 {
26 //获取当前站点id下所有栏目的配置信息
27 $CATS[$siteid] = $this->category = getcache('category_content_'.$siteid,'commons');
28 }
29 if($this->category[$catid]['type']!=0)
30 return false; //如果不为内部栏目,返回false 0-内部栏目 1-单网页 2-外部链接
31 $this->modelid = $this->category[$catid]['modelid']; //获取当前栏目所属模型id
32 $this->db->set_model($this->modelid); //调用第七步
33 $this->tablename = $this->db->table_name; //数据表名
34 if(empty($this->category))
35 {
36 //当前站点id下所有栏目的配置信息
37 return false;
38 }
39 else
40 {
41 return true;
42 }
43 }
44 /**
45 * 分页统计
46 * @param $data
47 */
48 public function count($data)
49 {
50 if($data['action'] == 'lists')
51 {
52 $catid = intval($data['catid']);
53 if(!$this->set_modelid($catid)) return false;
54 if(isset($data['where']))
55 {
56 $sql = $data['where'];
57 }
58 else
59 {
60 if($this->category[$catid]['child'])
61 {
62 $catids_str = $this->category[$catid]['arrchildid'];
63 $pos = strpos($catids_str,',')+1;
64 $catids_str = substr($catids_str, $pos);
65 $sql = "status=99 AND catid IN ($catids_str)";
66 }
67 else
68 {
69 $sql = "status=99 AND catid='$catid'";
70 }
71 }
72 return $this->db->count($sql);
73 }
74 }
75
76 /**
77 * 列表页标签
78 * @param $data
79 */
80 public function lists($data)
81 {
82 $catid = intval($data['catid']);
83 if(!$this->set_modelid($catid))
84 return false;
85 if(isset($data['where'])) //如果pc标签中设置了条件
86 {
87 $sql = $data['where']; //pc标签中的条件
88 }
89 else
90 {
91 $thumb = intval($data['thumb']) ? " AND thumb != ''" : '';
92 if($this->category[$catid]['child'])
93 {
94 $catids_str = $this->category[$catid]['arrchildid'];
95 $pos = strpos($catids_str,',')+1;
96 $catids_str = substr($catids_str, $pos);
97 $sql = "status=99 AND catid IN ($catids_str)".$thumb;
98 }
99 else
100 {
101 $sql = "status=99 AND catid='$catid'".$thumb;
102 }
103 }
104 $order = $data['order']; //pc标签中排序字段
105
106 //从数据库中获取主表数据,使用的也是sql语句查询
107 $return = $this->db->select($sql, '*', $data['limit'], $order, '', 'id');
108
109 //调用副表的数据
110 if (isset($data['moreinfo']) && intval($data['moreinfo']) == 1)
111 {
112 $ids = array();
113 foreach ($return as $v)
114 {
115 if (isset($v['id']) && !empty($v['id']))
116 {
117 $ids[] = $v['id'];
118 }
119 else
120 {
121 continue;
122 }
123 }
124 if (!empty($ids))
125 {
126 $this->db->table_name = $this->db->table_name.'_data';//副表名
127 $ids = implode('\',\'', $ids);
128 $r = $this->db->select("`id` IN ('$ids')", '*', '', '', '', 'id');
129 if (!empty($r))
130 {
131 foreach ($r as $k=>$v)
132 {
133 if (isset($return[$k]))
134 $return[$k] = array_merge($v, $return[$k]); //主表中数据与副表中数据合并
135 }
136 }
137 }
138 }
139 return $return; //返回查询到的数据
140 }

注意:由以上分析可知,pc标签内部原理也是通过sql语句来获取数据的。

另外,PC标签分模块来使用,内容模块PC标签可用来完成如下功能:

(1)获取内容列表:lists 方法 (如上)

(2)获取点击排行榜:hits 方法 (详细见文件content_tag.class.php)

(3)获取相关文章:relation 方法 (详细见文件content_tag.class.php)

(4)获取栏目列表:category 方法 (详细见文件content_tag.class.php)

第七、content_model类。文件路径:phpcms/model/content_model.class.php

 1 /**
2 * 内容模型数据库操作类
3 */
4 pc_base::load_sys_class('model', '', 0);
5 class content_model extends model
6 {
7 public $table_name = ''; // 数据库表名
8 public $category = ''; // 栏目
9 public function __construct()
10 {
11 $this->db_config = pc_base::load_config('database'); //加载数据库配置信息
12 $this->db_setting = 'default'; // 加载数据库默认的配置信息
13 parent::__construct(); // 调用父类的构造函数
14 $this->url = pc_base::load_app_class('url', 'content');
15 $this->siteid = get_siteid(); //获取当前站点id
16 }
17 public function set_model($modelid)
18 {
19 //获取所有模型的配置信息 1-文档模型 2-下载模型 3-图片模型 跟后台设置有关
20 $this->model = getcache('model', 'commons');
21 //当前模型id
22 $this->modelid = $modelid;
23 //模型所对应的数据表(文档模型->news 图片模型->picture 下载模型->download)
24 $this->table_name = $this->db_tablepre.$this->model[$modelid]['tablename'];
25 $this->model_tablename = $this->model[$modelid]['tablename'];
26 }

phpcms V9 首页模板文件解析(转)的更多相关文章

  1. phpcms V9 首页模板文件解析

    在了解了<phpcms V9 URL访问解析>之后,我们已经知道首页最终执行的是content模块下index控制器的init方法. 下面, 我们逐步分析过程如下: 第一.首页默认执行的是 ...

  2. PHPcms v9.6.0 文件上传漏洞

    title: PHPcms v9.6.0 文件上传漏洞 date: 2021-4-5 tags: 渗透测试,CVE漏洞复现,文件上传 categories: 渗透测试 CVE漏洞复现 文件上传 PHP ...

  3. phpcms V9首页 频道页 列表页 推荐位 简单获取文章浏览量和评论统计

    phpcms V9首页 频道页 列表页 推荐位 简单获取文章浏览量和评论统计 列表取得数据方法: {pc:content action="lists" catid="$c ...

  4. PHPCMS V9添加模板自定义全局变量

    在我们使用PHPCMS V9的制作网站模板的时候,使用全局模板变量能轻松调用,使用起来非常方便,而且可以统一修改,方便维护. 下面就来讲一下在PHPCMS V9中如何添加自定义全局变量. 修改网站sy ...

  5. phpcms v9中模板标签使用及联动菜单

    {template "content","header"} 调用根目录下phpcms\template\content\header文件 {charset} 字 ...

  6. phpcms v9会员中心文件上传漏洞

    漏洞版本: phpcms v9 漏洞描述: PHPCMS V9采用OOP(面向对象)方式自主开发的框架.框架易扩展,稳定且具有超强大负载能力. phpcms v9会员中心上传头像处可未经过充分过滤,攻 ...

  7. phpcms V9 默认模板文件目录结构_PHPCms教程

    PHPCMSV9 默认模板目录结构 templates   框架系统模板目录            announce    公告                show.html       内容页  ...

  8. phpcms V9首页、列表页以及内容页调用标签

    1.页面标题:{$title} 2.发表时间:{$inputtime} 3.内容来源:{$copyfrom} 4.文章内容:{$content} 5.缩略图地址:{$thumb} 6.组图列表: {l ...

  9. phpcms v9 首页怎么调取单页内容,描述,标题等

    {pc:,  v9 数据表前缀  catid 这是单页的id

随机推荐

  1. asp.net C#母版页和内容页事件排版载入顺序生命周期

    asp.net C#母版页和内容页事件排版载入顺序生命周期 关于ASP页面Page_Load发生在事件之前而导致的问题已经喜闻乐见,对于问题的解释也非常全面.可是怎样解决这个问题则较少有人说明,我就再 ...

  2. 【转】Java中Vector和ArrayList的区别

    首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复.3个具体 ...

  3. java19 先开服务器,再开客户端

    先开服务器,再开客户端. import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOExcep ...

  4. C# - 系统类 - DateTime类

    DateTime类 ns:System 此类是一个结构 提供了访问和修改它所代表的时间 创建DateTime实例的几种方式 DateTime time = , , , , , ); Console.W ...

  5. 如何编译libcurl

    1. Android •1.1配置 •1.2 Make •1.3的参数配置 2.iOS 3.windows 4.关于头文件 注释 本文档介绍了如何为Android,iOS和Windows编译libcu ...

  6. Leetcode Python Solution(continue update)

    leetcode python solution 1. two sum (easy) Given an array of integers, return indices of the two num ...

  7. HTTP请求、响应报文格式

    HTTP请求报文格式: HTTP请求报文主要由请求行.请求头部.空行以及请求正文4部分组成 1,请求行由3部分组成,分别为:请求方式,URI(注意这里不是URL)以及协议版本组成,之间由空格分隔 请求 ...

  8. Java并发——Fork/Join框架

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...

  9. R-大数据分析挖掘(2-R爬虫)

    RCurl作者:

  10. SharePoint 文档库实现文件夹拖放到文档库

    打开文档库-> 选择文件夹-> 在Ribbon中选择“库(list)”-> 在右边可以看到打开方式-> 选择用资源管理器打开-> 在新打开的资源管理器中可能实现对文夹的拖 ...