前臺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標簽調用的方法,代碼如下:
- <?php
- class content_tag {
- private $db; //主要針對v9_news表
- public function __construct() {
- $this->db = pc_base::load_model('content_model'); //數據模型,對應數據表news 和 news_data
- $this->position = pc_base::load_model('position_data_model'); //position_data表
- }
- /**
- * 初始化模型,其實就是為了根據欄目id設置對應對應的模型表及數據表:news-模型表、v9_news-數據表
- * @param $catid
- */
- public function set_modelid($catid) {
- $siteids = getcache('category_content','commons'); //獲取所有欄目所屬的站點id
- if(!$siteids[$catid]) return false; //不存在此欄目,返回false
- $siteid = $siteids[$catid]; //當前欄目所屬站點id
- $this->category = getcache('category_content_'.$siteid,'commons');//獲取當前站點id下所有欄目的配置信息
- if($this->category[$catid]['type']!=0) return false;//如果不為內部欄目,返回false 0-內部欄目 1-單網頁 2-外部鏈接
- $this->modelid = $this->category[$catid]['modelid'];//獲取當前欄目所屬模型id
- $this->db->set_model($this->modelid); //根據模型id獲取當前模型所對應的模型表和數據表 1:文檔模型-news 3:圖片模型-picture 2:下載模型-download
- $this->tablename = $this->db->table_name; //數據表:v9_news
- if(emptyempty($this->category)) { //如果當前站點下不存在欄目配置信息,則返回false
- return false;
- } else { //如果當前站點下存在欄目配置信息,則返回true
- return true;
- }
- }
- /**
- * 分頁統計
- * @param $data
- */
- public function count($data) {
- if($data['action'] == 'lists') {
- $catid = intval($data['catid']);
- if(!$this->set_modelid($catid)) return false;
- if(isset($data['where'])) {
- $sql = $data['where'];
- } else {
- if($this->category[$catid]['child']) {
- $catids_str = $this->category[$catid]['arrchildid'];
- $pos = strpos($catids_str,',')+1;
- $catids_str = substr($catids_str, $pos);
- $sql = "status=99 AND catid IN ($catids_str)";
- } else {
- $sql = "status=99 AND catid='$catid'";
- }
- }
- return $this->db->count($sql);
- }
- }
- /**
- * 列表頁標簽:主要返回的是主表中數據與附表中數據, {pc:content action="lists"} {/pc}標簽調用的都是lists方法
- * @param $data
- */
- public function lists($data) {
- $catid = intval($data['catid']); //pc標簽中catid屬性
- if(!$this->set_modelid($catid)) return false; //會根據欄目id->對應的模型id->對應的模型表
- if(isset($data['where'])) { //如果pc標簽中設置了where屬性,一般情況下不存在
- $sql = $data['where'];
- } else { //如果pc標簽中沒有設置where屬性
- $thumb = intval($data['thumb']) ? " AND thumb != ''" : ''; //如果有thumb屬性
- if($this->category[$catid]['child']) { //當前欄目下是否存在子欄目
- $catids_str = $this->category[$catid]['arrchildid']; //所有子欄目id,包括當前欄目自身id
- $pos = strpos($catids_str,',')+1;
- $catids_str = substr($catids_str, $pos); //所有子欄目id,不包括當前欄目自身id
- $sql = "status=99 AND catid IN ($catids_str)".$thumb; //拼接成一個sql語句
- } else {
- $sql = "status=99 AND catid='$catid'".$thumb; //如果當前欄目下不存在子欄目
- }
- }
- $order = $data['order']; //pc標簽中order屬性
- //$sql作為一個條件出現,調用的是model.calss.php文件中的select方法,返回結果集數組,并按照鍵名'id'排序
- $return = $this->db->select($sql, '*', $data['limit'], $order, '', 'id');//從數據庫中獲取主表數據,使用的也是sql語句查詢
- //調用副表的數據
- if (isset($data['moreinfo']) && intval($data['moreinfo']) == 1) { //如果pc標簽中設置了moreinfo屬性:是否調用附表數據
- $ids = array();
- //$return為返回的主表數據
- foreach ($return as $v) { //循環主表中的記錄信息:$v-主表中的每條記錄
- if (isset($v['id']) && !emptyempty($v['id'])) {
- $ids[] = $v['id']; //ids[]是主表中排序完成的文章id數組
- } else {
- continue;
- }
- }
- if (!emptyempty($ids)) {
- $this->db->table_name = $this->db->table_name.'_data'; //副表名
- $ids = implode('/',/'', $ids); //以逗號拼接成一個字符串
- $r = $this->db->select("`id` IN ('$ids')", '*', '', '', '', 'id');//查詢與主表中數據有關的副表中的數據
- if (!emptyempty($r)) {
- foreach ($r as $k=>$v) { //副表中的數據
- //$return:返回的主表中的數據,主表中的id字段值與附表中的id字段值是對應的,也就是說一篇文章在主表中存儲的id跟在附表中存儲的id的值是相等的
- if (isset($return[$k])) $return[$k] = array_merge($v, $return[$k]);//主表中數據與副表中數據合并
- }
- }
- }
- }
- return $return;
- }
- /**
- * 相關文章標簽,{pc:content action="relation"} {/pc}標簽調用的都是relation方法
- * @param $data
- */
- public function relation($data) {
- $catid = intval($data['catid']); //pc標簽的catid屬性:欄目id
- if(!$this->set_modelid($catid)) return false;
- $order = $data['order']; //pc標簽的order屬性
- $sql = "`status`=99"; //拼接sql
- $limit = $data['id'] ? $data['limit']+1 : $data['limit'];
- if($data['relation']) { //pc標簽的relation屬性:相關文章id 格式如下:2|7|5
- $relations = explode('|',trim($data[],'|')); //以 | 分割成一個數組
- $relations = array_diff($relations, array(null));
- $relations = implode(',',$relations);
- $sql = " `id` IN ($relations)"; //拼接sql
- $key_array = $this->db->select($sql, '*', $limit, $order,'','id');//關聯的文章
- } elseif($data['keywords']) { //相關關鍵詞
- $keywords = str_replace('%', '',$data['keywords']);
- $keywords_arr = explode(' ',$keywords); //以空格將關鍵詞分割為一個數組
- $key_array = array();
- $number = 0; //相關熱詞文章數量
- $i =1; //控制返回文章數量的標識
- foreach ($keywords_arr as $_k) {
- $sql2 = $sql." AND `keywords` LIKE '%$_k%'".(isset($data['id']) && intval($data['id']) ? " AND `id` != '".abs(intval($data['id']))."'" : '');
- $r = $this->db->select($sql2, '*', $limit, '','','id');
- $number += count($r); //所有熱詞文章的總量
- foreach ($r as $id=>$v) {
- if($i<= $data['limit'] && !in_array($id, $key_array)) $key_array[$id] = $v;//$key_array[文章id]=文章記錄
- $i++;
- }
- if($data['limit']<$number) break;
- }
- }
- if($data['id']) unset($key_array[$data['id']]);//針對性的屏蔽某篇文章
- return $key_array;
- }
- /**
- * 排行榜標簽{pc:content action="hits"} {/pc}標簽調用的都是hits方法
- * @param $data
- */
- public function hits($data) {
- $catid = intval($data['catid']); //欄目id,pc標簽的catid屬性
- if(!$this->set_modelid($catid)) return false; //根據欄目id->對應的模型id->模型表,如:news
- $this->hits_db = pc_base::load_model('hits_model'); //hits:點擊量表
- $sql = $desc = $ids = '';
- $array = $ids_array = array();
- $order = $data['order']; //pc標簽中order屬性
- $hitsid = 'c-'.$this->modelid.'-%'; //hits點擊量表中hitsid字段的組成:c-模型id-文章id
- $sql = "hitsid LIKE '$hitsid'"; //拼接sql
- if(isset($data['day'])) { //pc標簽中day屬性:表示調用多少天內的排行
- $updatetime = SYS_TIME-intval($data['day'])*86400; //表示調用多少天內的排行
- $sql .= " AND updatetime>'$updatetime'"; //拼接sql
- }
- if($this->category[$catid]['child']) { //當前欄目是否有子欄目
- $catids_str = $this->category[$catid]['arrchildid']; //當前欄目下所有子欄目id,包括當前欄目自身的id
- $pos = strpos($catids_str,',')+1;
- $catids_str = substr($catids_str, $pos); //當前欄目下所有子欄目id,不包括當前欄目自身id
- $sql .= " AND catid IN ($catids_str)"; //拼接sql
- } else {
- $sql .= " AND catid='$catid'"; //如果當前欄目不存在子欄目
- }
- $hits = array();
- $result = $this->hits_db->select($sql, '*', $data['limit'], $order);//查詢v9_hits點擊量表
- foreach ($result as $r) { //$result:v9_hits表中返回的數據
- $pos = strpos($r['hitsid'],'-',2) + 1; //格式:c-模型id-文章id,如,c-1-1 ,查找第二個 "-"的位置
- $ids_array[] = $id = substr($r['hitsid'],$pos); //文章的id
- $hits[$id] = $r; //每篇文章的點擊量信息 ,格式:$hits[文章id]= 文章點擊記錄信息
- }
- $ids = implode(',', $ids_array); //以逗號拼接成一個字符串
- if($ids) {
- $sql = "status=99 AND id IN ($ids)"; //拼接sql
- } else {
- $sql = '';
- }
- $this->db->table_name = $this->tablename; //內容主表:v9_news
- $result = $this->db->select($sql, '*', $data['limit'],'','','id'); //查詢內容主表:v9_news
- foreach ($ids_array as $id) {
- if($result[$id]['title']!='') {
- $array[$id] = $result[$id];
- $array[$id] = array_merge($array[$id], $hits[$id]); //將內容主表v9_news中數據與點擊量表v9_hits中數據合并,合并橋梁為id
- }
- }
- return $array;
- }
- /**
- * 欄目標簽:主要用來返回當前欄目下的所有子欄目及子欄目的url鏈接地址等信息:{pc:content action="category"} {/pc}標簽調用的都是category方法
- * @param $data
- */
- public function category($data) {
- $data['catid'] = intval($data['catid']); //pc標簽的catid屬性:欄目id
- $array = array();
- $siteid = $data['siteid'] && intval($data['siteid']) ? intval($data['siteid']) : get_siteid();//pc標簽的siteid屬性:默認調用系統站點
- $categorys = getcache('category_content_'.$siteid,'commons'); //獲取當前站點下所有欄目的詳細配置信息
- $site = siteinfo($siteid); //獲取當前站點的信息
- $i = 1;
- foreach ($categorys as $catid=>$cat) {
- if($i>$data['limit']) break;
- if((!$cat['ismenu']) || $siteid && $cat['siteid']!=$siteid) continue;//ismenu:是否顯示欄目,1-顯示欄目 0-不顯示欄目
- if (strpos($cat['url'], '://') === false) { //當前欄目的url鏈接地址中是否存在 "://"
- $cat['url'] = substr($site['domain'],0,-1).$cat['url']; //當前欄目的url鏈接地址
- }
- if($cat['parentid']==$data['catid']) { //默認為0,調用一級欄目,$cat['parentid']只有一個值
- $array[$catid] = $cat; //所有子欄目信息
- $i++;
- }
- }
- return $array;
- }
- /**
- * 推薦位,主要用來返回當前推薦位置所有文章的標題和url鏈接地址等信息:{pc:content action="position"} {/pc}標簽調用的都是position方法
- * @param $data
- */
- public function position($data) {
- $sql = '';
- $array = array();
- $posid = intval($data['posid']); //pc標簽中posid屬性:推薦位id
- $order = $data['order']; //pc標簽中order屬性
- $thumb = (emptyempty($data['thumb']) || intval($data['thumb']) == 0) ? 0 : 1;//pc標簽中thumb屬性
- $siteid = $GLOBALS['siteid'] ? $GLOBALS['siteid'] : 1; //當前站點id
- $catid = (emptyempty($data['catid']) || $data['catid'] == 0) ? '' : intval($data['catid']);//pc標簽中的catid屬性
- if($catid) { //如果欄目id存在
- $siteids = getcache('category_content','commons'); //獲取所有欄目所對應的站點id
- if(!$siteids[$catid]) return false; //當前站點下不存在當前欄目,則返回false
- $siteid = $siteids[$catid]; //當前站點id
- $this->category = getcache('category_content_'.$siteid,'commons');//當前站點id下所有欄目的詳細配置信息
- }
- if($catid && $this->category[$catid]['child']) { //當前欄目是否存在子欄目
- $catids_str = $this->category[$catid]['arrchildid']; //當前欄目下所有子欄目id,包括當前欄目自身id
- $pos = strpos($catids_str,',')+1;
- $catids_str = substr($catids_str, $pos); //當前欄目下所有子欄目id,不包括當前欄目自身id
- $sql = "`catid` IN ($catids_str) AND "; //拼接sql
- } elseif($catid && !$this->category[$catid]['child']) { //如果當前欄目不存在子欄目
- $sql = "`catid` = '$catid' AND ";
- }
- if($thumb) $sql .= "`thumb` = '1' AND "; //有縮略圖的情況
- if(isset($data['where'])) $sql .= $data['where'].' AND '; //pc標簽的where屬性:一般情況下沒有此屬性
- if(isset($data['expiration']) && $data['expiration']==1) $sql .= '(`expiration` >= /''.SYS_TIME.'/' OR `expiration` = /'0/' ) AND ';
- $sql .= "`posid` = '$posid' AND `siteid` = '".$siteid."'"; //拼接sql
- $pos_arr = $this->position->select($sql, '*', $data['limit'],$order);//查詢v9_position_data表
- if(!emptyempty($pos_arr)) {
- foreach ($pos_arr as $info) { //循環查詢到的v9_position_data表中的記錄
- $key = $info['catid'].'-'.$info['id']; //格式:欄目id-文章id
- $array[$key] = string2array($info['data']); //將v9_position_data表中data字段的值轉換為數組
- $array[$key]['url'] = go($info['catid'],$info['id']); //url鏈接地址
- $array[$key]['id'] = $info['id']; //文章id
- $array[$key]['catid'] = $info['catid']; //欄目id
- $array[$key]['listorder'] = $info['listorder']; //排序
- }
- }
- return $array;
- }
- /**
- * 可視化標簽,主要用于在后臺可視化的對pc標簽進行編輯
- */
- public function pc_tag() {
- $positionlist = getcache('position','commons');
- $sites = pc_base::load_app_class('sites','admin');
- $sitelist = $sites->pc_tag_list();
- foreach ($positionlist as $_v) if($_v['siteid'] == get_siteid() || $_v['siteid'] == 0) $poslist[$_v['posid']] = $_v['name'];
- return array(
- 'action'=>array('lists'=>L('list',, 'content'),'position'=>L('position','', 'content'), 'category'=>L('subcat', '', 'content'), 'relation'=>L('related_articles', '', 'content'), 'hits'=>L('top', '', 'content')),
- 'lists'=>array(
- 'catid'=>array('name'=>L('catid', '', 'content'),'htmltype'=>'input_select_category','data'=>array('type'=>0),'validator'=>array('min'=>1)),
- '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'))),
- 'thumb'=>array('name'=>L('thumb', '', 'content'), 'htmltype'=>'radio','data'=>array('0'=>L('all_list', '', 'content'), '1'=>L('thumb_list', '', 'content'))),
- 'moreinfo'=>array('name'=>L('moreinfo', '', 'content'), 'htmltype'=>'radio', 'data'=>array('1'=>L('yes'), '0'=>L('no')))
- ),
- 'position'=>array(
- 'posid'=>array('name'=>L('posid', '', 'content'),'htmltype'=>'input_select','data'=>$poslist,'validator'=>array('min'=>1)),
- 'catid'=>array('name'=>L('catid', '', 'content'),'htmltype'=>'input_select_category','data'=>array('type'=>0),'validator'=>array('min'=>0)),
- 'thumb'=>array('name'=>L('thumb', '', 'content'), 'htmltype'=>'radio','data'=>array('0'=>L('all_list', '', 'content'), '1'=>L('thumb_list', '', 'content'))),
- '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'))),
- ),
- 'category'=>array(
- 'siteid'=>array('name'=>L('siteid'), 'htmltype'=>'input_select', 'data'=>$sitelist),
- 'catid'=>array('name'=>L('catid', '', 'content'), 'htmltype'=>'input_select_category', 'data'=>array('type'=>0))
- ),
- 'relation'=>array(
- 'catid'=>array('name'=>L('catid', '', 'content'), 'htmltype'=>'input_select_category', 'data'=>array('type'=>0), 'validator'=>array('min'=>1)),
- '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'))),
- 'relation'=>array('name'=>L('relevant_articles_id', '', 'content'), 'htmltype'=>'input'),
- 'keywords'=>array('name'=>L('key_word', '', 'content'), 'htmltype'=>'input') //Vevb.com
- ),
- 'hits'=>array(
- 'catid'=>array('name'=>L('catid', '', 'content'), 'htmltype'=>'input_select_category', 'data'=>array('type'=>0), 'validator'=>array('min'=>1)),
- 'day'=>array('name'=>L('day_select', '', 'content'), 'htmltype'=>'input', 'data'=>array('type'=>0)),
- ),
- );
- }
- } ?>
新聞熱點
疑難解答