亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Inhaltsverzeichnis
phpcms V9 首頁模板文件解析(轉(zhuǎn)),
Heim Backend-Entwicklung PHP-Tutorial phpcms V9 首頁模板文件解析(轉(zhuǎn)),_PHP教程

phpcms V9 首頁模板文件解析(轉(zhuǎn)),_PHP教程

Jul 12, 2016 am 08:49 AM
http phpcms dokumentieren Vorlage Analyse ?ndern Titelseite

phpcms V9 首頁模板文件解析(轉(zhuǎn)),

轉(zhuǎn)自:http://www.cnblogs.com/Braveliu/p/5100018.html

轉(zhuǎn)在了解了《phpcms V9 URL訪問解析》之后,我們已經(jīng)知道首頁最終執(zhí)行的是content模塊下index控制器的init方法。

下面, 我們逐步分析過程如下:

第一、首頁默認執(zhí)行的是index.php?m=content&c=index&a=init

如下代碼(路徑:phpcms\modules\content\index.php),先從init函數(shù)分析:

復制代碼

 1 class index 
 2 {
 3     private $db;
 4     function __construct() 
 5     {
 6         $this->db = pc_base::load_model('content_model');
 7         $this->_userid = param::get_cookie('_userid');
 8         $this->_username = param::get_cookie('_username');
 9         $this->_groupid = param::get_cookie('_groupid');
10     }
11     //首頁
12     public function init() 
13     {
14         if(isset($_GET['siteid'])) 
15         {
16             $siteid = intval($_GET['siteid']); //當前站點id  函數(shù)intval作用變量轉(zhuǎn)成整數(shù)類型
17         } 
18         else 
19         {
20             $siteid = 1;
21         }
22         $siteid = $GLOBALS['siteid'] = max($siteid,1);
23         define('SITEID', $siteid);
24         $_userid = $this->_userid;
25         $_username = $this->_username;
26         $_groupid = $this->_groupid;
27         //SEO 搜索引擎優(yōu)化信息
28         $SEO = seo($siteid); //調(diào)用第二步,獲取當前站點當前欄目下生成的SEO信息
29         $sitelist  = getcache('sitelist','commons'); //緩存后臺設置的所有站點配置信息
30         $default_style = $sitelist[$siteid]['default_style']; //當前站點默認模板風格配置
31         $CATEGORYS = getcache('category_content_'.$siteid,'commons'); //當前站點所有欄目詳細配置信息
32         include template('content','index',$default_style); //調(diào)用第三步:模板調(diào)用
33     }

復制代碼

第二、獲取SEO信息:phpcms/libs/functions/global.func.php

復制代碼

 1 /**
 2  * 生成SEO
 3  * @param $siteid       站點ID
 4  * @param $catid        欄目ID
 5  * @param $title        標題
 6  * @param $description  描述
 7  * @param $keyword      關鍵詞
 8  */
 9 function seo($siteid, $catid = '', $title = '', $description = '', $keyword = '') 
10 {
11     if (!empty($title))
12         $title = strip_tags($title); //過濾title。 strip_tags() 函數(shù)剝?nèi)プ址械?HTML、XML 以及 PHP 的標簽。
13     if (!empty($description)) 
14         $description = strip_tags($description); //過濾description
15     if (!empty($keyword)) 
16         $keyword = str_replace(' ', ',', strip_tags($keyword)); //過濾keyword
17     $sites = getcache('sitelist', 'commons'); //獲取所有站點詳細配置信息
18     $site = $sites[$siteid];    //當前站點詳細配置信息
19     $cat = array();
20     if (!empty($catid))     //欄目ID不為空
21     {
22         $siteids = getcache('category_content','commons'); //獲取所有欄目對應的站點ID緩存文件,格式:欄目ID=>站點ID
23         $siteid = $siteids[$catid]; //當前欄目對應的站點ID
24         $categorys = getcache('category_content_'.$siteid,'commons'); //獲取當前站點下所有欄目的詳細配置信息
25         $cat = $categorys[$catid];    //當前站點下當前欄目的詳細配置信息 
26         $cat['setting'] = string2array($cat['setting']); //當前站點當前欄目詳細配置信息的setting設置信息,轉(zhuǎn)化為數(shù)組
27     }
28     //站點title
29     $seo['site_title'] =isset($site['site_title']) && !empty($site['site_title']) ? $site['site_title'] : $site['name'];
30     //關鍵字
31     $seo['keyword'] = !empty($keyword) ? $keyword : $site['keywords'];
32     //描述
33     $seo['description'] = isset($description) && !empty($description) ? $description : (isset($cat['setting']['meta_description']) && !empty($cat['setting']['meta_description']) ? $cat['setting']['meta_description'] : (isset($site['description']) && !empty($site['description']) ? $site['description'] : ''));
34     //標題
35     $seo['title'] =  (isset($title) && !empty($title) ? $title.' - ' : '').(isset($cat['setting']['meta_title']) && !empty($cat['setting']['meta_title']) ? $cat['setting']['meta_title'].' - ' : (isset($cat['catname']) && !empty($cat['catname']) ? $cat['catname'].' - ' : ''));
36     foreach ($seo as $k=>$v) 
37     {
38         $seo[$k] = str_replace(array("\n","\r"),    '', $v); //將seo信息中\(zhòng)n和\r替換為空
39     }
40     return $seo;    //返回seo數(shù)組信息
41 }

復制代碼

第三、模板調(diào)用:phpcms/libs/functions/global.func.php

復制代碼

 1 /**
 2  * 模板調(diào)用
 3  *
 4  * @param $module 默認為content
 5  * @param $template 默認為index
 6  * @param $istag
 7  * @return unknown_type
 8  */
 9 function template($module = 'content', $template = 'index', $style = '') 
10 {
11     if(strpos($module, 'plugin/')!== false) 
12     { // 檢測模塊里面是否包含plugin字符,這里進行了對插件模板的判斷,插件模板需要調(diào)用p_template過程解析
13         $plugin = str_replace('plugin/', '', $module);
14         return p_template($plugin, $template,$style);
15     }
16     $module = str_replace('/', DIRECTORY_SEPARATOR, $module);
17     if(!empty($style) && preg_match('/([a-z0-9\-_]+)/is',$style)) 
18     {
19     } 
20     elseif (empty($style) && !defined('STYLE')) 
21     {
22         if(defined('SITEID'))  // 是否定義了SITEID常量
23         {
24             $siteid = SITEID;
25         } 
26         else 
27         {
28             $siteid = param::get_cookie('siteid');
29         }
30         if (!$siteid) $siteid = 1;
31         $sitelist = getcache('sitelist','commons'); //獲取所有站點的詳細配置信息
32         if(!empty($siteid)) 
33         {
34             $style = $sitelist[$siteid]['default_style']; //獲取當前站點的默認模板風格
35         }
36     } 
37     elseif (empty($style) && defined('STYLE')) 
38     {
39         $style = STYLE;
40     } 
41     else 
42     {
43         $style = 'default';
44     }
45     if(!$style) 
46         $style = 'default';
47     //模板解析類,文件路徑:phpcms/libs/classes/template_cache.class.php
48     $template_cache = pc_base::load_sys_class('template_cache');
49     //編譯文件緩存路徑:根目錄/caches/caches_template/default/content/index.php
50     $compiledtplfile = PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_template'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.php';
51     //首頁模板文件,如文件路徑:phpcms/templates/dafault/content/index.html
52     if(file_exists(PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html')) 
53     {
54         //如果編譯文件不存在或者說模板文件的創(chuàng)建時間大于編譯文件的生成時間,則重新編譯
55         if(!file_exists($compiledtplfile) || (@filemtime(PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html') > @filemtime($compiledtplfile))) 
56         {
57             $template_cache->template_compile($module, $template, $style); //調(diào)用第四步:適用模板風格不是default的情況
58         }
59     } 
60     else 
61     {
62         //編譯文件緩存路徑:根目錄/caches/caches_template/default/content/index.php 
63         $compiledtplfile = PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_template'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.php';
64         //如果編譯文件不存在或者說前臺公共的模板文件存在,并且前臺公共模板文件的創(chuàng)建時間大于編譯文件的生成時間
65         if(!file_exists($compiledtplfile) || (file_exists(PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html') && filemtime(PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html') > filemtime($compiledtplfile))) 
66         {
67             //重新編譯
68             $template_cache->template_compile($module, $template, 'default');
69         } 
70         elseif (!file_exists(PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html')) 
71         {  //如果前臺公共的模板文件不存在的話,則提示模板不存在
72             showmessage('Template does not exist.'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html');
73         }
74     }
75     //返回編譯文件
76     return $compiledtplfile;
77 }

復制代碼

第四、模板解析:phpcms/libs/classes/template_cache.class.php

復制代碼

 1 /**
 2  *  模板解析緩存
 3  */
 4 final class template_cache 
 5 {
 6     
 7     /**
 8      * 編譯模板
 9      *
10      * @param $module    模塊名稱
11      * @param $template    模板文件名
12      * @param $istag    是否為標簽模板
13      * @return unknown
14      */
15     
16     public function template_compile($module, $template, $style = 'default') 
17     {
18         if(strpos($module, '/')=== false) // 如果“/”不存在
19         {
20             //路徑:phpcms/templates/default/content/index.html 如:首頁公共模板文件  
21             $tplfile = $_tpl = PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html';
22         } 
23         elseif (strpos($module, 'yp/') !== false) 
24         {
25             $module = str_replace('/', DIRECTORY_SEPARATOR, $module);
26             $tplfile = $_tpl = PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html';
27         } 
28         else 
29         {
30             $plugin = str_replace('plugin/', '', $module);
31             $module = str_replace('/', DIRECTORY_SEPARATOR, $module);
32             $tplfile = $_tpl = PC_PATH.'plugin'.DIRECTORY_SEPARATOR.$plugin.DIRECTORY_SEPARATOR.'templates'.DIRECTORY_SEPARATOR.$template.'.html';
33         }
34         if ($style != 'default' && !file_exists ( $tplfile )) 
35         {
36             $style = 'default';
37             $tplfile = PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html';
38         }
39         if (! file_exists ( $tplfile ))
40         {
41             //如果公共模板文件不存在,則提示模板文件不存在,如:/templates/default/content/index.html is not exists!
42             showmessage ( "templates".DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.".html is not exists!" );
43         }
44         //獲取公共模板文件中的內(nèi)容
45         $content = @file_get_contents ( $tplfile );
46         //要生成的編譯文件所在目錄
47         $filepath = CACHE_PATH.'caches_template'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR;
48         if(!is_dir($filepath)) 
49         {
50             //如果目錄不存在,則層級創(chuàng)建所有目錄
51             mkdir($filepath, 0777, true);
52         }
53         //編譯文件的全路徑
54         $compiledtplfile = $filepath.$template.'.php';
55         //解析公共模板文件中的內(nèi)容及標簽,并返回解析后的內(nèi)容  
56         $content = $this->template_parse($content); // 調(diào)用下一個過程
57         //將解析后的公共模板文件內(nèi)容寫入到要生成的編譯文件中
58         $strlen = file_put_contents ( $compiledtplfile, $content );
59         //給生成的編譯文件設置權限
60         chmod ( $compiledtplfile, 0777 );
61         //返回寫入編譯文件的字節(jié)數(shù)
62         return $strlen;
63     }
64 
65     /**
66      * 解析模板
67      *
68      * @param $str    模板內(nèi)容
69      * @return ture
70      */
71     public function template_parse($str) {
72         $str = preg_replace ( "/\{template\s+(.+)\}/", "<?php include template(\\1); ?>", $str );
73         $str = preg_replace ( "/\{include\s+(.+)\}/", "<?php include \\1; ?>", $str );
74         $str = preg_replace ( "/\{php\s+(.+)\}/", "<?php \\1?>", $str );
75         $str = preg_replace ( "/\{if\s+(.+?)\}/", "<?php if(\\1) { ?>", $str );
76         $str = preg_replace ( "/\{else\}/", "<?php } else { ?>", $str );
77         $str = preg_replace ( "/\{elseif\s+(.+?)\}/", "<?php } elseif (\\1) { ?>", $str );
78         $str = preg_replace ( "/\{\/if\}/", "<?php } ?>", $str );
79         //for 循環(huán)
80         $str = preg_replace("/\{for\s+(.+?)\}/","<?php for(\\1) { ?>",$str);
81         $str = preg_replace("/\{\/for\}/","<?php } ?>",$str);
82         //++ --
83         $str = preg_replace("/\{\+\+(.+?)\}/","<?php ++\\1; ?>",$str);
84         $str = preg_replace("/\{\-\-(.+?)\}/","<?php ++\\1; ?>",$str);
85         $str = preg_replace("/\{(.+?)\+\+\}/","<?php \\1++; ?>",$str);
86         $str = preg_replace("/\{(.+?)\-\-\}/","<?php \\1--; ?>",$str);
87         $str = preg_replace ( "/\{loop\s+(\S+)\s+(\S+)\}/", "<?php \$n=1;if(is_array(\\1)) foreach(\\1 AS \\2) { ?>", $str );
88         $str = preg_replace ( "/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/", "<?php \$n=1; if(is_array(\\1)) foreach(\\1 AS \\2 => \\3) { ?>", $str );
89         $str = preg_replace ( "/\{\/loop\}/", "<?php \$n++;}unset(\$n); ?>", $str );
90         $str = preg_replace ( "/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "<?php echo \\1;?>", $str );
91         $str = preg_replace ( "/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "<?php echo \\1;?>", $str );
92         $str = preg_replace ( "/\{(\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/", "<?php echo \\1;?>", $str );
93         $str = preg_replace("/\{(\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\}/es", "\$this->addquote('<?php echo \\1;?>')",$str);
94         $str = preg_replace ( "/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/s", "<?php echo \\1;?>", $str );
95         $str = preg_replace("/\{pc:(\w+)\s+([^}]+)\}/ie", "self::pc_tag('$1','$2', '$0')", $str);
96         $str = preg_replace("/\{\/pc\}/ie", "self::end_pc_tag()", $str);
97         $str = "<?php defined('IN_PHPCMS') or exit('No permission resources.'); ?>" . $str;
98         return $str;
99     }

復制代碼

第五、PC標簽的解析:phpcms/libs/classes/template_cache.class.php 文件

復制代碼

  1 /**
  2      * 解析PC標簽
  3      * @param string $op 操作方式
  4      * @param string $data 參數(shù)
  5      * @param string $html 匹配到的所有的HTML代碼
  6      */
  7     public static function pc_tag($op, $data, $html) 
  8     {
  9         preg_match_all("/([a-z]+)\=[\"]?([^\"]+)[\"]?/i", stripslashes($data), $matches, PREG_SET_ORDER);
 10         $arr = array('action','num','cache','page', 'pagesize', 'urlrule', 'return', 'start');
 11         $tools = array('json', 'xml', 'block', 'get');
 12         $datas = array();
 13         $tag_id = md5(stripslashes($html));
 14         //可視化條件
 15         $str_datas = 'op='.$op.'&tag_md5='.$tag_id;
 16         foreach ($matches as $v) 
 17         {
 18             $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]));
 19             if(in_array($v[1], $arr)) 
 20             {
 21                 $$v[1] = $v[2];//如果pc標簽中參數(shù)在默認參數(shù)數(shù)組$arr中存在,則將參數(shù)轉(zhuǎn)換為變量,如:$page=value等 
 22                 continue;
 23             }
 24             $datas[$v[1]] = $v[2];//如果pc標簽中參數(shù)不在默認參數(shù)數(shù)組$arr中存在,則直接將其放置到$datas[參數(shù)名]=value中 
 25         }
 26         $str = '';
 27         $num = isset($num) && intval($num) ? intval($num) : 20;
 28         $cache = isset($cache) && intval($cache) ? intval($cache) : 0;
 29         $return = isset($return) && trim($return) ? trim($return) : 'data';
 30         if (!isset($urlrule)) $urlrule = '';
 31         if (!empty($cache) && !isset($page)) 
 32         {
 33             $str .= '$tag_cache_name = md5(implode(\'&\','.self::arr_to_html($datas).').\''.$tag_id.'\');if(!$'.$return.' = tpl_cache($tag_cache_name,'.$cache.')){';
 34         }
 35         if (in_array($op,$tools)) 
 36         { //pc標簽分兩大類:工具類和模塊類。工具類執(zhí)行如下代碼
 37             switch ($op) 
 38             {
 39                 case 'json':
 40                         if (isset($datas['url']) && !empty($datas['url'])) 
 41                         {
 42                             $str .= '$json = @file_get_contents(\''.$datas['url'].'\');';
 43                             $str .= '$'.$return.' = json_decode($json, true);';
 44                         }
 45                     break;
 46                     
 47                 case 'xml':
 48                         $str .= '$xml = pc_base::load_sys_class(\'xml\');';
 49                         $str .= '$xml_data = @file_get_contents(\''.$datas['url'].'\');';
 50                         $str .= '$'.$return.' = $xml->xml_unserialize($xml_data);';
 51                     break;
 52                     
 53                 case 'get':
 54                         $str .= 'pc_base::load_sys_class("get_model", "model", 0);';
 55                         if ($datas['dbsource']) 
 56                         {
 57                             $dbsource = getcache('dbsource', 'commons');
 58                             if (isset($dbsource[$datas['dbsource']])) 
 59                             {
 60                                 $str .= '$get_db = new get_model('.var_export($dbsource,true).', \''.$datas['dbsource'].'\');';
 61                             } 
 62                             else 
 63                             {
 64                                 return false;
 65                             }
 66                         } 
 67                         else 
 68                         {
 69                             $str .= '$get_db = new get_model();';
 70                         }
 71                         $num = isset($num) && intval($num) > 0 ? intval($num) : 20;
 72                         if (isset($start) && intval($start)) 
 73                         {
 74                             $limit = intval($start).','.$num;
 75                         } 
 76                         else 
 77                         {
 78                             $limit = $num;
 79                         }
 80                         if (isset($page)) 
 81                         {
 82                             $str .= '$pagesize = '.$num.';';
 83                             $str .= '$page = intval('.$page.') ? intval('.$page.') : 1;if($page<=0){$page=1;}';
 84                             $str .= '$offset = ($page - 1) * $pagesize;';
 85                             $limit = '$offset,$pagesize';
 86                             $sql = 'SELECT COUNT(*) as count FROM ('.$datas['sql'].') T';
 87                             $str .= '$r = $get_db->sql_query("'.$sql.'");$s = $get_db->fetch_next();$pages=pages($s[\'count\'], $page, $pagesize, $urlrule);';
 88                         }
 89                         
 90                         $str .= '$r = $get_db->sql_query("'.$datas['sql'].' LIMIT '.$limit.'");while(($s = $get_db->fetch_next()) != false) {$a[] = $s;}$'.$return.' = $a;unset($a);';
 91                     break;
 92                     
 93                 case 'block':
 94                     $str .= '$block_tag = pc_base::load_app_class(\'block_tag\', \'block\');';
 95                     $str .= 'echo $block_tag->pc_tag('.self::arr_to_html($datas).');';
 96                     break;
 97             }
 98         } 
 99         else 
100         {    //pc標簽分兩大類:工具類和模塊類。模塊類執(zhí)行如下代碼
101             if (!isset($action) || empty($action)) 
102                 return false;
103             //content模塊:phpcms/modules/content/classes/content_tag.class.php  
104             if (module_exists($op) && file_exists(PC_PATH.DIRECTORY_SEPARATOR.'modules'.DIRECTORY_SEPARATOR.$op.DIRECTORY_SEPARATOR.'classes'.DIRECTORY_SEPARATOR.$op.'_tag.class.php')) 
105             {
106                 //content_tag.class.php  檢查content_tag類中是否存在的某方法
107                 $str .= '$'.$op.'_tag = pc_base::load_app_class("'.$op.'_tag", "'.$op.'");if (method_exists($'.$op.'_tag, \''.$action.'\')) {';    
108                 if (isset($start) && intval($start)) 
109                 {
110                     $datas['limit'] = intval($start).','.$num; //如:limit 0 , 10
111                 } 
112                 else 
113                 {
114                     $datas['limit'] = $num; //如:limit 10
115                 }
116                 if (isset($page)) //分頁參數(shù)
117                 {
118                     $str .= '$pagesize = '.$num.';'; //每頁顯示數(shù)據(jù)量
119                     $str .= '$page = intval('.$page.') ? intval('.$page.') : 1;if($page<=0){$page=1;}';//當前頁碼
120                     $str .= '$offset = ($page - 1) * $pagesize;';//要查詢數(shù)據(jù)的開始位置
121                     $datas['limit'] = '$offset.",".$pagesize';
122                     $datas['action'] = $action; //方法,如,content_tag.class.php中的lists方法 
123                     $str .= '$'.$op.'_total = $'.$op.'_tag->count('.self::arr_to_html($datas).');';//分頁方法
124                     $str .= '$pages = pages($'.$op.'_total, $page, $pagesize, $urlrule);';
125                 }
126                 //調(diào)用第七步:content_tag.class.php中方法
127                 $str .= '$'.$return.' = $'.$op.'_tag->'.$action.'('.self::arr_to_html($datas).');';
128                 $str .= '}';
129             } 
130         }
131         if (!empty($cache) && !isset($page)) 
132         {
133             $str .= 'if(!empty($'.$return.')){setcache($tag_cache_name, $'.$return.', \'tpl_data\');}';
134             $str .= '}';
135         }
136         /**  
137          * 解析結果大概如下所示:  
138          <?php  
139          if(defined('IN_ADMIN')  && !defined('HTML')) 
140          {  
141             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\">  
142             <a href=\"javascript:void(0)\" class=\"admin_piao_edit\">編輯</a>";  
143          }  
144          $content_tag = pc_base::load_app_class("content_tag", "content");  
145          if (method_exists($content_tag, 'position')) 
146          {  
147             $data = $content_tag->position(array('posid'=>'12','thumb'=>'1','order'=>'listorder DESC','limit'=>'10',));  
148          }
149         ?>
150          */
151         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."?".">";
152     }

復制代碼

第六、PC標簽類。文件路徑:phpcms/modules/content/classes/content_tag.class.php

復制代碼

  1 class content_tag 
  2 {
  3     private $db;
  4     public function __construct() 
  5     {
  6         $this->db = pc_base::load_model('content_model'); //調(diào)用第七步,數(shù)據(jù)模型,對應數(shù)據(jù)表為news和news_data
  7         $this->position = pc_base::load_model('position_data_model'); //數(shù)據(jù)模型
  8     }
  9     /**
 10      * 初始化模型
 11      * @param $catid
 12      */
 13     public function set_modelid($catid) 
 14     {
 15         static $CATS;
 16         $siteids = getcache('category_content','commons'); //獲取所有欄目所屬的站點id
 17         if(!$siteids[$catid]) 
 18             return false; //不存在此欄目,返回false
 19         $siteid = $siteids[$catid]; //當前欄目所屬站點id
 20         if ($CATS[$siteid]) 
 21         {
 22             $this->category = $CATS[$siteid];
 23         } 
 24         else 
 25         {
 26             //獲取當前站點id下所有欄目的配置信息
 27             $CATS[$siteid] = $this->category = getcache('category_content_'.$siteid,'commons');
 28         }
 29         if($this->category[$catid]['type']!=0) 
 30             return false; //如果不為內(nèi)部欄目,返回false  0-內(nèi)部欄目 1-單網(wǎng)頁 2-外部鏈接
 31         $this->modelid = $this->category[$catid]['modelid']; //獲取當前欄目所屬模型id 
 32         $this->db->set_model($this->modelid); //調(diào)用第七步
 33         $this->tablename = $this->db->table_name; //數(shù)據(jù)表名
 34         if(empty($this->category)) 
 35         {
 36             //當前站點id下所有欄目的配置信息
 37             return false;
 38         } 
 39         else
 40         {
 41             return true;
 42         }
 43     }
 44     /**
 45      * 分頁統(tǒng)計
 46      * @param $data
 47      */
 48     public function count($data) 
 49     {
 50         if($data['action'] == 'lists') 
 51         {
 52             $catid = intval($data['catid']);
 53             if(!$this->set_modelid($catid)) return false;
 54             if(isset($data['where'])) 
 55             {
 56                 $sql = $data['where'];
 57             } 
 58             else 
 59             {
 60                 if($this->category[$catid]['child']) 
 61                 {
 62                     $catids_str = $this->category[$catid]['arrchildid'];
 63                     $pos = strpos($catids_str,',')+1;
 64                     $catids_str = substr($catids_str, $pos);
 65                     $sql = "status=99 AND catid IN ($catids_str)";
 66                 } 
 67                 else 
 68                 {
 69                     $sql = "status=99 AND catid='$catid'";
 70                 }
 71             }
 72             return $this->db->count($sql);
 73         }
 74     }
 75     
 76     /**
 77      * 列表頁標簽
 78      * @param $data
 79      */
 80     public function lists($data) 
 81     {
 82         $catid = intval($data['catid']);
 83         if(!$this->set_modelid($catid)) 
 84             return false;
 85         if(isset($data['where'])) //如果pc標簽中設置了條件
 86         {
 87             $sql = $data['where']; //pc標簽中的條件
 88         } 
 89         else 
 90         {
 91             $thumb = intval($data['thumb']) ? " AND thumb != ''" : '';
 92             if($this->category[$catid]['child']) 
 93             {
 94                 $catids_str = $this->category[$catid]['arrchildid'];
 95                 $pos = strpos($catids_str,',')+1;
 96                 $catids_str = substr($catids_str, $pos);
 97                 $sql = "status=99 AND catid IN ($catids_str)".$thumb;
 98             } 
 99             else 
100             {
101                 $sql = "status=99 AND catid='$catid'".$thumb;
102             }
103         }
104         $order = $data['order']; //pc標簽中排序字段
105 
106         //從數(shù)據(jù)庫中獲取主表數(shù)據(jù),使用的也是sql語句查詢
107         $return = $this->db->select($sql, '*', $data['limit'], $order, '', 'id');
108                         
109         //調(diào)用副表的數(shù)據(jù)
110         if (isset($data['moreinfo']) && intval($data['moreinfo']) == 1) 
111         {
112             $ids = array();
113             foreach ($return as $v) 
114             {
115                 if (isset($v['id']) && !empty($v['id'])) 
116                 {
117                     $ids[] = $v['id'];
118                 } 
119                 else
120                 {
121                     continue;
122                 }
123             }
124             if (!empty($ids)) 
125             {
126                 $this->db->table_name = $this->db->table_name.'_data';//副表名
127                 $ids = implode('\',\'', $ids);
128                 $r = $this->db->select("`id` IN ('$ids')", '*', '', '', '', 'id');
129                 if (!empty($r)) 
130                 {
131                     foreach ($r as $k=>$v) 
132                     {
133                         if (isset($return[$k])) 
134                             $return[$k] = array_merge($v, $return[$k]); //主表中數(shù)據(jù)與副表中數(shù)據(jù)合并
135                     }
136                 }
137             }
138         }
139         return $return;  //返回查詢到的數(shù)據(jù)
140     }

復制代碼

注意:由以上分析可知,pc標簽內(nèi)部原理也是通過sql語句來獲取數(shù)據(jù)的。

另外,PC標簽分模塊來使用,內(nèi)容模塊PC標簽可用來完成如下功能:

(1)獲取內(nèi)容列表:lists 方法 (如上)

(2)獲取點擊排行榜:hits 方法 (詳細見文件content_tag.class.php)

(3)獲取相關文章:relation 方法 (詳細見文件content_tag.class.php)

(4)獲取欄目列表:category 方法 (詳細見文件content_tag.class.php)

第七、content_model類。文件路徑:phpcms/model/content_model.class.php

復制代碼

 1 /**
 2  * 內(nèi)容模型數(shù)據(jù)庫操作類
 3  */
 4 pc_base::load_sys_class('model', '', 0);
 5 class content_model extends model 
 6 {
 7     public $table_name = ''; // 數(shù)據(jù)庫表名
 8     public $category = ''; // 欄目
 9     public function __construct() 
10     {
11         $this->db_config = pc_base::load_config('database');  //加載數(shù)據(jù)庫配置信息
12         $this->db_setting = 'default'; // 加載數(shù)據(jù)庫默認的配置信息
13         parent::__construct();  // 調(diào)用父類的構造函數(shù)
14         $this->url = pc_base::load_app_class('url', 'content');
15         $this->siteid = get_siteid(); //獲取當前站點id
16     }
17     public function set_model($modelid)
18     {
19         //獲取所有模型的配置信息  1-文檔模型 2-下載模型 3-圖片模型  跟后臺設置有關
20         $this->model = getcache('model', 'commons');
21         //當前模型id
22         $this->modelid = $modelid;
23         //模型所對應的數(shù)據(jù)表(文檔模型->news  圖片模型->picture 下載模型->download) 
24         $this->table_name = $this->db_tablepre.$this->model[$modelid]['tablename'];
25         $this->model_tablename = $this->model[$modelid]['tablename'];
26     }

復制代碼

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1137572.htmlTechArticlephpcms V9 首頁模板文件解析(轉(zhuǎn)), 轉(zhuǎn)自:http://www.cnblogs.com/Braveliu/p/5100018.html 轉(zhuǎn)在了解了《phpcms V9 URL訪問解析》之后,我們已經(jīng)知道首頁最...
Erkl?rung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Hei?e KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?e Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was tun, wenn der Fehlercode 0x80004005 angezeigt wird? Der Editor zeigt Ihnen, wie Sie den Fehlercode 0x80004005 beheben k?nnen. Was tun, wenn der Fehlercode 0x80004005 angezeigt wird? Der Editor zeigt Ihnen, wie Sie den Fehlercode 0x80004005 beheben k?nnen. Mar 21, 2024 pm 09:17 PM

Wenn Sie einen Ordner auf Ihrem Computer l?schen oder dekomprimieren, wird manchmal das Dialogfeld ?Fehler 0x80004005: Nicht spezifizierter Fehler“ angezeigt. Wie k?nnen Sie diese Situation l?sen? Es gibt tats?chlich viele Gründe, warum der Fehlercode 0x80004005 angezeigt wird, aber die meisten davon werden durch Viren verursacht. Wir k?nnen die DLL erneut registrieren, um das Problem zu l?sen. Nachfolgend erkl?rt Ihnen der Editor die Erfahrung beim Umgang mit dem Fehlercode 0x80004005 . Einige Benutzer erhalten bei der Verwendung ihres Computers den Fehlercode 0X80004005. Der Fehler 0x80004005 wird haupts?chlich dadurch verursacht, dass der Computer bestimmte Dynamic Link Library-Dateien nicht korrekt registriert oder dass eine Firewall keine HTTPS-Verbindungen zwischen dem Computer und dem Internet zul?sst. Wie w?re es also?

Vollst?ndige Analyse des Umbenennungsvorgangs der Go-Sprachdatei Vollst?ndige Analyse des Umbenennungsvorgangs der Go-Sprachdatei Apr 08, 2024 pm 03:30 PM

Die Funktion os.Rename wird in der Go-Sprache zum Umbenennen von Dateien verwendet. Die Syntax lautet: funcRename(oldpath,newpathstring)error. Diese Funktion benennt die durch oldpath angegebene Datei in die durch newpath angegebene Datei um. Beispiele hierfür sind einfaches Umbenennen, das Verschieben von Dateien in andere Verzeichnisse und das Ignorieren der Fehlerbehandlung. Die Umbenennungsfunktion führt einen atomaren Vorgang aus und aktualisiert m?glicherweise Verzeichniseintr?ge nur, wenn sich die beiden Dateien im selben Verzeichnis befinden. Umbenennungen k?nnen auf allen Volumes fehlschlagen oder w?hrend eine Datei verwendet wird.

Wie implementiert man HTTP-Streaming mit C++? Wie implementiert man HTTP-Streaming mit C++? May 31, 2024 am 11:06 AM

Wie implementiert man HTTP-Streaming in C++? Erstellen Sie einen SSL-Stream-Socket mit Boost.Asio und der asiohttps-Clientbibliothek. Stellen Sie eine Verbindung zum Server her und senden Sie eine HTTP-Anfrage. Empfangen Sie HTTP-Antwortheader und drucken Sie sie aus. Empf?ngt den HTTP-Antworttext und gibt ihn aus.

Welches Framework ist phpcms? Welches Framework ist phpcms? Apr 20, 2024 pm 10:51 PM

PHP CMS ist ein PHP-basiertes Open-Source-Content-Management-System zur Verwaltung von Website-Inhalten. Zu seinen Merkmalen geh?ren Benutzerfreundlichkeit, leistungsstarke Funktionalit?t, Skalierbarkeit, hohe Sicherheit und kostenloses Open Source. Es kann Zeit sparen, die Website-Qualit?t verbessern, die Zusammenarbeit verbessern und Entwicklungskosten senken und wird h?ufig auf verschiedenen Websites wie Nachrichten-Websites, Blogs, Unternehmenswebsites, E-Commerce-Websites und Community-Foren verwendet.

Analyse der Bedeutung und Verwendung von Midpoint in PHP Analyse der Bedeutung und Verwendung von Midpoint in PHP Mar 27, 2024 pm 08:57 PM

[Analyse der Bedeutung und Verwendung von Mittelpunkt in PHP] In PHP ist Mittelpunkt (.) ein h?ufig verwendeter Operator, der zum Verbinden zweier Zeichenfolgen oder Eigenschaften oder Methoden von Objekten verwendet wird. In diesem Artikel befassen wir uns eingehend mit der Bedeutung und Verwendung von Mittelpunkten in PHP und veranschaulichen sie anhand konkreter Codebeispiele. 1. String-Mittelpunkt-Operator verbinden Die h?ufigste Verwendung in PHP ist das Verbinden zweier Strings. Indem Sie . zwischen zwei Saiten platzieren, k?nnen Sie diese zu einer neuen Saite zusammenfügen. $string1=&qu

Auswirkungen der C++-Vorlagenspezialisierung auf das überladen und Umschreiben von Funktionen Auswirkungen der C++-Vorlagenspezialisierung auf das überladen und Umschreiben von Funktionen Apr 20, 2024 am 09:09 AM

Spezialisierungen von C++-Vorlagen wirken sich auf das überladen und Umschreiben von Funktionen aus: Funktionsüberladung: Spezialisierte Versionen k?nnen unterschiedliche Implementierungen eines bestimmten Typs bereitstellen und sich somit auf die Funktionen auswirken, die der Compiler aufruft. Funktionsüberschreibung: Die spezialisierte Version in der abgeleiteten Klasse überschreibt die Vorlagenfunktion in der Basisklasse und beeinflusst das Verhalten des abgeleiteten Klassenobjekts beim Aufruf der Funktion.

Was sind die h?ufigsten Anwendungen von C++-Vorlagen in der tats?chlichen Entwicklung? Was sind die h?ufigsten Anwendungen von C++-Vorlagen in der tats?chlichen Entwicklung? Jun 05, 2024 pm 05:09 PM

C++-Vorlagen werden in der tats?chlichen Entwicklung h?ufig verwendet, einschlie?lich Containerklassenvorlagen, Algorithmusvorlagen, generischen Funktionsvorlagen und Metaprogrammierungsvorlagen. Beispielsweise kann ein generischer Sortieralgorithmus Arrays verschiedener Datentypen sortieren.

WeChat Login-Integrationsleitfaden: PHPCMS Practical Combat WeChat Login-Integrationsleitfaden: PHPCMS Practical Combat Mar 29, 2024 am 09:18 AM

Titel: WeChat Login-Integrationsleitfaden: PHPCMS in Aktion Im heutigen Internetzeitalter ist Social Login zu einer der wesentlichen Funktionen einer Website geworden. Als eine der beliebtesten sozialen Plattformen in China wird die Login-Funktion von WeChat auch von immer mehr Websites genutzt. In diesem Artikel wird erl?utert, wie die WeChat-Anmeldefunktion in die PHPCMS-Website integriert wird, und es werden spezifische Codebeispiele bereitgestellt. Schritt 1: Registrieren Sie ein WeChat Open Platform-Konto. Zuerst müssen wir ein Entwicklerkonto auf der WeChat Open Platform registrieren und die entsprechenden Entwicklungsberechtigungen beantragen. Anmelden [Offene WeChat-Plattform]

See all articles