前台pc标签的使用:{pc:content 参数名="参数值" 参数名="参数值" 参数名="参数值"}
如: {pc:content action="lists" catid="9" cache="3600" num="20" page="$page"}{/pc}
执行流程如下:
     ①模块名:content
     ②模块类文件:modules/content/classes/content_tag.class.php,便于二次开发或标签的扩展
     ③文件中的方法:lists
     ④action后面的参数以数组的形式传递给lists方法,如:function lists($data=array())
此标签实际获取的是:content_tag.class.php文件中lists方法返回的数据
注意:此标签会根据catid的值去寻找对应的模型id,然后再根据对应的模型id寻找到对应的模型表,如:news
注意:几乎所有的模块都有一个标签类,格式如下:模块名_tag.class.php
注意:前台模板文件中出现{pc}标签的位置,都可在"碎片管理"中进行编辑修改,非常方便

content_tag.class.php文件分析-pc标签调用的方法

  1. <?php
  2. class content_tag {
  3. private $db; //主要针对v9_news表
  4. public function __construct() {
  5. $this->db = pc_base::load_model('content_model'); //数据模型,对应数据表news 和 news_data
  6. $this->position = pc_base::load_model('position_data_model'); //position_data表
  7. }
  8. /**
  9. * 初始化模型,其实就是为了根据栏目id设置对应对应的模型表及数据表:news-模型表、v9_news-数据表
  10. * @param $catid
  11. */
  12. public function set_modelid($catid) {
  13. $siteids = getcache('category_content','commons'); //获取所有栏目所属的站点id
  14. if(!$siteids[$catid]) return false; //不存在此栏目,返回false
  15. $siteid = $siteids[$catid]; //当前栏目所属站点id
  16. $this->category = getcache('category_content_'.$siteid,'commons');//获取当前站点id下所有栏目的配置信息
  17. if($this->category[$catid]['type']!=0) return false;//如果不为内部栏目,返回false 0-内部栏目 1-单网页 2-外部链接
  18. $this->modelid = $this->category[$catid]['modelid'];//获取当前栏目所属模型id
  19. $this->db->set_model($this->modelid); //根据模型id获取当前模型所对应的模型表和数据表 1:文档模型-news 3:图片模型-picture 2:下载模型-download
  20. $this->tablename = $this->db->table_name; //数据表:v9_news
  21. if(empty($this->category)) { //如果当前站点下不存在栏目配置信息,则返回false
  22. return false;
  23. } else { //如果当前站点下存在栏目配置信息,则返回true
  24. return true;
  25. }
  26. }
  27. /**
  28. * 分页统计
  29. * @param $data
  30. */
  31. public function count($data) {
  32. if($data['action'] == 'lists') {
  33. $catid = intval($data['catid']);
  34. if(!$this->set_modelid($catid)) return false;
  35. if(isset($data['where'])) {
  36. $sql = $data['where'];
  37. } else {
  38. if($this->category[$catid]['child']) {
  39. $catids_str = $this->category[$catid]['arrchildid'];
  40. $pos = strpos($catids_str,',')+1;
  41. $catids_str = substr($catids_str, $pos);
  42. $sql = "status=99 AND catid IN ($catids_str)";
  43. } else {
  44. $sql = "status=99 AND catid='$catid'";
  45. }
  46. }
  47. return $this->db->count($sql);
  48. }
  49. }
  50.  
  51. /**
  52. * 列表页标签:主要返回的是主表中数据与附表中数据, {pc:content action="lists"} {/pc}标签调用的都是lists方法
  53. * @param $data
  54. */
  55. public function lists($data) {
  56. $catid = intval($data['catid']); //pc标签中catid属性
  57. if(!$this->set_modelid($catid)) return false; //会根据栏目id->对应的模型id->对应的模型表
  58. if(isset($data['where'])) { //如果pc标签中设置了where属性,一般情况下不存在
  59. $sql = $data['where'];
  60. } else { //如果pc标签中没有设置where属性
  61. $thumb = intval($data['thumb']) ? " AND thumb != ''" : ''; //如果有thumb属性
  62. if($this->category[$catid]['child']) { //当前栏目下是否存在子栏目
  63. $catids_str = $this->category[$catid]['arrchildid']; //所有子栏目id,包括当前栏目自身id
  64. $pos = strpos($catids_str,',')+1;
  65. $catids_str = substr($catids_str, $pos); //所有子栏目id,不包括当前栏目自身id
  66. $sql = "status=99 AND catid IN ($catids_str)".$thumb; //拼接成一个sql语句
  67. } else {
  68. $sql = "status=99 AND catid='$catid'".$thumb; //如果当前栏目下不存在子栏目
  69. }
  70. }
  71. $order = $data['order']; //pc标签中order属性
  72. //$sql作为一个条件出现,调用的是model.calss.php文件中的select方法,返回结果集数组,并按照键名'id'排序
  73. $return = $this->db->select($sql, '*', $data['limit'], $order, '', 'id');//从数据库中获取主表数据,使用的也是sql语句查询
  74.  
  75. //调用副表的数据
  76. if (isset($data['moreinfo']) && intval($data['moreinfo']) == 1) { //如果pc标签中设置了moreinfo属性:是否调用附表数据
  77. $ids = array();
  78. //$return为返回的主表数据
  79. foreach ($return as $v) { //循环主表中的记录信息:$v-主表中的每条记录
  80. if (isset($v['id']) && !empty($v['id'])) {
  81. $ids[] = $v['id']; //ids[]是主表中排序完成的文章id数组
  82. } else {
  83. continue;
  84. }
  85. }
  86. if (!empty($ids)) {
  87. $this->db->table_name = $this->db->table_name.'_data'; //副表名
  88. $ids = implode('\',\'', $ids); //以逗号拼接成一个字符串
  89. $r = $this->db->select("`id` IN ('$ids')", '*', '', '', '', 'id');//查询与主表中数据有关的副表中的数据
  90. if (!empty($r)) {
  91. foreach ($r as $k=>$v) { //副表中的数据
  92. //$return:返回的主表中的数据,主表中的id字段值与附表中的id字段值是对应的,也就是说一篇文章在主表中存储的id跟在附表中存储的id的值是相等的
  93. if (isset($return[$k])) $return[$k] = array_merge($v, $return[$k]);//主表中数据与副表中数据合并
  94. }
  95. }
  96. }
  97. }
  98. return $return;
  99. }
  100.  
  101. /**
  102. * 相关文章标签,{pc:content action="relation"} {/pc}标签调用的都是relation方法
  103. * @param $data
  104. */
  105. public function relation($data) {
  106. $catid = intval($data['catid']); //pc标签的catid属性:栏目id
  107. if(!$this->set_modelid($catid)) return false;
  108. $order = $data['order']; //pc标签的order属性
  109. $sql = "`status`=99"; //拼接sql
  110. $limit = $data['id'] ? $data['limit']+1 : $data['limit'];
  111. if($data['relation']) { //pc标签的relation属性:相关文章id 格式如下:2|7|5
  112. $relations = explode('|',trim($data['relation'],'|')); //以 | 分割成一个数组
  113. $relations = array_diff($relations, array(null));
  114. $relations = implode(',',$relations);
  115. $sql = " `id` IN ($relations)"; //拼接sql
  116. $key_array = $this->db->select($sql, '*', $limit, $order,'','id');//关联的文章
  117. } elseif($data['keywords']) { //相关关键词
  118. $keywords = str_replace('%', '',$data['keywords']);
  119. $keywords_arr = explode(' ',$keywords); //以空格将关键词分割为一个数组
  120. $key_array = array();
  121. $number = 0; //相关热词文章数量
  122. $i =1; //控制返回文章数量的标识
  123. foreach ($keywords_arr as $_k) {
  124. $sql2 = $sql." AND `keywords` LIKE '%$_k%'".(isset($data['id']) && intval($data['id']) ? " AND `id` != '".abs(intval($data['id']))."'" : '');
  125. $r = $this->db->select($sql2, '*', $limit, '','','id');
  126. $number += count($r); //所有热词文章的总量
  127. foreach ($r as $id=>$v) {
  128. if($i<= $data['limit'] && !in_array($id, $key_array)) $key_array[$id] = $v;//$key_array[文章id]=文章记录
  129. $i++;
  130. }
  131. if($data['limit']<$number) break;
  132. }
  133. }
  134. if($data['id']) unset($key_array[$data['id']]);//针对性的屏蔽某篇文章
  135. return $key_array;
  136. }
  137.  
  138. /**
  139. * 排行榜标签{pc:content action="hits"} {/pc}标签调用的都是hits方法
  140. * @param $data
  141. */
  142. public function hits($data) {
  143. $catid = intval($data['catid']); //栏目id,pc标签的catid属性
  144. if(!$this->set_modelid($catid)) return false; //根据栏目id->对应的模型id->模型表,如:news
  145.  
  146. $this->hits_db = pc_base::load_model('hits_model'); //hits:点击量表
  147. $sql = $desc = $ids = '';
  148. $array = $ids_array = array();
  149. $order = $data['order']; //pc标签中order属性
  150. $hitsid = 'c-'.$this->modelid.'-%'; //hits点击量表中hitsid字段的组成:c-模型id-文章id
  151. $sql = "hitsid LIKE '$hitsid'"; //拼接sql
  152. if(isset($data['day'])) { //pc标签中day属性:表示调用多少天内的排行
  153. $updatetime = SYS_TIME-intval($data['day'])*86400; //表示调用多少天内的排行
  154. $sql .= " AND updatetime>'$updatetime'"; //拼接sql
  155. }
  156. if($this->category[$catid]['child']) { //当前栏目是否有子栏目
  157. $catids_str = $this->category[$catid]['arrchildid']; //当前栏目下所有子栏目id,包括当前栏目自身的id
  158. $pos = strpos($catids_str,',')+1;
  159. $catids_str = substr($catids_str, $pos); //当前栏目下所有子栏目id,不包括当前栏目自身id
  160. $sql .= " AND catid IN ($catids_str)"; //拼接sql
  161. } else {
  162. $sql .= " AND catid='$catid'"; //如果当前栏目不存在子栏目
  163. }
  164. $hits = array();
  165. $result = $this->hits_db->select($sql, '*', $data['limit'], $order);//查询v9_hits点击量表
  166. foreach ($result as $r) { //$result:v9_hits表中返回的数据
  167. $pos = strpos($r['hitsid'],'-',2) + 1; //格式:c-模型id-文章id,如,c-1-1 ,查找第二个 "-"的位置
  168. $ids_array[] = $id = substr($r['hitsid'],$pos); //文章的id
  169. $hits[$id] = $r; //每篇文章的点击量信息 ,格式:$hits[文章id]= 文章点击记录信息
  170. }
  171. $ids = implode(',', $ids_array); //以逗号拼接成一个字符串
  172. if($ids) {
  173. $sql = "status=99 AND id IN ($ids)"; //拼接sql
  174. } else {
  175. $sql = '';
  176. }
  177. $this->db->table_name = $this->tablename; //内容主表:v9_news
  178. $result = $this->db->select($sql, '*', $data['limit'],'','','id'); //查询内容主表:v9_news
  179. foreach ($ids_array as $id) {
  180. if($result[$id]['title']!='') {
  181. $array[$id] = $result[$id];
  182. $array[$id] = array_merge($array[$id], $hits[$id]); //将内容主表v9_news中数据与点击量表v9_hits中数据合并,合并桥梁为id
  183. }
  184. }
  185. return $array;
  186. }
  187. /**
  188. * 栏目标签:主要用来返回当前栏目下的所有子栏目及子栏目的url链接地址等信息:{pc:content action="category"} {/pc}标签调用的都是category方法
  189. * @param $data
  190. */
  191. public function category($data) {
  192. $data['catid'] = intval($data['catid']); //pc标签的catid属性:栏目id
  193. $array = array();
  194. $siteid = $data['siteid'] && intval($data['siteid']) ? intval($data['siteid']) : get_siteid();//pc标签的siteid属性:默认调用系统站点
  195. $categorys = getcache('category_content_'.$siteid,'commons'); //获取当前站点下所有栏目的详细配置信息
  196. $site = siteinfo($siteid); //获取当前站点的信息
  197. $i = 1;
  198. foreach ($categorys as $catid=>$cat) {
  199. if($i>$data['limit']) break;
  200. if((!$cat['ismenu']) || $siteid && $cat['siteid']!=$siteid) continue;//ismenu:是否显示栏目,1-显示栏目 0-不显示栏目
  201. if (strpos($cat['url'], '://') === false) { //当前栏目的url链接地址中是否存在 "://"
  202. $cat['url'] = substr($site['domain'],0,-1).$cat['url']; //当前栏目的url链接地址
  203. }
  204. if($cat['parentid']==$data['catid']) { //默认为0,调用一级栏目,$cat['parentid']只有一个值
  205. $array[$catid] = $cat; //所有子栏目信息
  206. $i++;
  207. }
  208. }
  209. return $array;
  210. }
  211.  
  212. /**
  213. * 推荐位,主要用来返回当前推荐位置所有文章的标题和url链接地址等信息:{pc:content action="position"} {/pc}标签调用的都是position方法
  214. * @param $data
  215. */
  216. public function position($data) {
  217. $sql = '';
  218. $array = array();
  219. $posid = intval($data['posid']); //pc标签中posid属性:推荐位id
  220. $order = $data['order']; //pc标签中order属性
  221. $thumb = (empty($data['thumb']) || intval($data['thumb']) == 0) ? 0 : 1;//pc标签中thumb属性
  222. $siteid = $GLOBALS['siteid'] ? $GLOBALS['siteid'] : 1; //当前站点id
  223. $catid = (empty($data['catid']) || $data['catid'] == 0) ? '' : intval($data['catid']);//pc标签中的catid属性
  224. if($catid) { //如果栏目id存在
  225. $siteids = getcache('category_content','commons'); //获取所有栏目所对应的站点id
  226. if(!$siteids[$catid]) return false; //当前站点下不存在当前栏目,则返回false
  227. $siteid = $siteids[$catid]; //当前站点id
  228. $this->category = getcache('category_content_'.$siteid,'commons');//当前站点id下所有栏目的详细配置信息
  229. }
  230. if($catid && $this->category[$catid]['child']) { //当前栏目是否存在子栏目
  231. $catids_str = $this->category[$catid]['arrchildid']; //当前栏目下所有子栏目id,包括当前栏目自身id
  232. $pos = strpos($catids_str,',')+1;
  233. $catids_str = substr($catids_str, $pos); //当前栏目下所有子栏目id,不包括当前栏目自身id
  234. $sql = "`catid` IN ($catids_str) AND "; //拼接sql
  235. } elseif($catid && !$this->category[$catid]['child']) { //如果当前栏目不存在子栏目
  236. $sql = "`catid` = '$catid' AND ";
  237. }
  238. if($thumb) $sql .= "`thumb` = '1' AND "; //有缩略图的情况
  239. if(isset($data['where'])) $sql .= $data['where'].' AND '; //pc标签的where属性:一般情况下没有此属性
  240. if(isset($data['expiration']) && $data['expiration']==1) $sql .= '(`expiration` >= \''.SYS_TIME.'\' OR `expiration` = \'0\' ) AND ';
  241. $sql .= "`posid` = '$posid' AND `siteid` = '".$siteid."'"; //拼接sql
  242. $pos_arr = $this->position->select($sql, '*', $data['limit'],$order);//查询v9_position_data表
  243. if(!empty($pos_arr)) {
  244. foreach ($pos_arr as $info) { //循环查询到的v9_position_data表中的记录
  245. $key = $info['catid'].'-'.$info['id']; //格式:栏目id-文章id
  246. $array[$key] = string2array($info['data']); //将v9_position_data表中data字段的值转换为数组
  247. $array[$key]['url'] = go($info['catid'],$info['id']); //url链接地址
  248. $array[$key]['id'] = $info['id']; //文章id
  249. $array[$key]['catid'] = $info['catid']; //栏目id
  250. $array[$key]['listorder'] = $info['listorder']; //排序
  251. }
  252. }
  253. return $array;
  254. }
  255. /**
  256. * 可视化标签,主要用于在后台可视化的对pc标签进行编辑
  257. */
  258. public function pc_tag() {
  259. $positionlist = getcache('position','commons');
  260. $sites = pc_base::load_app_class('sites','admin');
  261. $sitelist = $sites->pc_tag_list();
  262.  
  263. foreach ($positionlist as $_v) if($_v['siteid'] == get_siteid() || $_v['siteid'] == 0) $poslist[$_v['posid']] = $_v['name'];
  264. return array(
  265. 'action'=>array('lists'=>L('list','', 'content'),'position'=>L('position','', 'content'), 'category'=>L('subcat', '', 'content'), 'relation'=>L('related_articles', '', 'content'), 'hits'=>L('top', '', 'content')),
  266. 'lists'=>array(
  267. 'catid'=>array('name'=>L('catid', '', 'content'),'htmltype'=>'input_select_category','data'=>array('type'=>0),'validator'=>array('min'=>1)),
  268. 'order'=>array('name'=>L('sort', '', 'content'), 'htmltype'=>'select','data'=>array('id DESC'=>L('id_desc', '', 'content'), 'updatetime DESC'=>L('updatetime_desc', '', 'content'), 'listorder ASC'=>L('listorder_asc', '', 'content'))),
  269. 'thumb'=>array('name'=>L('thumb', '', 'content'), 'htmltype'=>'radio','data'=>array('0'=>L('all_list', '', 'content'), '1'=>L('thumb_list', '', 'content'))),
  270. 'moreinfo'=>array('name'=>L('moreinfo', '', 'content'), 'htmltype'=>'radio', 'data'=>array('1'=>L('yes'), '0'=>L('no')))
  271. ),
  272. 'position'=>array(
  273. 'posid'=>array('name'=>L('posid', '', 'content'),'htmltype'=>'input_select','data'=>$poslist,'validator'=>array('min'=>1)),
  274. 'catid'=>array('name'=>L('catid', '', 'content'),'htmltype'=>'input_select_category','data'=>array('type'=>0),'validator'=>array('min'=>0)),
  275. 'thumb'=>array('name'=>L('thumb', '', 'content'), 'htmltype'=>'radio','data'=>array('0'=>L('all_list', '', 'content'), '1'=>L('thumb_list', '', 'content'))),
  276. 'order'=>array('name'=>L('sort', '', 'content'), 'htmltype'=>'select','data'=>array('listorder DESC'=>L('listorder_desc', '', 'content'),'listorder ASC'=>L('listorder_asc', '', 'content'),'id DESC'=>L('id_desc', '', 'content'))),
  277. ),
  278. 'category'=>array(
  279. 'siteid'=>array('name'=>L('siteid'), 'htmltype'=>'input_select', 'data'=>$sitelist),
  280. 'catid'=>array('name'=>L('catid', '', 'content'), 'htmltype'=>'input_select_category', 'data'=>array('type'=>0))
  281. ),
  282. 'relation'=>array(
  283. 'catid'=>array('name'=>L('catid', '', 'content'), 'htmltype'=>'input_select_category', 'data'=>array('type'=>0), 'validator'=>array('min'=>1)),
  284. 'order'=>array('name'=>L('sort', '', 'content'), 'htmltype'=>'select','data'=>array('id DESC'=>L('id_desc', '', 'content'), 'updatetime DESC'=>L('updatetime_desc', '', 'content'), 'listorder ASC'=>L('listorder_asc', '', 'content'))),
  285. 'relation'=>array('name'=>L('relevant_articles_id', '', 'content'), 'htmltype'=>'input'),
  286. 'keywords'=>array('name'=>L('key_word', '', 'content'), 'htmltype'=>'input')
  287. ),
  288. 'hits'=>array(
  289. 'catid'=>array('name'=>L('catid', '', 'content'), 'htmltype'=>'input_select_category', 'data'=>array('type'=>0), 'validator'=>array('min'=>1)),
  290. 'day'=>array('name'=>L('day_select', '', 'content'), 'htmltype'=>'input', 'data'=>array('type'=>0)),
  291. ),
  292.  
  293. );
  294. }
  295. }

