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()
)
{
}
public function init(
$bean = null,
$view_object_map = array()
)
{
$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();
//For the ajaxUI, we need to use output buffering to return the page in an ajax friendly format
if ($this->_getOption('json_output')){
ob_start();
if(!empty($_REQUEST['ajax_load']) && !empty($_REQUEST['loadLanguageJS'])) {
echo $this->_getModLanguageJS();
}
}
if ($this->_getOption('show_header')) {
$this->displayHeader();
} else {
$this->renderJavascript();
}
$this->_buildModuleList();
$this->preDisplay();
$this->displayErrors();
$this->display();
if ( !empty($this->module) ) {
$GLOBALS['logic_hook']->call_custom_logic($this->module, 'after_ui_frame');
} else {
$GLOBALS['logic_hook']->call_custom_logic('', 'after_ui_frame');
}
if ($this->_getOption('show_subpanels') && !empty($_REQUEST['record'])) $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');
if ($this->_getOption('json_output'))
{
$content = ob_get_clean();
$module = $this->module;
$ajax_ret = array(
'content' => mb_detect_encoding($content) == "UTF-8" ? $content : utf8_encode($content),
'menu' => array(
'module' => $module,
'label' => translate($module),
$this->getMenu($module),
),
'moduleList' => $this->displayHeader(true),
'title' => $this->getBrowserTitle(),
'action' => isset($_REQUEST['action']) ? $_REQUEST['action'] : "",
'record' => isset($_REQUEST['record']) ? $_REQUEST['record'] : "",
'favicon' => $this->getFavicon(),
);
if(empty($this->responseTime)) $this->_calculateFooterMetrics();
$ajax_ret['responseTime'] = $this->responseTime;
$json = getJSONobj();
echo $json->encode($ajax_ret);
$GLOBALS['app']->headerDisplayed = false;
ob_flush();
}
//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()
{
$errors = '';
foreach($this->errors as $error) {
$errors .= '' . $error . '
';
}
if ( !$this->suppressDisplayErrors ) {
echo $errors;
}
else {
return $errors;
}
}
/**
* [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 = TimeDate::getInstance()->nowDb();
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($retModTabs=false)
{
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);
$ss->assign("langHeader", get_language_header());
// 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 = $this->getFavicon();
$ss->assign('FAVICON_URL', $favicon['url']);
// 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],"border='0' align='absmiddle'",null,null,'.gif',$menu_item[1]),
);
$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(),
);
if(substr($gcls[$key]["URL"], 0, 11) == "javascript:") {
$gcls[$key]["ONCLICK"] = substr($gcls[$key]["URL"],11);
$gcls[$key]["URL"] = "javascript:void(0)";
}
}
// 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),
);
if(substr($gcls[$key]['SUBMENU'][$submenulinkkey]["URL"], 0, 11) == "javascript:") {
$gcls[$key]['SUBMENU'][$submenulinkkey]["ONCLICK"] = substr($gcls[$key]['SUBMENU'][$submenulinkkey]["URL"],11);
$gcls[$key]['SUBMENU'][$submenulinkkey]["URL"] = "javascript:void(0)";
}
}
}
}
$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 ) {
$history[$key]['item_summary_short'] = getTrackerSubstring($row['item_summary']);
$history[$key]['image'] = SugarThemeRegistry::current()
->getImage($row['module_name'],'border="0" align="absmiddle"',null,null,'.gif',$row['item_summary']);
}
$ss->assign("recentRecords",$history);
}
$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) {
// We are using grouped tabs
require_once('include/GroupedTabs/GroupedTabStructure.php');
$groupedTabsClass = new GroupedTabStructure();
$modules = query_module_access_list($current_user);
//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;
}
}
$subMoreModules = false;
$groupTabs = $groupedTabsClass->get_tab_structure(get_val_array($modules));
// 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);
$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;
}
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;
}
$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);
$ss->assign('USE_GROUP_TABS',$usingGroupTabs);
// 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);
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.'
'); } } } } function getModuleMenuHTML() { } /** * 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; 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. if (!empty($this->module)) $currentModule = $this->module; require_once ($file); } protected function _displayLoginJS() { global $sugar_config, $timedate; if(isset($this->bean->module_dir)){ echo ""; } if(isset($_REQUEST['action'])){ echo ""; } echo ''; if (!is_file(sugar_cached("include/javascript/sugar_grp1.js"))) { $_REQUEST['root_directory'] = "."; require_once("jssource/minify_utils.php"); ConcatenateFiles("."); } echo getVersionedScript('cache/include/javascript/sugar_grp1_yui.js'); echo getVersionedScript('cache/include/javascript/sugar_grp1.js'); echo getVersionedScript('include/javascript/calendar.js'); echo <<