您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息

phpcms V9 首页模板文件解析(转),_PHP教程

2024/4/26 3:47:35发布6次查看
phpcms v9 首页模板文件解析(转),转自:http://www.cnblogs.com/braveliu/p/5100018.html
转在了解了《phpcms v9 url访问解析》之后,我们已经知道首页最终执行的是content模块下index控制器的init方法。
下面, 我们逐步分析过程如下:
第一、首页默认执行的是index.php?m=content&c=index&a=init
如下代码(路径:phpcms\modules\content\index.php),先从init函数分析:
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 函数intval作用变量转成整数类型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 搜索引擎优化信息28 $seo = seo($siteid); //调用第二步,获取当前站点当前栏目下生成的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); //调用第三步:模板调用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() 函数剥去字符串中的 html、xml 以及 php 的标签。13 if (!empty($description)) 14 $description = strip_tags($description); //过滤description15 if (!empty($keyword)) 16 $keyword = str_replace(' ', ',', strip_tags($keyword)); //过滤keyword17 $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=>站点id23 $siteid = $siteids[$catid]; //当前栏目对应的站点id24 $categorys = getcache('category_content_'.$siteid,'commons'); //获取当前站点下所有栏目的详细配置信息25 $cat = $categorys[$catid]; //当前站点下当前栏目的详细配置信息 26 $cat['setting'] = string2array($cat['setting']); //当前站点当前栏目详细配置信息的setting设置信息,转化为数组27 }28 //站点title29 $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信息中\n和\r替换为空39 }40 return $seo; //返回seo数组信息41 }
第三、模板调用:phpcms/libs/functions/global.func.php
1 /** 2 * 模板调用 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字符,这里进行了对插件模板的判断,插件模板需要调用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.php48 $template_cache = pc_base::load_sys_class('template_cache');49 //编译文件缓存路径:根目录/caches/caches_template/default/content/index.php50 $compiledtplfile = phpcms_path.'caches'.directory_separator.'caches_template'.directory_separator.$style.directory_separator.$module.directory_separator.$template.'.php';51 //首页模板文件,如文件路径:phpcms/templates/dafault/content/index.html52 if(file_exists(pc_path.'templates'.directory_separator.$style.directory_separator.$module.directory_separator.$template.'.html')) 53 {54 //如果编译文件不存在或者说模板文件的创建时间大于编译文件的生成时间,则重新编译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); //调用第四步:适用模板风格不是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 //如果编译文件不存在或者说前台公共的模板文件存在,并且前台公共模板文件的创建时间大于编译文件的生成时间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 unknown14 */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 //获取公共模板文件中的内容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 //如果目录不存在,则层级创建所有目录51 mkdir($filepath, 0777, true);52 }53 //编译文件的全路径54 $compiledtplfile = $filepath.$template.'.php';55 //解析公共模板文件中的内容及标签,并返回解析后的内容 56 $content = $this->template_parse($content); // 调用下一个过程57 //将解析后的公共模板文件内容写入到要生成的编译文件中58 $strlen = file_put_contents ( $compiledtplfile, $content );59 //给生成的编译文件设置权限60 chmod ( $compiledtplfile, 0777 );61 //返回写入编译文件的字节数62 return $strlen;63 }64 65 /**66 * 解析模板67 *68 * @param $str 模板内容69 * @return ture70 */71 public function template_parse($str) {72 $str = preg_replace ( /\{template\s+(.+)\}/, , $str );73 $str = preg_replace ( /\{include\s+(.+)\}/, , $str );74 $str = preg_replace ( /\{php\s+(.+)\}/, , $str );75 $str = preg_replace ( /\{if\s+(.+?)\}/, , $str );76 $str = preg_replace ( /\{else\}/, , $str );77 $str = preg_replace ( /\{elseif\s+(.+?)\}/, , $str );78 $str = preg_replace ( /\{\/if\}/, , $str );79 //for 循环80 $str = preg_replace(/\{for\s+(.+?)\}/,,$str);81 $str = preg_replace(/\{\/for\}/,,$str);82 //++ --83 $str = preg_replace(/\{\+\+(.+?)\}/,,$str);84 $str = preg_replace(/\{\-\-(.+?)\}/,,$str);85 $str = preg_replace(/\{(.+?)\+\+\}/,,$str);86 $str = preg_replace(/\{(.+?)\-\-\}/,,$str);87 $str = preg_replace ( /\{loop\s+(\s+)\s+(\s+)\}/, , $str );88 $str = preg_replace ( /\{loop\s+(\s+)\s+(\s+)\s+(\s+)\}/, \\3) { ?>, $str );89 $str = preg_replace ( /\{\/loop\}/, , $str );90 $str = preg_replace ( /\{([a-za-z_\x7f-\xff][a-za-z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/, , $str );91 $str = preg_replace ( /\{\\$([a-za-z_\x7f-\xff][a-za-z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/, , $str );92 $str = preg_replace ( /\{(\\$[a-za-z_\x7f-\xff][a-za-z0-9_\x7f-\xff]*)\}/, , $str );93 $str = preg_replace(/\{(\\$[a-za-z0-9_\[\]\'\\$\x7f-\xff]+)\}/es, \$this->addquote(''),$str);94 $str = preg_replace ( /\{([a-z_\x7f-\xff][a-z0-9_\x7f-\xff]*)\}/s, , $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 = . $str;98 return $str;99 }
第五、pc标签的解析:phpcms/libs/classes/template_cache.class.php 文件
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 { 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标签中参数在默认参数数组$arr中存在,则将参数转换为变量,如:$page=value等 22 continue; 23 } 24 $datas[$v[1]] = $v[2];//如果pc标签中参数不在默认参数数组$arr中存在,则直接将其放置到$datas[参数名]=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标签分两大类:工具类和模块类。工具类执行如下代码 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($pagesql_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标签分两大类:工具类和模块类。模块类执行如下代码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 , 10111 } 112 else 113 {114 $datas['limit'] = $num; //如:limit 10115 }116 if (isset($page)) //分页参数117 {118 $str .= '$pagesize = '.$num.';'; //每页显示数据量119 $str .= '$page = intval('.$page.') ? intval('.$page.') : 1;if($pagecount('.self::arr_to_html($datas).');';//分页方法124 $str .= '$pages = pages($'.$op.'_total, $page, $pagesize, $urlrule);';125 }126 //调用第七步: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 position(array('posid'=>'12','thumb'=>'1','order'=>'listorder desc','limit'=>'10',)); 148 }149 ?>150 */151 return ;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'); //调用第七步,数据模型,对应数据表为news和news_data 7 $this->position = pc_base::load_model('position_data_model'); //数据模型 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; //如果不为内部栏目,返回false 0-内部栏目 1-单网页 2-外部链接 31 $this->modelid = $this->category[$catid]['modelid']; //获取当前栏目所属模型id 32 $this->db->set_model($this->modelid); //调用第七步 33 $this->tablename = $this->db->table_name; //数据表名 34 if(empty($this->category)) 35 { 36 //当前站点id下所有栏目的配置信息 37 return false; 38 } 39 else 40 { 41 return true; 42 } 43 } 44 /** 45 * 分页统计 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 //从数据库中获取主表数据,使用的也是sql语句查询107 $return = $this->db->select($sql, '*', $data['limit'], $order, '', 'id');108 109 //调用副表的数据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 else120 {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]); //主表中数据与副表中数据合并135 }136 }137 }138 }139 return $return; //返回查询到的数据140 }
注意:由以上分析可知,pc标签内部原理也是通过sql语句来获取数据的。
另外,pc标签分模块来使用,内容模块pc标签可用来完成如下功能:
(1)获取内容列表: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 * 内容模型数据库操作类 3 */ 4 pc_base::load_sys_class('model', '', 0); 5 class content_model extends model 6 { 7 public $table_name = ''; // 数据库表名 8 public $category = ''; // 栏目 9 public function __construct() 10 {11 $this->db_config = pc_base::load_config('database'); //加载数据库配置信息12 $this->db_setting = 'default'; // 加载数据库默认的配置信息13 parent::__construct(); // 调用父类的构造函数14 $this->url = pc_base::load_app_class('url', 'content');15 $this->siteid = get_siteid(); //获取当前站点id16 }17 public function set_model($modelid)18 {19 //获取所有模型的配置信息 1-文档模型 2-下载模型 3-图片模型 跟后台设置有关20 $this->model = getcache('model', 'commons');21 //当前模型id22 $this->modelid = $modelid;23 //模型所对应的数据表(文档模型->news 图片模型->picture 下载模型->download) 24 $this->table_name = $this->db_tablepre.$this->model[$modelid]['tablename'];25 $this->model_tablename = $this->model[$modelid]['tablename'];26 }
http://www.bkjia.com/phpjc/1137572.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/1137572.htmltecharticlephpcms v9 首页模板文件解析(转), 转自:http://www.cnblogs.com/braveliu/p/5100018.html 转在了解了《phpcms v9 url访问解析》之后,我们已经知道首页最...
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录