龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

控制器基类

时间:2014-07-22 14:48来源: 作者: 点击:
分享到:
非常简单实用的控制器基类
非常简单实用的控制器基类
<?php 
/**
 * @desc 控制器基类
 * @date 2013-05-06
 * @author liudesheng
 */
defined('SYS_PATH') || die('访问非法');
class controller
{
	//当前控制器
	protected $_controller;
	//当前动作方法
	protected $_action;
	//权限数组
	protected $_permissions;
	//模板文件
	private $_layout = 'layout';

	//构造函数
	function __construct($controller,$action)
	{
		if('exception' != $controller){
			$this->_controller = $controller;
			$this->_action = $action;
			
			//登录检查和访问权限控制部分,登录页不需要验证
			$trust_action = util::c('trust_action');
			if(!isset($trust_action[$this->_controller]) || !in_array($this->_action,$trust_action[$this->_controller])){
				$this->login();
				//$this->privilege();
			}
			$this->init();
		}else{//异常处理
			$this->exception($action);
		}
	}
	
	//初始化方法,用于继承操作
	protected function init(){}
	
	//异常处理方法
	private function exception($msg)
	{
		$this->showErr($msg,$layout);
	}
	
	//验证登录
	private function login()
	{
		if(!$this->isLogin()){
			if($this->isAjax()){
				header('HTTP/1.1 403 Forbidden');
			    header("Error-Json:{code:'login'}"); 
			    exit();
			}else{
			    $this->redirect('index','login');
			}
		}
	}
	
	//判断是否登录
	protected final function isLogin()
	{
		$auth = isset($_COOKIE['auth'])?$_COOKIE['auth']:'';
		$isLogin = false;
		if($auth){
			$info = trim(file_get_contents('check.txt'));
			if(strcmp($auth,md5('steve'.$info.util::c('login_auth_suffix'))) == 0){
				$isLogin = true;
			}
		}
		return $isLogin;
	}
	
	//验证权限
	private function privilege()
	{
		$this->getPermissions();
		if(!$this->isAllow()){
		    if($this->isAjax()){
				header('HTTP/1.1 403 Forbidden');
			    header(  "Error-Json:{code:'access'}"); 
			    exit();
			}else{
			    $this->showErr('对不起,您没有此权限');
			}
		}
	}
	
	//获取权限信息
	protected final function getPermissions()
	{
		$privilege = $this->admin['privilege'];
		$permissions_priv =  util::c('permissions',$privilege);
		if(!isset($permissions_priv['city'])){
			$this->cityPriv = 'all'; //为了简化列表查询,方便以后可能添加所有城市权限选择
		}else{
			unset($permissions_priv['city']);
		}
		foreach($permissions['common'] as $ct => $ac){
			if(isset($permissions_priv[$ct]) && 'all' == $permissions_priv[$ct])
				continue;
			if('all' == $ac)
				$permissions_priv[$ct] = 'all';
			else //这种情况必须是数组,节省资源,不做判断了
				$permissions_priv[$ct] = isset($permissions_priv[$ct])?array_merge($permissions_priv[$ct],$ac):$ac;
		}
		$this->_permissions = $permissions_priv;
	}
	
	//根据权限类型判断是否有权限
	protected final function isAllow($controller='',$action='')
	{
		if(!isset($this->_permissions))
		    $this->getPermissions();
		$allow = false;
		$ct = $controller?$controller:$this->_controller;
		$ac = $action?$action:$this->_action;
	    $permission_action = $this->_permissions[$ct];
		if($permission_action && ('all' == $permission_action || in_array($ac,$permission_action) || 'any' == $action))
			$allow = true;
		return $allow;
	}
	
	
	//错误信息页面
	protected function showErr($errMsg,$layout = null)
	{
		$this->title = "错误提示";
		$this->errMsg = $errMsg;
		$this->render('error',$layout);
	}
	
    //成功信息页面
	protected function showSucc($msg,$skipUrl,$skipPage,$layout = null)
	{
		$this->title = "成功提示";
		$this->msg = $msg;
		$this->skipUrl = $skipUrl;
		$this->skipPage = $skipPage;
		$this->render('success',$layout);
	}
	
	//显示有权限的链接
	protected function showPemissionLink($title,$ct,$ac,$param=array(),$wrap='')
	{
		if($wrap){
			$wrap_start = '<'.$wrap.'>';
			$wrap_end = '</'.$wrap.'>';
		}else{
			$wrap_start = $wrap_end = '';
		}
		if($this->isAllow($ct,$ac))
		    echo $wrap_start,'<a href="',$this->url($ct,$ac,$param),'" >',$title,'</a>',$wrap_end;
	}
	
	//视图解析方法
	protected function render($template = null,$layout = null)
	{
		!is_null($layout) && $this->_layout = $layout;
		!$template && $template = $this->_controller.'_'.$this->_action;
		ob_start();
		include(MODULE_PATH.'views/'.$this->_layout.'.tpl.php');
		$content = ob_get_clean();
		if($this->staticFile){
			file_put_contents($this->staticFile,$content);
		}
		echo $content;
		exit;
	}

	protected function showHtml($html,$expire=3600,$path='')
	{
         empty($path) && $path=ROOT_PATH;
		 $this->staticFile = sprintf('%s%s.html',$path,$html);
		 $mkhtml = intval($this->_G('mkhtml'));
		 if(!$mkhtml){
			 if(file_exists($this->staticFile)){
				 $fmtime = filemtime($this->staticFile);
				 if(time()-$fmtime < $expire && date('Ymd') == date('Ymd',$fmtime)){
					 include $this->staticFile;
					 exit;
				 }
			 }
		 }
	}
	
	//生成url
	protected function url($ct='',$ac='',$param = array(),$module='')
	{
		return $GLOBALS['app']->url($ct,$ac,$param,$module);
	}
	
	//url跳转
	protected function redirect($ct='',$ac='',$param = array())
	{
		header('location:'.$this->url($ct,$ac,$param));
		exit();
	}
	
   //url跳转
	protected function redirectUrl($url)
	{
		header('location:'.$url);
		exit();
	}
	
	//获取back redirect url
	protected function getBru()
	{
		return $_COOKIE[util::c('bru_cookie_name')]?$_COOKIE[util::c('bru_cookie_name')]:$this->url();
	}
	
	//是否是ajax请求
	protected function isAjax()
	{
		if(isset( $_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') 
			return true;
		return false;
	}
	
	//返回json数组
	protected function returnJson($data)
	{
		echo json_encode($data);
		exit();
	}
	
	//GET
	protected function _G($name)
	{
		return isset($_GET[$name])?util::sanitize($_GET[$name]):'';
	}
	//POST
	protected function _P($name)
	{
		if(!isset($_POST[$name]) || (is_string($_POST[$name]) && mb_strpos($_POST[$name],'请输入',0,'gbk') === 0)){
			return '';
		}else{
			return util::sanitize($_POST[$name]);
		}
	}
    //REQUEST
	protected function _R($name)
	{
		return isset($_REQUEST[$name])?util::sanitize($_REQUEST[$name]):'';
	}	
}
精彩图集

赞助商链接