当前位置:首页 > CMS教程 > phpcms > 列表

phpcms-v9,index.php文件分析-前台首页模板文件的解析过程分析

发布:smiling 来源: PHP粉丝网  添加日期:2014-10-21 22:46:19 浏览: 评论:0 

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

第七步:pc标签类,路径:phpcms/modules/content/classes/content_tag.class.php,代码如下:

  1. private $db;   
  2. public function __construct() {   
  3.     $this->db = pc_base::load_model('content_model');//查看第八步:数据模型,对应数据表news 和 news_data   
  4.     $this->position = pc_base::load_model('position_data_model');//数据模型   
  5. }   
  6. /**   
  7.  * 初始化模型   
  8.  * @param $catid   
  9.  */   
  10. public function set_modelid($catid) {   
  11.     $siteids = getcache('category_content','commons');//获取所有栏目所属的站点id   
  12.     if(!$siteids[$catid]) return false;//不存在此栏目,返回false   
  13.     $siteid = $siteids[$catid];//当前栏目所属站点id   
  14.     $this->category = getcache('category_content_'.$siteid,'commons');//获取当前站点id下所有栏目的配置信息   
  15.     if($this->category[$catid]['type']!=0) return false;//如果不为内部栏目,返回false  0-内部栏目 1-单网页 2-外部链接   
  16.     $this->modelid = $this->category[$catid]['modelid'];//获取当前栏目所属模型id   
  17.     $this->db->set_model($this->modelid);//查看第八步   
  18.     $this->tablename = $this->db->table_name;//数据表名   
  19.     if(emptyempty($this->category)) {//当前站点id下所有栏目的配置信息   
  20.         return false;   
  21.     } else {   
  22.         return true;   
  23.     }   
  24. }   
  25.  
  26.        /**   
  27.  * 列表页标签   
  28.  * @param $data   
  29.  */   
  30. public function lists($data) {   
  31.     $catid = intval($data['catid']);   
  32.     if(!$this->set_modelid($catid)) return false;   
  33.     if(isset($data['where'])) {//如果pc标签中设置了条件   
  34.         $sql = $data['where'];//pc标签中的条件   
  35.     } else {//如果pc标签中没有设置条件   
  36.         $thumb = intval($data['thumb']) ? " AND thumb != ''" : '';   
  37.         if($this->category[$catid]['child']) {   
  38.             $catids_str = $this->category[$catid]['arrchildid'];   
  39.             $pos = strpos($catids_str,',')+1;   
  40.             $catids_str = substr($catids_str$pos);   
  41.             $sql = "status=99 AND catid IN ($catids_str)".$thumb;   
  42.         } else {   
  43.             $sql = "status=99 AND catid='$catid'".$thumb;   
  44.         }   
  45.     }   
  46.     $order = $data['order'];//pc标签中排序字段   
  47.    
  48.     $return = $this->db->select($sql'*'$data['limit'], $order'''id');//从数据库中获取主表数据,使用的也是sql语句查询   
  49.                        
  50.     //调用副表的数据   
  51.     if (isset($data['moreinfo']) && intval($data['moreinfo']) == 1) {   
  52.         $ids = array();   
  53.         foreach ($return as $v) {   
  54.             if (isset($v['id']) && !emptyempty($v['id'])) {   
  55.                 $ids[] = $v['id'];   
  56.             } else {   
  57.                 continue;   
  58.             }   
  59.         }   
  60.         if (!emptyempty($ids)) {   
  61.             $this->db->table_name = $this->db->table_name.'_data';//副表名   
  62.             $ids = implode('\',\''$ids);   
  63.             $r = $this->db->select("`id` IN ('$ids')"'*''''''''id');   
  64.             if (!emptyempty($r)) {   
  65.                 foreach ($r as $k=>$v) {   
  66.                     if (isset($return[$k])) $return[$k] = array_merge($v$return[$k]);//主表中数据与副表中数据合并   
  67.                 }   
  68.             }   
  69.         }   
  70.     }   
  71.     return $return;//返回查询到的数据   
  72. }   

第八步:content_model类,路径:phpcms/model/content_model.class.php,代码如下:

  1. public $table_name = '';//数据库表名   
  2. public $category = '';   
  3. public function __construct() {   
  4.     $this->db_config = pc_base::load_config('database');//加载数据库配置信息   
  5.     $this->db_setting = 'default';//加载数据库默认的配置信息   
  6.     parent::__construct();   
  7.     $this->url = pc_base::load_app_class('url''content');   
  8.     $this->siteid = get_siteid();//得到当前站点id   
  9. }   //phpfensi.com 
  10. public function set_model($modelid) {   
  11.     $this->model = getcache('model''commons');//获取所有模型的配置信息  1-文档模型 2-下载模型 3-图片模型    跟后台设置有关   
  12.     $this->modelid = $modelid;//当前模型id   
  13.                $this->table_name = $this->db_tablepre.$this->model[$modelid]['tablename'];//模型所对应的数据表 文档模型-news  图片模型-picture 下载模型-download   
  14.     $this->model_tablename = $this->model[$modelid]['tablename'];   
  15. }   

总结:pc标签内部机制也是通过sql语句来返回数据的.

Tags: phpcms首页模板 phpcms文件解析

分享到: