true, 'show_title' => true, 'show_subpanels' => false, 'show_search' => true, 'show_footer' => true, 'show_javascript' => true, 'view_print' => false ); var $type = null; var $responseTime; var $fileResources; /** * Constructor which will peform the setup. */ public function SugarView($bean = null, $view_object_map = array()) { // add mz // dziwny błąd w EcmCalls - this->module jest puste // if (!$this->module && $this->module=='') $this->module=$GLOBALS['module']; } public function init($bean = null, $view_object_map = array()) { global $moduleList; $this->bean = &$bean; $this->view_object_map = $view_object_map; $this->action = $GLOBALS ['action']; $this->module = $GLOBALS ['module']; $this->_initSmarty (); } protected function _initSmarty() { $this->ss = new Sugar_Smarty (); $this->ss->assign ( 'MOD', $GLOBALS ['mod_strings'] ); $this->ss->assign ( 'APP', $GLOBALS ['app_strings'] ); } /** * This method will be called from the controller and is not meant to be overridden. */ public function process() { LogicHook::initialize (); $this->_checkModule (); // trackView has to be here in order to track for breadcrumbs $this->_trackView (); if ($this->_getOption ( 'show_header' )) { $this->displayHeader (); } else { $this->renderJavascript (); } $this->_buildModuleList (); $this->preDisplay (); $this->displayErrors (); $this->display (); $GLOBALS ['logic_hook']->call_custom_logic ( '', 'after_ui_frame' ); if ($this->_getOption ( 'show_subpanels' )) $this->_displaySubPanels (); if ($this->action === 'Login') { // this is needed for a faster loading login page ie won't render unless the tables are closed ob_flush (); } if ($this->_getOption ( 'show_footer' )) $this->displayFooter (); $GLOBALS ['logic_hook']->call_custom_logic ( '', 'after_ui_footer' ); // Do not track if there is no module or if module is not a String $this->_track (); } /** * This method will display the errors on the page. */ public function displayErrors() { foreach ( $this->errors as $error ) { echo '' . $error . '
'; } } /** * [OVERRIDE] - This method is meant to overidden in a subclass. * The purpose of this method is * to allow a view to do some preprocessing before the display method is called. This becomes * useful when you have a view defined at the application level and then within a module * have a sub-view that extends from this application level view. The application level * view can do the setup in preDisplay() that is common to itself and any subviews * and then the subview can just override display(). If it so desires, can also override * preDisplay(). */ public function preDisplay() { } /** * [OVERRIDE] - This method is meant to overidden in a subclass. * This method * will handle the actual display logic of the view. */ public function display() { } /** * trackView */ protected function _trackView() { $action = strtolower ( $this->action ); // Skip save, tracked in SugarBean instead if ($action == 'save') { return; } $trackerManager = TrackerManager::getInstance (); $timeStamp = gmdate ( $GLOBALS ['timedate']->get_db_date_time_format () ); if ($monitor = $trackerManager->getMonitor ( 'tracker' )) { $monitor->setValue ( 'action', $action ); $monitor->setValue ( 'user_id', $GLOBALS ['current_user']->id ); $monitor->setValue ( 'module_name', $this->module ); $monitor->setValue ( 'date_modified', $timeStamp ); $monitor->setValue ( 'visible', (($monitor->action == 'detailview') || ($monitor->action == 'editview')) ? 1 : 0 ); if (! empty ( $this->bean->id )) { $monitor->setValue ( 'item_id', $this->bean->id ); $monitor->setValue ( 'item_summary', $this->bean->get_summary_text () ); } // If visible is true, but there is no bean, do not track (invalid/unauthorized reference) // Also, do not track save actions where there is no bean id if ($monitor->visible && empty ( $this->bean->id )) { $trackerManager->unsetMonitor ( $monitor ); return; } $trackerManager->saveMonitor ( $monitor, true, true ); } } /** * Displays the header on section of the page; basically everything before the content */ public function displayHeader() { global $theme; global $max_tabs; global $app_strings; global $current_user; global $sugar_config; global $app_list_strings; global $mod_strings; global $current_language; $GLOBALS ['app']->headerDisplayed = true; $themeObject = SugarThemeRegistry::current (); $theme = $themeObject->__toString (); $ss = new Sugar_Smarty (); $ss->assign ( "APP", $app_strings ); $ss->assign ( "THEME", $theme ); $ss->assign ( "THEME_IE6COMPAT", $themeObject->ie6compat ? 'true' : 'false' ); $ss->assign ( "MODULE_NAME", $this->module ); // get browser title $ss->assign ( "SYSTEM_NAME", $this->getBrowserTitle () ); // get css $css = $themeObject->getCSS (); if ($this->_getOption ( 'view_print' )) { $css .= ''; } $ss->assign ( "SUGAR_CSS", $css ); // get javascript ob_start (); $this->renderJavascript (); $ss->assign ( "SUGAR_JS", ob_get_contents () . $themeObject->getJS () ); ob_end_clean (); // get favicon if (isset ( $GLOBALS ['sugar_config'] ['default_module_favicon'] )) $module_favicon = $GLOBALS ['sugar_config'] ['default_module_favicon']; else $module_favicon = false; $favicon = ''; if ($module_favicon) $favicon = $themeObject->getImageURL ( $this->module . '.gif', false ); if (! sugar_is_file ( $favicon ) || ! $module_favicon) $favicon = $themeObject->getImageURL ( 'sugar_icon.ico', false ); $ss->assign ( 'FAVICON_URL', getJSPath ( $favicon ) ); // build the shortcut menu $shortcut_menu = array (); foreach ( $this->getMenu () as $key => $menu_item ) $shortcut_menu [$key] = array ( "URL" => $menu_item [0], "LABEL" => $menu_item [1], "MODULE_NAME" => $menu_item [2], "IMAGE" => $themeObject->getImage ( $menu_item [2], "alt='" . $menu_item [1] . "' border='0' align='absmiddle'" ) ); $ss->assign ( "SHORTCUT_MENU", $shortcut_menu ); // handle rtl text direction if (isset ( $_REQUEST ['RTL'] ) && $_REQUEST ['RTL'] == 'RTL') { $_SESSION ['RTL'] = true; } if (isset ( $_REQUEST ['LTR'] ) && $_REQUEST ['LTR'] == 'LTR') { unset ( $_SESSION ['RTL'] ); } if (isset ( $_SESSION ['RTL'] ) && $_SESSION ['RTL']) { $ss->assign ( "DIR", 'dir="RTL"' ); } // handle resizing of the company logo correctly on the fly $companyLogoURL = $themeObject->getImageURL ( 'company_logo.png' ); $companyLogoURL_arr = explode ( '?', $companyLogoURL ); $companyLogoURL = $companyLogoURL_arr [0]; $company_logo_attributes = sugar_cache_retrieve ( 'company_logo_attributes' ); if (! empty ( $company_logo_attributes )) { $ss->assign ( "COMPANY_LOGO_MD5", $company_logo_attributes [0] ); $ss->assign ( "COMPANY_LOGO_WIDTH", $company_logo_attributes [1] ); $ss->assign ( "COMPANY_LOGO_HEIGHT", $company_logo_attributes [2] ); } else { // Always need to md5 the file $ss->assign ( "COMPANY_LOGO_MD5", md5_file ( $companyLogoURL ) ); list ( $width, $height ) = getimagesize ( $companyLogoURL ); if ($width > 212 || $height > 40) { $resizePctWidth = ($width - 212) / 212; $resizePctHeight = ($height - 40) / 40; if ($resizePctWidth > $resizePctHeight) $resizeAmount = $width / 212; else $resizeAmount = $height / 40; $ss->assign ( "COMPANY_LOGO_WIDTH", round ( $width * (1 / $resizeAmount) ) ); $ss->assign ( "COMPANY_LOGO_HEIGHT", round ( $height * (1 / $resizeAmount) ) ); } else { $ss->assign ( "COMPANY_LOGO_WIDTH", $width ); $ss->assign ( "COMPANY_LOGO_HEIGHT", $height ); } // Let's cache the results sugar_cache_put ( 'company_logo_attributes', array ( $ss->get_template_vars ( "COMPANY_LOGO_MD5" ), $ss->get_template_vars ( "COMPANY_LOGO_WIDTH" ), $ss->get_template_vars ( "COMPANY_LOGO_HEIGHT" ) ) ); } $ss->assign ( "COMPANY_LOGO_URL", getJSPath ( $companyLogoURL ) . "&logo_md5=" . $ss->get_template_vars ( "COMPANY_LOGO_MD5" ) ); // get the global links $gcls = array (); $global_control_links = array (); require ("include/globalControlLinks.php"); foreach ( $global_control_links as $key => $value ) { if ($key == 'users') { // represents logout link. $ss->assign ( "LOGOUT_LINK", $value ['linkinfo'] [key ( $value ['linkinfo'] )] ); $ss->assign ( "LOGOUT_LABEL", key ( $value ['linkinfo'] ) ); // key value for first element. continue; } foreach ( $value as $linkattribute => $attributevalue ) { // get the main link info if ($linkattribute == 'linkinfo') $gcls [$key] = array ( "LABEL" => key ( $attributevalue ), "URL" => current ( $attributevalue ), "SUBMENU" => array () ); // and now the sublinks if ($linkattribute == 'submenu' && is_array ( $attributevalue )) foreach ( $attributevalue as $submenulinkkey => $submenulinkinfo ) $gcls [$key] ['SUBMENU'] [$submenulinkkey] = array ( "LABEL" => key ( $submenulinkinfo ), "URL" => current ( $submenulinkinfo ) ); } } $ss->assign ( "GCLS", $gcls ); $ss->assign ( "SEARCH", isset ( $_REQUEST ['query_string'] ) ? $_REQUEST ['query_string'] : '' ); if ($this->action == "EditView" || $this->action == "Login") $ss->assign ( "ONLOAD", 'onload="set_focus()"' ); $ss->assign ( "AUTHENTICATED", isset ( $_SESSION ["authenticated_user_id"] ) ); // get other things needed for page style popup if (isset ( $_SESSION ["authenticated_user_id"] )) { // get the current user name and id $ss->assign ( "CURRENT_USER", $current_user->full_name == '' || ! showFullName () ? $current_user->user_name : $current_user->full_name ); $ss->assign ( "CURRENT_USER_ID", $current_user->id ); // get the last viewed records $tracker = new Tracker (); $history = $tracker->get_recently_viewed ( $current_user->id ); foreach ( $history as $key => $row ) { if ($row ['module_name'] == "EcmStockDocIns" || $row ['module_name'] == "EcmStockDocInsideIns" || $row ['module_name'] == "EcmStockDocInsideOuts" || $row ['module_name'] == "EcmStockDocOuts" || $row ['module_name'] == "EcmStockDocMoves" || $row ['module_name'] == "EcmStockDocCorrects" || $row ['module_name'] == "EcmInvoiceOuts"|| $row ['module_name'] == "EcmInvoiceOutOlds" || $row ['module_name'] == "EcmQuotes" || $row ['module_name'] == "EcmSales" || $row ['module_name'] == "EcmPurchaseOrders" || $row ['module_name'] == "EcmDeliveryNotes" || $row ['module_name'] == "EcmInsideOrders" || $row ['module_name'] == "EcmReturns" || $row ['module_name'] == "EcmPrepaymentInvoices") { $r = $GLOBALS['db']->fetchByAssoc($GLOBALS['db']->query( "select document_no from " . strtolower ( $row['module_name'] ) . " where id='" . $row ['item_id'] . "'" ) ); $rfield = $r ['document_no']; } else $rfield = getTrackerSubstring ( $row ['item_summary'] ); $history [$key] ['item_summary_short'] = $rfield; $history [$key] ['image'] = SugarThemeRegistry::current ()->getImage ( $row ['module_name'], 'border="0" align="absmiddle" alt="' . $row ['item_summary'] . '"' ); } $ss->assign ( "recentRecords", $history ); } // menu start $bakModStrings = $mod_strings; if (isset ( $_SESSION ["authenticated_user_id"] )) { // get the module list $moduleTopMenu = array (); $max_tabs = $current_user->getPreference ( 'max_tabs' ); // Attempt to correct if max tabs count is waaay too high. if (! isset ( $max_tabs ) || $max_tabs <= 0 || $max_tabs > 10) { $max_tabs = $GLOBALS ['sugar_config'] ['default_max_tabs']; $current_user->setPreference ( 'max_tabs', $max_tabs, 0, 'global' ); } $moduleTab = $this->_getModuleTab (); $ss->assign ( 'MODULE_TAB', $moduleTab ); // See if they are using grouped tabs or not (removed in 6.0, returned in 6.1) $user_navigation_paradigm = $current_user->getPreference ( 'navigation_paradigm' ); if (! isset ( $user_navigation_paradigm )) { $user_navigation_paradigm = $GLOBALS ['sugar_config'] ['default_navigation_paradigm']; } // Get the full module list for later use foreach ( query_module_access_list ( $current_user ) as $module ) { // Bug 25948 - Check for the module being in the moduleList if (isset ( $app_list_strings ['moduleList'] [$module] )) { $fullModuleList [$module] = $app_list_strings ['moduleList'] [$module]; } } if (! should_hide_iframes ()) { $iFrame = new iFrame (); $frames = $iFrame->lookup_frames ( 'tab' ); foreach ( $frames as $key => $values ) { $fullModuleList [$key] = $values; } } elseif (isset ( $fullModuleList ['iFrames'] )) { unset ( $fullModuleList ['iFrames'] ); } // if ( $user_navigation_paradigm == 'gm' && isset($themeObject->group_tabs) && $themeObject->group_tabs) { global $current_user; // if ($current_user->id=='4e5bd519-0978-2271-8a7c-4e708fbf540d') // $user_navigation_paradigm='mz'; // if ($current_user->id=='1') $user_navigation_paradigm = 'mz'; if ($user_navigation_paradigm == 'gm' || $user_navigation_paradigm == 'mz') { // We are using grouped tabs require_once ('include/GroupedTabs/GroupedTabStructure.php'); $groupedTabsClass = new GroupedTabStructure (); $modules = query_module_access_list ( $current_user ); // create module div // handle with submoremodules $max_tabs = $current_user->getPreference ( 'max_tabs' ); // If the max_tabs isn't set incorrectly, set it within the range, to the default max sub tabs size if (! isset ( $max_tabs ) || $max_tabs <= 0 || $max_tabs > 10) { // We have a default value. Use it if (isset ( $GLOBALS ['sugar_config'] ['default_max_tabs'] )) { $max_tabs = $GLOBALS ['sugar_config'] ['default_max_tabs']; } else { $max_tabs = 8; } } $max_tabs = 50; $subMoreModules = false; $groupTabs = $groupedTabsClass->get_tab_structure ( get_val_array ( $modules ) ); $g = array (); foreach ( $groupTabs as $k => $v ) { foreach ( $v ['modules'] as $kk => $vv ) $g [$kk] = $k; } // add mz // get module submenu // global $module_menu; // if ($current_user->id=='1') var_dump($groupTabs); $MMenuDivs = ''; foreach ( $modules as $module_name ) { // load_menu('modules/'.$module.'/'); $menu = ''; $MMenuDivs .= $menu; // echo htmlspecialchars($menu).'

