phpcms-v9,index.php文件分析-前台首页模板文件的解析过程分析
发布:smiling 来源: PHP粉丝网 添加日期:2014-10-21 22:46:19 浏览: 评论:0
- /**
- * 解析PC标签
- * @param string $op 操作方式
- * @param string $data 参数
- * @param string $html 匹配到的所有的HTML代码
- */
- public static function pc_tag($op, $data, $html) {
- preg_match_all("/([a-z]+)\=[\"]?([^\"]+)[\"]?/i", stripslashes($data), $matches, PREG_SET_ORDER);
- $arr = array('action','num','cache','page', 'pagesize', 'urlrule', 'return', 'start');
- $tools = array('json', 'xml', 'block', 'get');
- $datas = array();
- $tag_id = md5(stripslashes($html));
- //可视化条件
- $str_datas = 'op='.$op.'&tag_md5='.$tag_id;
- foreach ($matches as $v) {
- $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]));
- if(in_array($v[1], $arr)) {
- $$v[1] = $v[2];//如果pc标签中参数在默认参数数组$arr中存在,则将参数转换为变量,如:$page=value等
- continue;
- }
- $datas[$v[1]] = $v[2];//如果pc标签中参数不在默认参数数组$arr中存在,则直接将其放置到$datas[参数名]=value中
- }
- $str = '';
- $num = isset($num) && intval($num) ? intval($num) : 20;
- $cache = isset($cache) && intval($cache) ? intval($cache) : 0;
- $return = isset($return) && trim($return) ? trim($return) : 'data';
- if (!isset($urlrule)) $urlrule = '';
- if (!emptyempty($cache) && !isset($page)) {
- $str .= '$tag_cache_name = md5(implode(\'&\','.self::arr_to_html($datas).').\''.$tag_id.'\');if(!$'.$return.' = tpl_cache($tag_cache_name,'.$cache.')){';
- }
- if (in_array($op,$tools)) {//pc标签分两大类:工具类和模块类 工具类执行如下代码
- switch ($op) {
- case 'json':
- if (isset($datas['url']) && !emptyempty($datas['url'])) {
- $str .= '$json = @file_get_contents(\''.$datas['url'].'\');';
- $str .= '$'.$return.' = json_decode($json, true);';
- }
- break;
- case 'xml':
- $str .= '$xml = pc_base::load_sys_class(\'xml\');';
- $str .= '$xml_data = @file_get_contents(\''.$datas['url'].'\');';
- $str .= '$'.$return.' = $xml->xml_unserialize($xml_data);';
- break;
- case 'get':
- $str .= 'pc_base::load_sys_class("get_model", "model", 0);';
- if ($datas['dbsource']) {
- $dbsource = getcache('dbsource', 'commons');
- if (isset($dbsource[$datas['dbsource']])) {
- $str .= '$get_db = new get_model('.var_export($dbsource,true).', \''.$datas['dbsource'].'\');';
- } else {
- return false;
- }
- } else {
- $str .= '$get_db = new get_model();';
- }
- $num = isset($num) && intval($num) > 0 ? intval($num) : 20;
- if (isset($start) && intval($start)) {
- $limit = intval($start).','.$num;
- } else {
- $limit = $num;
- }
- if (isset($page)) {
- $str .= '$pagesize = '.$num.';';
- $str .= '$page = intval('.$page.') ? intval('.$page.') : 1;if($page<=0){$page=1;}';
- $str .= '$offset = ($page - 1) * $pagesize;';
- $limit = '$offset,$pagesize';
- if ($sql = preg_replace('/select([^from].*)from/i', "SELECT COUNT(*) as count FROM ", $datas['sql'])) {
- $str .= '$r = $get_db->sql_query("'.$sql.'");$s = $get_db->fetch_next();$pages=pages($s[\'count\'], $page, $pagesize, $urlrule);';
- }
- }
- $str .= '$r = $get_db->sql_query("'.$datas['sql'].' LIMIT '.$limit.'");while(($s = $get_db->fetch_next()) != false) {$a[] = $s;}$'.$return.' = $a;unset($a);';
- break;
- case 'block':
- $str .= '$block_tag = pc_base::load_app_class(\'block_tag\', \'block\');';
- $str .= 'echo $block_tag->pc_tag('.self::arr_to_html($datas).');';
- break;
- }
- } else {//pc标签分两大类:工具类和模块类 模块类执行如下代码
- if (!isset($action) || emptyempty($action)) return false;
- //content模块:phpcms/modules/content/classes/content_tag.class.php
- if (module_exists($op) && file_exists(PC_PATH.DIRECTORY_SEPARATOR.'modules'.DIRECTORY_SEPARATOR.$op.DIRECTORY_SEPARATOR.'classes'.DIRECTORY_SEPARATOR.$op.'_tag.class.php')) {
- //content_tag.class.php 检查content_tag类中是否存在的某方法
- $str .= '$'.$op.'_tag = pc_base::load_app_class("'.$op.'_tag", "'.$op.'");if (method_exists($'.$op.'_tag, \''.$action.'\')) {';
- if (isset($start) && intval($start)) {
- $datas['limit'] = intval($start).','.$num;//如:limit 0 , 10
- } else {
- $datas['limit'] = $num; //如:limit 10
- }
- if (isset($page)) {//分页参数
- $str .= '$pagesize = '.$num.';';//每页显示数据量
- $str .= '$page = intval('.$page.') ? intval('.$page.') : 1;if($page<=0){$page=1;}';//当前页码
- $str .= '$offset = ($page - 1) * $pagesize;';//要查询数据的开始位置
- $datas['limit'] = '$offset.",".$pagesize';
- $datas['action'] = $action;//方法,如,content_tag.class.php中的lists方法
- $str .= '$'.$op.'_total = $'.$op.'_tag->count('.self::arr_to_html($datas).');';//分页方法
- $str .= '$pages = pages($'.$op.'_total, $page, $pagesize, $urlrule);';
- }
- $str .= '$'.$return.' = $'.$op.'_tag->'.$action.'('.self::arr_to_html($datas).');';//查看第七步:content_tag.class.php中方法
- $str .= '}';
- }
- }
- if (!emptyempty($cache) && !isset($page)) {
- $str .= 'if(!empty($'.$return.')){setcache($tag_cache_name, $'.$return.', \'tpl_data\');}';
- $str .= '}';
- }
- /**
- * 解析结果大概如下所示:
- <?php
- if(defined('IN_ADMIN') && !defined('HTML')) {
- 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\">
- <a href=\"javascript:void(0)\" class=\"admin_piao_edit\">编辑</a>";
- }
- $content_tag = pc_base::load_app_class("content_tag", "content");
- if (method_exists($content_tag, 'position')) {
- $data = $content_tag->position(array('posid'=>'12','thumb'=>'1','order'=>'listorder DESC','limit'=>'10',));
- }
- ?>
- */
- 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."?".">";
- }
第七步:pc标签类,路径:phpcms/modules/content/classes/content_tag.class.php,代码如下:
- private $db;
- public function __construct() {
- $this->db = pc_base::load_model('content_model');//查看第八步:数据模型,对应数据表news 和 news_data
- $this->position = pc_base::load_model('position_data_model');//数据模型
- }
- /**
- * 初始化模型
- * @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);//查看第八步
- $this->tablename = $this->db->table_name;//数据表名
- if(emptyempty($this->category)) {//当前站点id下所有栏目的配置信息
- return false;
- } else {
- return true;
- }
- }
- /**
- * 列表页标签
- * @param $data
- */
- public function lists($data) {
- $catid = intval($data['catid']);
- if(!$this->set_modelid($catid)) return false;
- if(isset($data['where'])) {//如果pc标签中设置了条件
- $sql = $data['where'];//pc标签中的条件
- } else {//如果pc标签中没有设置条件
- $thumb = intval($data['thumb']) ? " AND thumb != ''" : '';
- 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)".$thumb;
- } else {
- $sql = "status=99 AND catid='$catid'".$thumb;
- }
- }
- $order = $data['order'];//pc标签中排序字段
- $return = $this->db->select($sql, '*', $data['limit'], $order, '', 'id');//从数据库中获取主表数据,使用的也是sql语句查询
- //调用副表的数据
- if (isset($data['moreinfo']) && intval($data['moreinfo']) == 1) {
- $ids = array();
- foreach ($return as $v) {
- if (isset($v['id']) && !emptyempty($v['id'])) {
- $ids[] = $v['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) {
- if (isset($return[$k])) $return[$k] = array_merge($v, $return[$k]);//主表中数据与副表中数据合并
- }
- }
- }
- }
- return $return;//返回查询到的数据
- }
第八步:content_model类,路径:phpcms/model/content_model.class.php,代码如下:
- public $table_name = '';//数据库表名
- public $category = '';
- public function __construct() {
- $this->db_config = pc_base::load_config('database');//加载数据库配置信息
- $this->db_setting = 'default';//加载数据库默认的配置信息
- parent::__construct();
- $this->url = pc_base::load_app_class('url', 'content');
- $this->siteid = get_siteid();//得到当前站点id
- } //phpfensi.com
- public function set_model($modelid) {
- $this->model = getcache('model', 'commons');//获取所有模型的配置信息 1-文档模型 2-下载模型 3-图片模型 跟后台设置有关
- $this->modelid = $modelid;//当前模型id
- $this->table_name = $this->db_tablepre.$this->model[$modelid]['tablename'];//模型所对应的数据表 文档模型-news 图片模型-picture 下载模型-download
- $this->model_tablename = $this->model[$modelid]['tablename'];
- }
总结:pc标签内部机制也是通过sql语句来返回数据的.
Tags: phpcms首页模板 phpcms文件解析
- 上一篇:phpcms自定义分页样式
- 下一篇:phpcms 学习之路
相关文章
- ·【phpcms-v9】index.php文件分析-前台首页模板文件的解析过程(2014-10-22)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)