phpcms-v9 前台模板文件中{pc}标签的执行流程的更多相关文章

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

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

  2. phpcms V9 首页模板文件解析(转)

    转自:http://www.cnblogs.com/Braveliu/p/5100018.html 转在了解了<phpcms V9 URL访问解析>之后,我们已经知道首页最终执行的是con ...

  3. 【phpcms-v9】前台content模块中pc标签的调用说明

    内容模块PC标签调用说明 模块名:content 模块提供的可用操作 操作名 说明 lists 内容数据列表 relation 内容相关文章 hits 内容数据点击排行榜 category 内容栏目列 ...

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

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

  5. ecshop的模板文件中如何判断用户是否登录

    ecshop中对于smarty的运用和改造有很大的值得借鉴的地方,在dwt模板文件中可以直接判断用户是否登录,现在有规定,凡是只展示不销售的电商平台,一律不得展示商品价格,但可以在用户登录后显示. & ...

  6. phpcms v9 前台getshell脚本

    phpcms v9 前台getshell脚本 用法:python phpcmsv9getshell.py http://baidu.com # -*- coding:utf-8 -*- ''' --- ...

  7. jquery ajax中 php前台后台文件中编辑都是uft-8,返回数据还是乱码

    jquery ajax中 前台后台文件中编辑都是uft-8,返回数据还是乱码 解决如下: 在后台处理文件里面需要再加编辑 header("Content-Type:text/html;cha ...

  8. vue文件中style标签的几个标识符

    .vue文件中style标签的几个标识符 在人生就要绝望的时候, 被编辑器所提示的一个scopedSlots所拯救. 卧槽, 写到最后才发现这个属性的具体卵用. 详情见最后解决办法. 问题背景 问题由 ...

  9. sublime text 3插件改造之AutoFileName去掉.vue文件中img标签后面的width和height,完全去掉!!

    在.vue文件中img标签使用autofilename提示引入文件时,会在文件后面插入宽度高度,如下图: 文件后面会自动插入height和width,其实这两玩意儿在大多数时候并没卵用,然后就开始了百 ...

随机推荐

  1. 何使用CSS写出一个下拉菜单。

    导航菜单是每个网站所必备的功能,也是每个学习制作网站的朋友所必须接触的,如何用css样式制作一个简单漂亮的二级下拉菜单呢? 下面为大家分享一下我的经验 方法步骤: 第一步  : 首页我们打开Subli ...

  2. Android学习之简单的数据存储

    在Android中,数据存储是开发人员不可以避免的.Android为开发者提供了很多的存储方法,在前面的博客中,已经讲述了sqlite存储数据.今天将介绍用SharedPreferences来存储数据 ...

  3. iOS 9适配技巧(更新版)

    转自:   http://www.cocoachina.com/ios/20150929/13598.html 中文快速导航: 1.iOS9网络适配_ATS:改用更安全的HTTPS(见Demo1) i ...

  4. zookeeper集群挂了,提示

    Hadoop集群意外关机后,zookeeper服务出现停止状态, 日志错误提示如下: java.io.IOException: Transaction log: //log.260010d366 ha ...

  5. SpringMVC(二) —— 中文乱码处理

    Get的乱码处理 改tomcat中server.xml中的port=“8080”,加上一个 URIEncoding=”utf-8” 如下图: 2.Post乱码的处理 在web.xml文件中加入 < ...

  6. C++学习之重载运算符1

    C++除可重载函数之后,还允许定义已有的运算符,这样通过运算符重载可像处理数据使用它们. 先来个代码 #include<iostream> using namespace std; cla ...

  7. oracle group by 使用

    SELECT supplier_id, max(evidence_date) AS evidence_date,max(TD_SUPPLIER_EVIDENCE_INFO_ID) AS TD_SUPP ...

  8. json对象和json字符串转换方法

    在WEB数据传输过程中,json是以文本,即字符串的轻量级形式传递的,而客户端一般用JS操作的是接收到的JSON对象,所以,JSON对象和JSON字符串之间的相互转换.JSON数据的解析是关键. 先明 ...

  9. 使用 Chrome 来调试你的 Android App

    http://www.stormzhang.com/android/2015/03/05/android-debug-use-chrome/ 个人一直对Chrome情有独钟,Chrome除了更快之外, ...

  10. PHP面试题之优化

    * PHP性能问题 * 1.PHP语法使用的不恰当 * 2.使用PHP语言做了它不擅长的事 * 3.使用PHP语言链接的服务不给力 * 4.PHP自身做不了的事情 * * PHP的性能问题的解决方向 ...