'; } $ss->assign ( 'MMenuDivs', $MMenuDivs ); // end submenu // We need to put this here, so the "All" group is valid for the user's preference. // $groupTabs[$app_strings['LBL_TABGROUP_ALL']]['modules'] = $fullModuleList; // Setup the default group tab. $allGroup = $app_strings ['LBL_TABGROUP_ALL']; $ss->assign ( 'currentGroupTab', $allGroup ); $currentGroupTab = $allGroup; $usersGroup = $current_user->getPreference ( 'theme_current_group' ); // Figure out which tab they currently have selected (stored as a user preference) if (! empty ( $usersGroup ) && isset ( $groupTabs [$usersGroup] )) { $currentGroupTab = $usersGroup; } else { $current_user->setPreference ( 'theme_current_group', $currentGroupTab ); } $ss->assign ( 'currentGroupTab', $currentGroupTab ); if ($user_navigation_paradigm == 'gm') $usingGroupTabs = true; } else { // Setup the default group tab. $ss->assign ( 'currentGroupTab', $app_strings ['LBL_TABGROUP_ALL'] ); $usingGroupTabs = false; $groupTabs [$app_strings ['LBL_TABGROUP_ALL']] ['modules'] = $fullModuleList; } $topTabList = array (); // Now time to go through each of the tab sets and fix them up. foreach ( $groupTabs as $tabIdx => $tabData ) { $topTabs = $tabData ['modules']; if (! is_array ( $topTabs )) { $topTabs = array (); } $extraTabs = array (); // Split it in to the tabs that go across the top, and the ones that are on the extra menu. if (count ( $topTabs ) > $max_tabs) { $extraTabs = array_splice ( $topTabs, $max_tabs ); } // Make sure the current module is accessable through one of the top tabs if (! isset ( $topTabs [$moduleTab] )) { // Nope, we need to add it. // First, take it out of the extra menu, if it's there if (isset ( $extraTabs [$moduleTab] )) { unset ( $extraTabs [$moduleTab] ); } if (count ( $topTabs ) >= $max_tabs - 1) { // We already have the maximum number of tabs, so we need to shuffle the last one // from the top to the first one of the extras $lastElem = array_splice ( $topTabs, $max_tabs - 1 ); $extraTabs = $lastElem + $extraTabs; } // dopisywanie aktualnego modułu do każdej podgrupy /* * if ( !empty($moduleTab) ) { $topTabs[$moduleTab] = $app_list_strings['moduleList'][$moduleTab]; } */ } /* * // This was removed, but I like the idea, so I left the code in here in case we decide to turn it back on // If we are using group tabs, add all the "hidden" tabs to the end of the extra menu if ( $usingGroupTabs ) { foreach($fullModuleList as $moduleKey => $module ) { if ( !isset($topTabs[$moduleKey]) && !isset($extraTabs[$moduleKey]) ) { $extraTabs[$moduleKey] = $module; } } } */ // Get a unique list of the top tabs so we can build the popup menus for them foreach ( $topTabs as $moduleKey => $module ) { $topTabList [$moduleKey] = $module; } // mz $groupTabs [$tabIdx] ['modules'] = $topTabs; $groupTabs [$tabIdx] ['extra'] = $extraTabs; } } if (isset ( $topTabList ) && is_array ( $topTabList )) { // Adding shortcuts array to menu array for displaying shortcuts associated with each module $shortcutTopMenu = array (); foreach ( $topTabList as $module_key => $label ) { global $mod_strings; $mod_strings = return_module_language ( $current_language, $module_key ); foreach ( $this->getMenu ( $module_key ) as $key => $menu_item ) { $shortcutTopMenu [$module_key] [$key] = array ( "URL" => $menu_item [0], "LABEL" => $menu_item [1], "MODULE_NAME" => $menu_item [2], "IMAGE" => $themeObject->getImage ( $menu_item [2], "border='0' align='absmiddle'", null, null, '.gif', $menu_item [1] ), "ID" => $menu_item [2] . "_link" ); } } $ss->assign ( "groupTabs", $groupTabs ); $ss->assign ( "shortcutTopMenu", $shortcutTopMenu ); if ($user_navigation_paradigm == 'gm') $ss->assign ( 'USE_GROUP_TABS', $usingGroupTabs ); if ($user_navigation_paradigm == 'mz') $ss->assign ( 'USE_MZ_TABS', true ); // This is here for backwards compatibility, someday, somewhere, it will be able to be removed $ss->assign ( "moduleTopMenu", $groupTabs [$app_strings ['LBL_TABGROUP_ALL']] ['modules'] ); $ss->assign ( "moduleExtraMenu", $groupTabs [$app_strings ['LBL_TABGROUP_ALL']] ['extra'] ); } global $mod_strings; $mod_strings = $bakModStrings; $headerTpl = $themeObject->getTemplate ( 'header.tpl' ); if (isset ( $GLOBALS ['sugar_config'] ['developerMode'] ) && $GLOBALS ['sugar_config'] ['developerMode']) $ss->clear_compiled_tpl ( $headerTpl ); $retModTabs = false; if ($retModTabs) { return $ss->fetch ( $themeObject->getTemplate ( '_headerModuleList.tpl' ) ); } else { $ss->display ( $headerTpl ); $this->includeClassicFile ( 'modules/Administration/DisplayWarnings.php' ); // $errorMessages = SugarApplication::getErrorMessages(); if (! empty ( $errorMessages )) { foreach ( $errorMessages as $error_message ) { echo ('

