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 = " \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 .= " ";
}
$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']}
EOHTML;
}
$helpImageURL = SugarThemeRegistry::current ()->getImageURL ( 'help.gif' );
$theTitle .= <<
{$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;
}
}