<?php
/**
  * @class 视图基类
  */
class action
{
	protected $mod = null;
	/* 模板变量集合 */
	protected static $setArr = [];
	/* 错误代码集合 */
	public static $error = [];

	public function __construct()
	{
		$this->error = [
			1000=>'出现未知错误',
			1001=>'数据类型有误',
			1002=>'不存在',
			1003=>'读失败',
			1004=>'写失败',
			2000=>'执行数据库操作失败',
			2001=>'提交的数据检验失败',
			2002=>'出现重复的记录',
			2003=>'超出范围',
			2004=>'数据约束',
		];
	}

	/** 
	  * @method tpl模板赋值
	  */
	public function set($key, $value = null) 
	{
		self::$setArr[$key] = $value;
	}
	
	/**
	  * @method tpl模板输出
	  * @param  $tplFile  模板名称
	  * @param  $tplPath  模板目录[默认mvc::$cfg['PATH_TPL']]
	  */
	public function put($tplFile='', $tplPath = null)
	{
        /* 当参数为空时，取默认的 action/method.php 模板路径 */
        if(empty($tplFile)){
            if(!empty(mvc::$URL_CLASS_PATH)) $tplFile = mvc::$URL_CLASS_PATH . '/';
            $tplFile .= mvc::$URL_CLASS .'/'. mvc::$URL_METHOD . '.php';
        }else{
            if(strpos($tplFile,'.')===false) $tplFile .= '.php';
        }
		foreach(self::$setArr as $key=>$value)
		{
			$$key = $value;
		}
		$tplFile = mvc::$cfg['PATH_TPL'] . $tplFile;
		require($tplFile);
	}
	/**
	  * @method 输出json
	  * @param [int] $type  0:成功,data为数, >0时为:失败代码,data为错误信息
	  * @param [array|string] $data 
	  * @return  SQL where 语句
	  */
	function echoJson($code,$data=''){
		if(mvc::$cfg['DEBUG']==false) ob_end_clean ();		
		$result = ['code'=>$code,'data'=>[],'msg'=>''];
		if($code==0) 
			$result['data'] = $data;
		else{
			if($data!='') $data = ': '.$data;
			$result['msg'] = (isset($this->error[$code])) ? $this->error[$code].$data : $this->error[1000].$data;
		}
		echo json_encode($result, JSON_UNESCAPED_UNICODE);
	}
	/**
	  * @method 输出json并终止程序
	  */
	function exitJson($code,$data=''){
		$this->echoJson($code,$data);
		exit();
	}
	/**
	  * @method 组装jqGrid查询SQL
	  * @param  $groups  提交的条件
	  * @param  $replaceFunction  自定义替换值函数 function($field,$op,$value)
	  * @return  SQL where 语句
	  */
	function groups2sql($groups,$replaceFunction=null){
		$where = '';
		$rulesWhere = '';
		$groupsWhere = '';
		$rulesCount = $groups['rules'] ? count($groups['rules']) : 0;
		$groupsCount = $groups['groups'] ?  count($groups['groups']) : 0;
		if($rulesCount==0 && $groupsCount==0) 
			return '';
		if($rulesCount) 
			$where = $this->rules2sql($groups['rules'], $groups['groupOp'],$replaceFunction);
		if($groupsCount){
			$arr = [];
			foreach($groups['groups'] as $group){
					$arr[] = '('.$this->groups2sql($group,$replaceFunction).')';
			}
			$groupsWhere .= implode(' '.$groups['groupOp'].' ',$arr);
		}
		if($groupsWhere){
			if($where=='')
				$where =  $groupsWhere;
			else
				$where .= ' '.$groups['groupOp'] .' '. $groupsWhere;
		}
		return $where;
	}
	function rules2sql($rules,$groupOp,$replaceFunction){
		$op = ["eq"=>"='%s'","ne"=>"<>'%s'","le"=>"<='%s'","lt"=>"<'%s'","gt"=>">'%s'","ge"=>">='%s'","cn"=>"like '%%%s%%'","nc"=>"not like'%%%s%%'","nu"=>"=''","nn"=>"<>''"];
		$arr=[];
		foreach($rules as $rule){
			$rule['data'] = trim($rule['data']);
			if($replaceFunction) {
				$back = $replaceFunction($rule['field'],$rule['op'],$rule['data']);
				$rule['field'] = $back['field'];
				$rule['op'] = $back['op'];
				$rule['data'] = $back['data'];
			}
			if($rule['op']=='cn'){
				if(strpos($rule['data'],'*')!=false || strpos($rule['data'],'?')!=false){
					$rule['data'] = str_replace('*','%',$rule['data']);
					$rule['data'] = str_replace('?','_',$rule['data']);
					$arr[] = $rule['field'] .' '. sprintf("like '%s'", $rule['data']);
				}else{
					$arr[] = $rule['field'] .' '. sprintf($op[$rule['op']], $rule['data']);
				}
			}else if($rule['op']=='nc'){
				if(strpos($rule['data'],'*')!=false || strpos($rule['data'],'?')!=false){
					$rule['data'] = str_replace('*','%',$rule['data']);
					$rule['data'] = str_replace('?','_',$rule['data']);
					$arr[] = $rule['field'] .' '. sprintf("not like '%s'", $rule['data']);
				}else{
					$arr[] = $rule['field'] .' '. sprintf($op[$rule['op']], $rule['data']);
				}
			}else if($rule['op']=='nu'){
				$arr[] = sprintf("(%s='' or %s is null)",$rule['field'],$rule['field']); 
			}else if($rule['op']=='in'){
				$arr[] = sprintf("%s IN (%s)",$rule['field'],$rule['data']); 
			}else{
				if($rule['data']!='' || $rule['op']=='nn')
					$arr[] = $rule['field'] .' '. sprintf($op[$rule['op']],$rule['data']);
			}
		}
		if(count($arr)>0)
			$where = implode(' '.$groupOp.' ',$arr);
		return $where;
	}
}

