sugarcontroller.php

来自「SugarCRM5.1 开源PHP客户关系管理系统」· PHP 代码 · 共 780 行 · 第 1/2 页

PHP
780
字号
<?php/********************************************************************************* * SugarCRM is a customer relationship management program developed by * SugarCRM, Inc. Copyright (C) 2004 - 2007 SugarCRM Inc. *  * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 3 as published by the * Free Software Foundation with the addition of the following permission added * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. *  * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more * details. *  * You should have received a copy of the GNU General Public License along with * this program; if not, see http://www.gnu.org/licenses or write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. *  * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. *  * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU General Public License version 3. *  * In accordance with Section 7(b) of the GNU General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by * SugarCRM" logo. If the display of the logo is not reasonably feasible for * technical reasons, the Appropriate Legal Notices must display the words * "Powered by SugarCRM". * *******************************************************************************/require_once('include/MVC/View/SugarView.php');require_once('modules/Administration/updater_utils.php');class SugarController{	/**	 * remap actions in here 	 * e.g. make all detail views go to edit views	 * $action_remap = array('detailview'=>'editview');	 */	protected $action_remap = array('index'=>'listview');	/**	 * The name of the current module.	 */	public $module = 'Home';	/**	 * The name of the current action.	 */	public $action = 'index';	/**	 * The id of the current record.	 */	public $record = '';	/**	 * The name of the return module.	 */	public $return_module = null;	/**	 * The name of the return action.	 */	public $return_action = null;	/**	 * The id of the return record.	 */	public $return_id = null;	/**	 * If the action was remapped it will be set to do_action and then we will just 	 * use do_action for the actual action to perform.	 */	protected $do_action = 'index';	/**	 * If a bean is present that set it.	 */	public $bean = null;	/**	 * url to redirect to	 */	public $redirect_url = '';	/**	 * any subcontroller can modify this to change the view	 */	public $view = 'classic';	/**	 * this array will hold the mappings between a key and an object for use within the view.	 */	public $view_object_map = array();		/**	 * This array holds the methods that handleAction() will invoke, in sequence. 	 */	protected $tasks = array(					   'pre_action', 					   'do_action', 					   'post_action'					   );	/**	 * List of options to run through within the process() method.	 * This list is meant to easily allow additions for new functionality as well as	 * the ability to add a controller's own handling.	 */	public $process_tasks = array(						'blockFileAccess',						'handleEntryPoint',						'callLegacyCode',						'remapAction',						'handle_action',						'handleActionMaps',					);					/**	 * Whether or not the action has been handled by $process_tasks	 *	 * @var bool	 */	protected $_processed = false;	/**	 * Map an action directly to a file	 */	/**	 * Map an action directly to a file. This will be loaded from action_file_map.php	 */	protected $action_file_map = array();	/**	 * Map an action directly to a view	 */	/**	 * Map an action directly to a view. This will be loaded from action_view_map.php	 */	protected $action_view_map = array();		/**	 * This can be set from the application to tell us whether we have authorization to 	 * process the action. If this is set we will default to the noaccess view.	 */	public $hasAccess = true;		/**	 * Map case sensitive filenames to action.  This is used for linux/unix systems	 * where filenames are case sensitive	 */	public static $action_case_file = array(										'editview'=>'EditView', 										'detailview'=>'DetailView', 										'listview'=>'ListView'									  );		/**	 * Constructor. This ie meant tot load up the module, action, record as well	 * as the mapping arrays.	 */	function SugarController(){	}	/**	 * Called from SugarApplication and is meant to perform the setup operations	 * on the controller.	 *	 */	public function setup($module = ''){		if(empty($module) && !empty($_REQUEST['module']))			$module = $_REQUEST['module'];		//set the module		if(!empty($module))			$this->setModule($module);		//set properties on the controller from the $_REQUEST		$this->loadPropertiesFromRequest();		//load the mapping files		$this->loadMappings();	}	/**	 * Set the module on the Controller	 *	 * @param object $module	 */	public function setModule($module){		$this->module = $module;	}		/**	 * Set properties on the Controller from the $_REQUEST	 *	 */	private function loadPropertiesFromRequest(){		if(!empty($_REQUEST['action']))			$this->action = $_REQUEST['action'];		if(!empty($_REQUEST['record']))			$this->record = $_REQUEST['record'];		if(!empty($_REQUEST['view']))			$this->view = $_REQUEST['view'];		if(!empty($_REQUEST['return_module']))			$this->return_module = $_REQUEST['return_module'];		if(!empty($_REQUEST['return_action']))			$this->return_action = $_REQUEST['return_action'];		if(!empty($_REQUEST['return_id']))			$this->return_id = $_REQUEST['return_id'];	}		/**	 * Load map files for use within the Controller	 *	 */	private function loadMappings(){		$this->loadMapping('action_view_map');		$this->loadMapping('action_file_map');	}	/**	 * Given a record id load the bean. This bean is accessible from any sub controllers.	 */	public function loadBean(){		if(!empty($GLOBALS['beanList'][$this->module])){			$class = $GLOBALS['beanList'][$this->module];			if(!empty($GLOBALS['beanFiles'][$class])){				require_once($GLOBALS['beanFiles'][$class]);				$this->bean = new $class();				if(!empty($this->record)){					$this->bean->retrieve($this->record);					if($this->bean)						$GLOBALS['FOCUS'] = $this->bean;				}			}		}	}		/**	 * Generic load method to load mapping arrays.	 */	private function loadMapping($var){		$$var = sugar_cache_retrieve("CONTROLLER_". $var . "_".$this->module);		if(!$$var){			$$var = array();			if(file_exists('include/MVC/Controller/'. $var . '.php')){						require('include/MVC/Controller/'. $var . '.php');			}			if(file_exists('modules/'.$this->module.'/'. $var . '.php')){						require('modules/'.$this->module.'/'. $var . '.php');			}			if(file_exists('custom/modules/'.$this->module.'/'. $var . '.php')){						require('custom/modules/'.$this->module.'/'. $var . '.php');			}			if(file_exists('custom/include/MVC/Controller/'. $var . '.php')){						require('custom/include/MVC/Controller/'. $var . '.php');			}						sugar_cache_put("CONTROLLER_". $var . "_".$this->module, $$var);		}		$this->$var = $$var;	}				/**	 * This method is called from SugarApplication->execute and it will bootstrap the entire controller process	 */	final public function execute(){		$this->process();        		if(!empty($this->view)){			$this->processView();		}elseif(!empty($this->redirect_url)){			$this->redirect();		}	}		/**	 * Display the appropriate view.	 */	private function processView(){		$view = ViewFactory::loadView($this->view, $this->module, $this->bean, $this->view_object_map);		if(!empty($this->bean) && !$this->bean->ACLAccess($view->type) && $view->type != 'list'){			ACLController::displayNoAccess(true);			sugar_cleanup(true);		}		if(isset($this->errors)){		  $view->errors = $this->errors;		}		$view->process();	}		/**	 * Meant to be overridden by a subclass and allows for specific functionality to be	 * injected prior to the process() method being called.	 */	public function preProcess()	{}	/**	 * if we have a function to support the action use it otherwise use the default action	 * 	 * 1) check for file	 * 2) check for action	 */	public function process(){		$GLOBALS['action'] = $this->action;		$GLOBALS['module'] = $this->module;		//check to ensure we have access to the module.		if($this->hasAccess){			$this->do_action = $this->action;						$file = self::getActionFilename($this->do_action);									$this->loadBean();						$processed = false;			foreach($this->process_tasks as $process){				$this->$process();				if($this->_processed)					break;			}				$this->redirect();		}else{			$this->no_access();		}	}			/**	 * This method is called from the process method. I could also be called within an action_* method.	 * It allows a developer to override any one of these methods contained within,	 * or if the developer so chooses they can override the entire action_* method.	 * 	 * @return true if any one of the pre_, do_, or post_ methods have been defined,	 * false otherwise.  This is important b/c if none of these methods exists, then we will run the	 * action_default() method.	 */	protected function handle_action(){		$processed = false;		foreach($this->tasks as $task){			$processed = ($this->$task() || $processed);		}		$this->_processed = $processed;		//return ($processed);	}			/**	 * Perform an action prior to the specified action.	 * This can be overridde in a sub-class	 */	private function pre_action(){		$function = 'pre_' . $this->action;		if($this->hasFunction($function)){			$GLOBALS['log']->debug('Performing pre_action');			$this->$function();			return true;		}		return false;	}		/**	 * Perform the specified action. 	 * This can be overridde in a sub-class	 */	private function do_action(){		$function =  'action_'. strtolower($this->do_action);		if($this->hasFunction($function)){			$GLOBALS['log']->debug('Performing action: '.$function.' MODULE: '.$this->module);			$this->$function();			return true;		}		return false;	}		/**	 * Perform an action after to the specified action has occurred.	 * This can be overridde in a sub-class	 */	private function post_action(){		$function = 'post_' . $this->action;		if($this->hasFunction($function)){			$GLOBALS['log']->debug('Performing post_action');			$this->$function();			return true;		}		return false;	}		/**	 * If there is no action found then display an error to the user.	 */	protected function no_action(){		sugar_die("There is no action by that name.");	}		/**	 * The default action handler for instances where we do not have access to process.	 */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?