【phpcms-v9】前台模板文件中{pc}标签的执行流程

前台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标签调用的方法


[html]  view plain  copy
 print ?
  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. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值