前台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 }