• 【phpcms-v9】phpcms-v9数据源调用的控制器文件分析phpcms/modules/dbsource/call.php


    <?php
    defined('IN_PHPCMS') or exit('No permission resources.');
    class call  {
        private $db;
        public function __construct() {
            $this->db = pc_base::load_model('datacall_model');
        }
        
        /*
         * 数据源的调用:<script type="text/javascript" src="http://www.zhen.com/index.php?m=dbsource&c=call&a=get&id=2"></script>
         */
        public function get() {
            //数据源id:即zp_datacall数据表中自增id
            $id = isset($_GET['id']) && intval($_GET['id']) ? intval($_GET['id']) : exit();
            //获取当前数据源记录
            if ($data = $this->db->get_one(array('id'=>$id))) {
                //运算符的优先级搞清楚,1-先赋值  2-再进行非逻辑
                if (!$str = tpl_cache('dbsource_'.$id,$data['cache'])) {//如果没有生成缓存
                    if ($data['type'] == 1) { //自定义SQL调用
                        $get_db = pc_base::load_model("get_model");//不设置要查询的数据表,只执行查询操作
                        //拼接sql语句
                        $sql = $data['data'].(!empty($data['num']) ? " LIMIT $data[num]" : '');
                        $r= $get_db->query($sql);//执行查询sql语句,注意:sql语句中已经有表名
                        while(($s = $get_db->fetch_next()) != false) {//查询sql语句中的数据表
                            $str[] = $s;//将查询到的表记录置入$str[]二维数组
                        }
                    } else {//非自定义sql调用情况
                        //寻找对应模块下的xxx_tag.class.php文件
                        $filepath = PC_PATH.'modules'.DIRECTORY_SEPARATOR.$data['module'].DIRECTORY_SEPARATOR.'classes'.DIRECTORY_SEPARATOR.$data['module'].'_tag.class.php';
                        if (file_exists($filepath)) {
                            //如果存在,则引入pc标签类库文件
                            $pc_tag = pc_base::load_app_class($data['module'].'_tag', $data['module']);
                            //调用方法
                            if (!method_exists($pc_tag, $data['action'])) {
                                exit();
                            }
                            $sql = string2array($data['data']);//sql语句,如:select * from zp_block
                            $sql['action'] = $data['action'];//方法
                            $sql['limit'] = $data['num'];//数量
                            unset($data['num']);
                            $str  = $pc_tag->$data['action']($sql);
                            
                        } else {
                            exit();
                        }
                    }
                    //如果缓存时间不为空,则缓存到caches/caches_template/dbsource/$id.php文件中
                    //缓存的是编译后的文件
                    if ($data['cache']) setcache('dbsource_'.$id, $str, 'tpl_data');
                }//没生成缓存的情况
                echo $this->_format($data['id'], $str, $data['dis_type']);//参数3-输出方法(1-json 2-xml 3-js)
            }
        }
        
        private function _format($id, $data, $type) {
            switch($type) {
                case '1'://json
                    if (CHARSET == 'gbk') {
                        $data = array_iconv($data, 'gbk', 'utf-8');
                    }
                    return json_encode($data);//将数据json化,再输出
                    break;
                    
                case '2'://xml
                    $xml = pc_base::load_sys_class('xml');
                    return $xml->xml_serialize($data);//将数据xml化,再输出
                    break;
                    
                case '3'://js      js的情况没有使用到$data参数数据
                    pc_base::load_app_func('global');//引入global.func.php公共函数库文件
                    ob_start();//开启缓冲区
                    include template_url($id);//生成缓存文件,应引入缓存文件中内容(编译后的内容),此函数主要用来编译template字段到缓存文件
                    $html = ob_get_contents();//获取缓冲区中内容
                    ob_clean();//清空缓存区
                    return format_js($html);//将文本格式成适合js输出的字符串,注意:此函数主要通过 通过document.write()动态将编译后的代码输出到网页中
                    break;
            }
        }
    }
    ?>

  • 相关阅读:
    第一次开发分享的经验教训
    开发人员的 Linux 命令学习清单
    代码质量基本准则
    职业发展思考(二)
    软件调试的基本技巧
    多数据源的动态配置与加载使用兼框架交互的问题调试
    对象与并发:概述
    编程模式: 回调
    创新式开发探索(一) —— 开篇
    Linux 命令学习示例: tr
  • 原文地址:https://www.cnblogs.com/gzmg/p/3224692.html
Copyright © 2020-2023  润新知