【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;
		}
	}
}
?>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值