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 + -
显示快捷键?