' . $error_message . '

'); } } } } // menu end /** * If the view is classic then this method will include the file and * setup any global variables. * * @param string $file */ public function includeClassicFile($file) { global $sugar_config, $theme, $current_user, $sugar_version, $sugar_flavor, $mod_strings, $app_strings, $app_list_strings, $action, $timezones; global $gridline, $request_string, $modListHeader, $dashletData, $authController, $locale, $currentModule, $import_bean_map, $image_path, $license; global $user_unique_key, $server_unique_key, $barChartColors, $modules_exempt_from_availability_check, $dictionary, $current_language, $beanList, $beanFiles, $sugar_build, $sugar_codename; global $timedate, $login_error; // cn: bug 13855 - timedate not available to classic views. $currentModule = $this->module; require_once ($file); } protected function _displayLoginJS() { global $sugar_config; if (isset ( $this->bean->module_dir )) { echo ""; } if (isset ( $_REQUEST ['action'] )) { echo ""; } echo ''; if (! is_file ( "include/javascript/sugar_grp1.js" )) { $_REQUEST ['root_directory'] = "."; require_once ("jssource/minify_utils.php"); ConcatenateFiles ( "." ); } echo ''; echo ''; echo ''; echo << if ( typeof(SUGAR) == 'undefined' ) {SUGAR = {}}; if ( typeof(SUGAR.themes) == 'undefined' ) SUGAR.themes = {}; EOQ; if (isset ( $sugar_config ['disc_client'] ) && $sugar_config ['disc_client']) echo ''; } /** * Called from process(). * This method will display the correct javascript. */ protected function _displayJavascript() { global $locale, $sugar_config; if ($this->_getOption ( 'show_javascript' )) { if (! $this->_getOption ( 'show_header' )) echo << EOHTML; echo ""; echo ""; if (isset ( $this->bean->module_dir )) { echo ""; } if (isset ( $_REQUEST ['action'] )) { echo ""; } echo ''; if (! is_file ( "include/javascript/sugar_grp1.js" ) || ! is_file ( "include/javascript/sugar_grp1_yui.js" )) { $_REQUEST ['root_directory'] = "."; require_once ("jssource/minify_utils.php"); ConcatenateFiles ( "." ); } echo ''; echo ''; echo ''; // cn: bug 12274 - prepare secret guid for asynchronous calls if (! isset ( $_SESSION ['asynchronous_key'] ) || empty ( $_SESSION ['asynchronous_key'] )) { $_SESSION ['asynchronous_key'] = create_guid (); } $image_server = (defined ( 'TEMPLATE_URL' )) ? TEMPLATE_URL . '/' : ''; echo ''; // cn: bug 12274 - create session-stored key to defend against CSRF echo ''; echo $GLOBALS ['timedate']->get_javascript_validation (); if (! is_file ( $GLOBALS ['sugar_config'] ['cache_dir'] . 'jsLanguage/' . $GLOBALS ['current_language'] . '.js' )) { require_once ('include/language/jsLanguage.php'); jsLanguage::createAppStringsCache ( $GLOBALS ['current_language'] ); } echo ''; if (! is_file ( $GLOBALS ['sugar_config'] ['cache_dir'] . 'jsLanguage/' . $this->module . '/' . $GLOBALS ['current_language'] . '.js' )) { require_once ('include/language/jsLanguage.php'); jsLanguage::createModuleStringsCache ( $this->module, $GLOBALS ['current_language'] ); } echo ''; if (isset ( $sugar_config ['disc_client'] ) && $sugar_config ['disc_client']) echo ''; echo ''; } if (isset ( $_REQUEST ['popup'] ) && ! empty ( $_REQUEST ['popup'] )) { // cn: bug 12274 - add security metadata envelope for async calls in popups echo ''; // cn: bug 12274 - create session-stored key to defend against CSRF } } /** * Called from process(). * This method will display the footer on the page. */ public function displayFooter() { if (empty ( $this->responseTime )) { $this->_calculateFooterMetrics (); } global $sugar_config; global $app_strings; // decide whether or not to show themepicker, default is to show $showThemePicker = true; if (isset ( $sugar_config ['showThemePicker'] )) { $showThemePicker = $sugar_config ['showThemePicker']; } echo ""; $jsalerts = new jsAlerts (); if (! isset ( $_SESSION ['isMobile'] )) echo $jsalerts->getScript (); $ss = new Sugar_Smarty (); $ss->assign ( "AUTHENTICATED", isset ( $_SESSION ["authenticated_user_id"] ) ); $ss->assign ( 'MOD', return_module_language ( $GLOBALS ['current_language'], 'Users' ) ); if (SugarConfig::getInstance ()->get ( 'calculate_response_time', false )) $ss->assign ( 'STATISTICS', $this->_getStatistics () ); // Under the License referenced above, you are required to leave in all copyright statements in both // the code and end-user application. // $copyright = '© 2004-2010 SugarCRM Inc. The Program is provided AS IS, without warranty. Licensed under AGPLv3.
This program is free software; you can redistribute it and/or modify it under the terms of the
GNU Affero General Public License version 3 as published by the Free Software Foundation, including the additional permission set forth in the source code header.
'; // 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". // $attribLinkImg = "Powered By SugarCRM\n"; // Bug 38594 - Add in Trademark wording // $copyright .= 'SugarCRM is a trademark of SugarCRM, Inc. All other company and product names may be trademarks of the respective companies with which they are associated.
'; // rrs bug: 20923 - if this image does not exist as per the license, then the proper image will be displaye regardless, so no need // to display an empty image here. if (file_exists ( 'include/images/poweredby_sugarcrm.png' )) { $copyright .= $attribLinkImg; } // End Required Image $ss->assign ( 'COPYRIGHT', $copyright ); $ss->display ( SugarThemeRegistry::current ()->getTemplate ( 'footer.tpl' ) ); } /** * Called from process(). * This method will display subpanels. */ protected function _displaySubPanels() { if (isset ( $this->bean ) && ! empty ( $this->bean->id ) && (file_exists ( 'modules/' . $this->module . '/metadata/subpaneldefs.php' ) || file_exists ( 'custom/modules/' . $this->module . '/metadata/subpaneldefs.php' ) || file_exists ( 'custom/modules/' . $this->module . '/Ext/Layoutdefs/layoutdefs.ext.php' ))) { $GLOBALS ['focus'] = $this->bean; require_once ('include/SubPanel/SubPanelTiles.php'); $subpanel = new SubPanelTiles ( $this->bean, $this->module ); echo $subpanel->display (); } } protected function _buildModuleList() { if (! empty ( $GLOBALS ['current_user'] ) && empty ( $GLOBALS ['modListHeader'] )) $GLOBALS ['modListHeader'] = query_module_access_list ( $GLOBALS ['current_user'] ); } /** * private method used in process() to determine the value of a passed in option * * @param * string option - the option that we want to know the valye of * @param * bool default - what the default value should be if we do not find the option * * @return bool - the value of the option */ protected function _getOption($option, $default = false) { if (! empty ( $this->options ) && isset ( $this->options ['show_all'] )) { return $this->options ['show_all']; } elseif (! empty ( $this->options ) && isset ( $this->options [$option] )) { return $this->options [$option]; } else return $default; } /** * track * Private function to track information about the view request */ private function _track() { if (empty ( $this->responseTime )) { $this->_calculateFooterMetrics (); } if (empty ( $GLOBALS ['current_user']->id )) { return; } $trackerManager = TrackerManager::getInstance (); $trackerManager->save (); } /** * Checks to see if the module name passed is valid; dies if it is not */ protected function _checkModule() { if (! empty ( $this->module ) && ! file_exists ( 'modules/' . $this->module )) { $error = str_replace ( "[module]", "$this->module", $GLOBALS ['app_strings'] ['ERR_CANNOT_FIND_MODULE'] ); $GLOBALS ['log']->fatal ( $error ); echo $error; die (); } } public function renderJavascript() { if ($this->action !== 'Login') $this->_displayJavascript (); else $this->_displayLoginJS (); } private function _calculateFooterMetrics() { $endTime = microtime ( true ); $deltaTime = $endTime - $GLOBALS ['startTime']; $this->responseTime = number_format ( round ( $deltaTime, 2 ), 2 ); // Print out the resources used in constructing the page. $included_files = get_included_files (); // take all of the included files and make a list that does not allow for duplicates based on case // I believe the full get_include_files result set appears to have one entry for each file in real // case, and one entry in all lower case. $list_of_files_case_insensitive = array (); foreach ( $included_files as $key => $name ) { // preserve the first capitalization encountered. $list_of_files_case_insensitive [mb_strtolower ( $name )] = $name; } $this->fileResources = sizeof ( $list_of_files_case_insensitive ); } private function _getStatistics() { $endTime = microtime ( true ); $deltaTime = $endTime - $GLOBALS ['startTime']; $response_time_string = $GLOBALS ['app_strings'] ['LBL_SERVER_RESPONSE_TIME'] . " " . number_format ( round ( $deltaTime, 2 ), 2 ) . " " . $GLOBALS ['app_strings'] ['LBL_SERVER_RESPONSE_TIME_SECONDS']; //add mz 2014-10-10 //save time statistics // global $current_user; // $log_res = $GLOBALS['db']->query("SELECT * FROM ecmlog WHERE // user_id='".$current_user->id."' AND // module='".$_REQUEST['module']."' AND // action='".$_REQUEST['action']."' // "); // if ($log_res->num_rows == 0) { // $GLOBALS['db']->query("INSERT INTO ecmlog VALUES ( // '".$current_user->id."', // '".$_REQUEST['module']."', // '".$_REQUEST['action']."', // '1', // '".number_format ( round ( $deltaTime, 2 ), 2 )."' // )"); // } else { // $log_row = $GLOBALS['db']->fetchByAssoc($log_res); // $qty = $log_row['quantity']+1; // $time = $log_row['time']+number_format ( round ( $deltaTime, 2 ), 2 ); // $GLOBALS['db']->query("UPDATE ecmlog SET // quantity='".$qty."', // time='".$time."' // WHERE // user_id='".$current_user->id."' AND // module='".$_REQUEST['module']."' AND // action='".$_REQUEST['action']."' // "); // } //end mz $return = $response_time_string; $return .= '
'; if (! empty ( $GLOBALS ['sugar_config'] ['show_page_resources'] )) { // Print out the resources used in constructing the page. $included_files = get_included_files (); // take all of the included files and make a list that does not allow for duplicates based on case // I believe the full get_include_files result set appears to have one entry for each file in real // case, and one entry in all lower case. $list_of_files_case_insensitive = array (); foreach ( $included_files as $key => $name ) { // preserve the first capitalization encountered. $list_of_files_case_insensitive [mb_strtolower ( $name )] = $name; } $return .= $GLOBALS ['app_strings'] ['LBL_SERVER_RESPONSE_RESOURCES'] . '(' . DBManager::getQueryCount () . ',' . sizeof ( $list_of_files_case_insensitive ) . ')
'; // Display performance of the internal and external caches.... $return .= "External cache (hits/total=ratio) local ({$GLOBALS['external_cache_request_local_hits']}/{$GLOBALS['external_cache_request_local_total']}=" . round ( $GLOBALS ['external_cache_request_local_hits'] * 100 / $GLOBALS ['external_cache_request_local_total'], 0 ) . "%)"; if ($GLOBALS ['external_cache_request_external_total']) { // Only display out of process cache results if there was at least one attempt to retrieve from the out of process cache (this signifies that it was enabled). $return .= " external ({$GLOBALS['external_cache_request_external_hits']}/{$GLOBALS['external_cache_request_external_total']}=" . round ( $GLOBALS ['external_cache_request_external_hits'] * 100 / $GLOBALS ['external_cache_request_external_total'], 0 ) . "%)
"; } } return $return; } /** * Loads the module shortcuts menu * * @param $module string * optional, can specify module to retrieve menu for if not the current one * @return array module menu */ public function getMenu($module = null) { global $current_language, $current_user, $mod_strings, $app_strings; if (empty ( $module )) $module = $this->module; $module_menu = sugar_cache_retrieve ( "{$current_user->id}_{$module}_module_menu_{$current_language}" ); if (! is_array ( $module_menu )) { $final_module_menu = array (); if (file_exists ( 'modules/' . $module . '/Menu.php' )) { $GLOBALS ['module_menu'] = $module_menu = array (); require ('modules/' . $module . '/Menu.php'); $final_module_menu = array_merge ( $final_module_menu, $GLOBALS ['module_menu'], $module_menu ); } if (file_exists ( 'custom/modules/' . $module . '/Ext/Menus/menu.ext.php' )) { $GLOBALS ['module_menu'] = $module_menu = array (); require ('custom/modules/' . $module . '/Ext/Menus/menu.ext.php'); $final_module_menu = array_merge ( $final_module_menu, $GLOBALS ['module_menu'], $module_menu ); } if (! file_exists ( 'modules/' . $module . '/Menu.php' ) && ! file_exists ( 'custom/modules/' . $module . '/Ext/Menus/menu.ext.php' ) && ! empty ( $GLOBALS ['mod_strings'] ['LNK_NEW_RECORD'] )) { $final_module_menu [] = array ( "index.php?module=$module&action=EditView&return_module=$module&return_action=DetailView", $GLOBALS ['mod_strings'] ['LNK_NEW_RECORD'], "{$GLOBALS['app_strings']['LBL_CREATE_BUTTON_LABEL']}$module", $module ); $final_module_menu [] = array ( "index.php?module=$module&action=index", $GLOBALS ['mod_strings'] ['LNK_LIST'], $module, $module ); if (($this->bean instanceof SugarBean) && ! empty ( $this->bean->importable )) if (! empty ( $mod_strings ['LNK_IMPORT_' . strtoupper ( $module )] )) $final_module_menu [] = array ( "index.php?module=Import&action=Step1&import_module=$module&return_module=$module&return_action=index", $mod_strings ['LNK_IMPORT_' . strtoupper ( $module )], "Import", $module ); else $final_module_menu [] = array ( "index.php?module=Import&action=Step1&import_module=$module&return_module=$module&return_action=index", $app_strings ['LBL_IMPORT'], "Import", $module ); } if (file_exists ( 'custom/application/Ext/Menus/menu.ext.php' )) { $GLOBALS ['module_menu'] = $module_menu = array (); require ('custom/application/Ext/Menus/menu.ext.php'); $final_module_menu = array_merge ( $final_module_menu, $GLOBALS ['module_menu'], $module_menu ); } $module_menu = $final_module_menu; sugar_cache_put ( "{$current_user->id}_{$module}_module_menu_{$current_language}", $module_menu ); } return $module_menu; } /** * Returns the module name which should be highlighted in the module menu */ protected function _getModuleTab() { global $app_list_strings, $moduleTabMap; // Need to figure out what tab this module belongs to, most modules have their own tabs, but there are exceptions. if (! empty ( $_REQUEST ['module_tab'] )) return $_REQUEST ['module_tab']; elseif (isset ( $moduleTabMap [$this->module] )) return $moduleTabMap [$this->module]; // Special cases elseif ($this->module == 'MergeRecords') return $_REQUEST ['return_module']; elseif ($this->module == 'Users' && $this->action == 'SetTimezone') return 'Home'; // Default anonymous pages to be under Home elseif (! isset ( $app_list_strings ['moduleList'] [$this->module] )) return 'Home'; else return $this->module; } /** * Return the "breadcrumbs" to display at the top of the page * * @param bool $show_help * optional, true if we show the help links * @return HTML string containing breadcrumb title */ public function getModuleTitle($show_help = true) { global $sugar_version, $sugar_flavor, $server_unique_key, $current_language, $action; $theTitle = "
\n

