subpanel_defs = $subpanelDef; $this->subpanel_id = $subpanel_id; $this->parent_record_id = $record_id; $this->parent_module = $module; $this->parent_bean = $focus; $result = $focus; if (empty ( $result )) { $parent_bean_name = $beanList [$module]; $parent_bean_file = $beanFiles [$parent_bean_name]; require_once ($parent_bean_file); $this->parent_bean = new $parent_bean_name ( ); $this->parent_bean->retrieve ( $this->parent_record_id ); $result = $this->parent_bean; } if ($record_id != 'fab4' && $result == null) { sugar_die ( $app_strings ['ERROR_NO_RECORD'] ); } if (empty ( $subpanelDef )) { //load the subpanel by name. if (! class_exists ( 'MyClass' )) { require ('include/SubPanel/SubPanelDefinitions.php'); } $panelsdef = new SubPanelDefinitions ( $result, $layout_def_key ); $subpanelDef = $panelsdef->load_subpanel ( $subpanel_id ); $this->subpanel_defs = $subpanelDef; } } function setTemplateFile($template_file) { $this->template_file = $template_file; } function setBeanList(&$value) { $this->bean_list = $value; } function setHideNewButton($value) { $this->hideNewButton = $value; } function getHeaderText($currentModule) { } function get_buttons($panel_query = null) { $thisPanel = & $this->subpanel_defs; $subpanel_def = $thisPanel->get_buttons (); if (! isset ( $this->listview )) { $this->listview = new EcmCallsListView ( ); } $layout_manager = $this->listview->getLayoutManager (); $widget_contents = '
'; foreach ( $subpanel_def as $widget_data ) { $widget_data ['query'] = urlencode ( $panel_query ); $widget_data ['action'] = $_REQUEST ['action']; $widget_data ['module'] = $thisPanel->get_inst_prop_value ( 'module' ); $widget_data ['focus'] = $this->parent_bean; $widget_data ['subpanel_definition'] = $thisPanel; $widget_contents .= ''; } $widget_contents .= '
' . "\n"; if (empty ( $widget_data ['widget_class'] )) { $widget_contents .= "widget_class not defined for top subpanel buttons"; } else { $widget_contents .= $layout_manager->widgetDisplay ( $widget_data ); } $widget_contents .= '
'; return $widget_contents; } function ProcessSubPanelListView($xTemplatePath,&$mod_strings) { global $app_strings; global $image_path; global $current_user; global $sugar_config; if (isset ( $this->listview )) { $ListView = & $this->listview; } else { $ListView = new EcmCallsListView ( ); } $ListView->initNewXTemplate ( $xTemplatePath, $this->subpanel_defs->mod_strings ); $ListView->xTemplateAssign ( "RETURN_URL", "&return_module=" . $this->parent_module . "&return_action=DetailView&return_id=" . $this->parent_bean->id ); $ListView->xTemplateAssign ( "RELATED_MODULE", $this->parent_module ); // TODO: what about unions? $ListView->xTemplateAssign ( "RECORD_ID", $this->parent_bean->id ); $ListView->xTemplateAssign ( "EDIT_INLINE_PNG", get_image ( $image_path . 'edit_inline', 'align="absmiddle" alt="' . $app_strings ['LNK_EDIT'] . '" border="0"' ) ); $ListView->xTemplateAssign ( "DELETE_INLINE_PNG", get_image ( $image_path . 'delete_inline', 'align="absmiddle" alt="' . $app_strings ['LNK_DELETE'] . '" border="0"' ) ); $ListView->xTemplateAssign ( "REMOVE_INLINE_PNG", get_image ( $image_path . 'delete_inline', 'align="absmiddle" alt="' . $app_strings ['LNK_REMOVE'] . '" border="0"' ) ); $header_text = ''; if (is_admin ( $current_user ) && $_REQUEST ['module'] != 'DynamicLayout' && ! empty ( $_SESSION ['editinplace'] )) { $exploded = explode ( '/', $xTemplatePath ); $file_name = $exploded [sizeof ( $exploded ) - 1]; $mod_name = $exploded [sizeof ( $exploded ) - 2]; $header_text = " " . get_image ( $image_path . "EditLayout", "border='0' alt='Edit Layout' align='bottom'" ) . ""; } $ListView->setHeaderTitle ( '' ); $ListView->setHeaderText ( '' ); ob_start (); $ListView->is_dynamic = true; $ListView->records_per_page = $sugar_config ['list_max_entries_per_subpanel'] + 0; $ListView->start_link_wrapper = "javascript:showSubPanel('" . $this->subpanel_id . "','"; $ListView->subpanel_id = $this->subpanel_id; $ListView->end_link_wrapper = "',true);"; $where = ''; $ListView->setQuery ( $where, '', '', '' ); $ListView->show_export_button = false; //function returns the query that was used to populate sub-panel data. $query = $ListView->process_dynamic_listview ( $this->parent_module, $this->parent_bean, $this->subpanel_defs ); $this->subpanel_query = $query; $ob_contents = ob_get_contents (); ob_end_clean (); $ob_contents = str_replace('action=SubPanelViewerMy','action=SubPanelViewer',$ob_contents); $ob_contents = str_replace('action=SubPanelViewer','action=SubPanelViewerMy',$ob_contents); return $ob_contents; } /* * Display the subpanel */ function display() { global $timedate; global $mod_strings; global $app_strings; global $app_list_strings; global $gridline, $theme; global $beanList; global $beanFiles; global $current_language; require_once ('themes/' . $theme . '/layout_utils.php'); $image_path = 'themes/' . $theme . '/images/'; $result_array = array ( ); $return_string = $this->ProcessSubPanelListView ( $this->template_file, $result_array ); print $return_string; } function getModulesWithSubpanels() { global $beanList; $dir = dir ( 'modules' ); $modules = array ( ); while ( $entry = $dir->read () ) { if (file_exists ( 'modules/' . $entry . '/layout_defs.php' )) { $modules [$entry] = $entry; } } return $modules; } /* * Get an array of subpanels for this module */ function getModuleSubpanels($module) { require_once ('include/SubPanel/SubPanelDefinitions.php'); global $beanList, $beanFiles; if (! isset ( $beanList [$module] )) { return array ( ); } $class = $beanList [$module]; require_once ($beanFiles [$class]); $mod = new $class ( ); $spd = new SubPanelDefinitions ( $mod ); $tabs = $spd->get_available_tabs (true); $ret_tabs = array ( ); $reject_tabs = array ('history' => 1, 'activities' => 1 ); foreach ( $tabs as $key => $tab ) { foreach($tab as $k=>$v){ if (! isset ( $reject_tabs [$k] )) { $ret_tabs [$k] = $v; } } } return $ret_tabs; } /* * Update the definition for a subpanel * Creates the new definition in the Ext directory and then uses the module installer to activate the new definition * @param panel A string identifier for the subpanel to update * @param subsection The section of the definition to be overridden (for example, * @param override The new definition as an Array */ function saveSubPanelDefOverride($panel,$subsection,$override) { global $layout_defs, $beanList; //save the new subpanel $name = "subpanel_layout['list_fields']"; //bugfix: load looks for moduleName/metadata/subpanels, not moduleName/subpanels $path = 'custom/modules/' . $panel->_instance_properties ['module'] . '/metadata/subpanels'; $filename = $panel->parent_bean->object_name . $panel->_instance_properties ['subpanel_name']; mkdir_recursive ( $path, true ); write_array_to_file ( $name, $override, $path . '/' . $filename . '.php' ); //save the override for the layoutdef $name = "layout_defs['" . $panel->parent_bean->module_dir . "']['subpanel_setup']['" . strtolower ( $panel->name ) . "']"; // tyoung 10.12.07 pushed panel->name to lowercase to match case in subpaneldefs.php files - gave error on bad index 'module' as this override key didn't match the key in the subpaneldefs $extname = '_override' . $panel->parent_bean->object_name . $panel->_instance_properties ['module'] . $panel->_instance_properties ['subpanel_name']; $newValue = override_value_to_string ( $name, 'override_subpanel_name', $filename ); mkdir_recursive ( 'custom/Extension/modules/' . $panel->parent_bean->module_dir . '/Ext/Layoutdefs', true ); $fp = fopen ( 'custom/Extension/modules/' . $panel->parent_bean->module_dir . "/Ext/Layoutdefs/$extname.php", 'w' ); fwrite ( $fp, "" ); fclose ( $fp ); require_once ('ModuleInstall/ModuleInstaller.php'); $moduleInstaller = new ModuleInstaller ( ); $moduleInstaller->silent = true; // make sure that the ModuleInstaller->log() function doesn't echo while rebuilding the layoutdefs $moduleInstaller->rebuild_layoutdefs (); if (file_exists ( 'modules/' . $panel->parent_bean->module_dir . '/layout_defs.php' )) include ('modules/' . $panel->parent_bean->module_dir . '/layout_defs.php'); if (file_exists ( 'custom/modules/' . $panel->parent_bean->module_dir . '/Ext/Layoutdefs/layoutdefs.ext.php' )) include ('custom/modules/' . $panel->parent_bean->module_dir . '/Ext/Layoutdefs/layoutdefs.ext.php'); } function get_subpanel_setup($module) { $subpanel_setup = ''; $layout_defs = get_layout_defs (); if (! empty ( $layout_defs ) && ! empty ( $layout_defs [$module] ['subpanel_setup'] )) { $subpanel_setup = $layout_defs [$module] ['subpanel_setup']; } return $subpanel_setup; } /** * Retrieve the subpanel definition for a specified subpanel * The definition is a merge of the default definition and any custom definition * @param module The module name * @param subpanel_id Subpanel identifier (string) * @return Array */ function getSubPanelDefine($module,$subpanel_id) { $default_subpanel_define = SubPanel::_get_default_subpanel_define ( $module, $subpanel_id ); $custom_subpanel_define = SubPanel::_get_custom_subpanel_define ( $module, $subpanel_id ); $subpanel_define = array_merge ( $default_subpanel_define, $custom_subpanel_define ); if (empty ( $subpanel_define )) { print ('Could not load subpanel definition for: ' . $subpanel_id); } return $subpanel_define; } function _get_custom_subpanel_define($module,$subpanel_id) { $ret_val = array ( ); if ($subpanel_id != '') { $layout_defs = get_layout_defs (); if (! empty ( $layout_defs [$module] ['custom_subpanel_defines'] [$subpanel_id] )) { $ret_val = $layout_defs [$module] ['custom_subpanel_defines'] [$subpanel_id]; } } return $ret_val; } /* * @param module Not used (?) * @param subpanel_id Subpanel Identifier (string) */ function _get_default_subpanel_define($module,$subpanel_id) { $ret_val = array ( ); if ($subpanel_id != '') { $layout_defs = get_layout_defs (); // just get the global $layout_defs... if (! empty ( $layout_defs [$subpanel_id] ['default_subpanel_define'] )) { $ret_val = $layout_defs [$subpanel_id] ['default_subpanel_define']; } } return $ret_val; } } ?>