/** * Returns a SugarBean object by id. The Last 10 loaded beans are cached in memory to prevent multiple retrieves per request. * If no id is passed, a new bean is created. * @static * @param String $module * @param String $id * @param Array $params A name/value array of parameters. Names: encode, deleted, * disable_row_level_security * If $params is boolean we revert to the old arguments (encode, deleted), and use $params as $encode. * This will be changed to using only $params in later versions. * @param Bool $deleted @see SugarBean::retrieve * @return SugarBean|null */ public static function getBean($module, $id = null, $params = array(), $deleted = true) { // Check if params is an array, if not use old arguments if (isset($params) && !is_array($params)) { $params = array('encode' => $params); } // Pull values from $params array if (defined('ENTRY_POINT_TYPE') && constant('ENTRY_POINT_TYPE') == 'api') { // In API mode, we can cache all beans unless specifically told not // to retrieve a cached version. $encode = false; $can_cache = isset($params['use_cache']) ? $params['use_cache'] : true; } else { // In GUI mode, we will cache only encoded beans unless specifically // told not to retrieve a cached version. $encode = isset($params['encode']) ? $params['encode'] : true; $can_cache = isset($params['use_cache']) ? $params['use_cache'] && $encode : $encode; } $deleted = isset($params['deleted']) ? $params['deleted'] : $deleted; if (!isset(self::$loadedBeans[$module])) { self::$loadedBeans[$module] = array(); self::$touched[$module] = array(); } $beanClass = self::getBeanName($module); if (empty($beanClass) || !class_exists($beanClass)) { return null; } if (!empty($id)) { if (!$can_cache || empty(self::$loadedBeans[$module][$id])) { // $bean = new $beanClass(); $bean = SugarBean::_createBean($beanClass); // Pro+ versions, to disable team check if we have rights // to change the parent bean, but not the related (e.g. change Account Name of Opportunity) if (!empty($params['disable_row_level_security'])) { $bean->disable_row_level_security = true; } $result = $bean->retrieve($id, $encode, $deleted); if (empty($result)) { if (empty($params['strict_retrieve'])) { return $bean; } else { return null; } } else { if ($can_cache) { self::registerBean($bean); } } } else { $bean = self::$loadedBeans[$module][$id]; // check if cached bean is deleted if ($deleted && !empty($bean->deleted)) { if (empty($params['strict_retrieve'])) { return SugarBean::_createBean($beanClass); } else { return null; } } // cached bean was retrieved with team security disabled if (empty($params['disable_row_level_security']) && !empty($bean->disable_row_level_security)) { $newBean = SugarBean::_createBean($beanClass); if (isset($params['disable_row_level_security'])) { // false $newBean->disable_row_level_security = false; } if (empty($newBean->disable_row_level_security)) { // retireve with team security enabled $result = $newBean->retrieve($id, $encode, $deleted); if (empty($result)) { if (empty($params['strict_retrieve'])) { return $bean; } else { return null; } } else { // save new bean in cache self::$loadedBeans[$module][$id] = $newBean; return $newBean; } } } self::$hits++; self::$touched[$module][$id]++; } } else { $bean = SugarBean::_createBean($beanClass); } return $bean; }