"; $module = preg_replace ( "/ /", "", $this->module ); if (is_file ( SugarThemeRegistry::current ()->getImageURL ( $this->module . '.gif' ) )) { $theTitle .= "" . $module . " "; } $params = $this->_getModuleTitleParams (); $count = count ( $params ); $index = 0; foreach ( $params as $parm ) { $index ++; $theTitle .= $parm; if ($index < $count) { $theTitle .= "»"; } } $theTitle .= "

\n"; if ($show_help) { $theTitle .= ""; if (isset ( $this->action ) && $this->action != "EditView") { $printImageURL = SugarThemeRegistry::current ()->getImageURL ( 'print.gif' ); $theTitle .= << {$GLOBALS['app_strings']['LNK_PRINT']} {$GLOBALS['app_strings']['LNK_PRINT']} EOHTML; } $helpImageURL = SugarThemeRegistry::current ()->getImageURL ( 'help.gif' ); $theTitle .= << {$GLOBALS[ {$GLOBALS['app_strings']['LNK_HELP']} EOHTML; } $theTitle .= "
\n"; return $theTitle; } /** * Returns an array composing of the breadcrumbs to use for the module title * * @return array */ protected function _getModuleTitleParams() { $params = array ( $this->_getModuleTitleListParam () ); if (isset ( $this->action )) { switch ($this->action) { case 'EditView' : if (! empty ( $this->bean->id )) { $params [] = "" . $this->bean->get_summary_text () . ""; $params [] = $GLOBALS ['app_strings'] ['LBL_EDIT_BUTTON_LABEL']; } else $params [] = $GLOBALS ['app_strings'] ['LBL_CREATE_BUTTON_LABEL']; break; case 'DetailView' : $beanName = $this->bean->get_summary_text (); $params [] = $beanName; break; } } return $params; } /** * Returns the portion of the array that will represent the listview in the breadcrumb * * @return string */ protected function _getModuleTitleListParam() { global $current_user; if (! empty ( $GLOBALS ['app_list_strings'] ['moduleList'] [$this->module] )) $firstParam = $GLOBALS ['app_list_strings'] ['moduleList'] [$this->module]; else $firstParam = $this->module; if ($this->action == "ListView" || $this->action == "index") return $firstParam; else return "{$firstParam}"; } /** * Returns the string which will be shown in the browser's title; defaults to using the same breadcrumb * as in the module title * * @return string */ public function getBrowserTitle() { global $app_strings; $browserTitle = $app_strings ['LBL_BROWSER_TITLE']; if ($this->module == 'Users' && ($this->action == 'SetTimezone' || $this->action == 'Login')) return $browserTitle; foreach ( $this->_getModuleTitleParams () as $value ) $browserTitle = strip_tags ( $value ) . ' » ' . $browserTitle; return $browserTitle; } }