subpanel_defs=$subpanelDef;
$this->subpanel_id = $subpanel_id;
$this->parent_record_id = $record_id;
$this->parent_module = $module;
$this->layout_def_key = $layout_def_key;
$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_once '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 ListView();
}
$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 .= '' . "\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 .= ' | ';
}
$widget_contents .= '
';
return $widget_contents;
}
function ProcessSubPanelListView($xTemplatePath, &$mod_strings)
{
global $app_strings;
global $current_user;
global $sugar_config;
if(isset($this->listview)){
$ListView =& $this->listview;
}else{
$ListView = new ListView();
}
$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", SugarThemeRegistry::current()->getImage('edit_inline','align="absmiddle" alt="'.$app_strings['LNK_EDIT'].'" border="0"'));
$ListView->xTemplateAssign("DELETE_INLINE_PNG", SugarThemeRegistry::current()->getImage('delete_inline','align="absmiddle" alt="'.$app_strings['LNK_DELETE'].'" border="0"'));
$ListView->xTemplateAssign("REMOVE_INLINE_PNG", SugarThemeRegistry::current()->getImage('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= " ".SugarThemeRegistry::current()->getImage("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);";
if ( !empty($this->layout_def_key) ) {
$ListView->end_link_wrapper = '&layout_def_key='.$this->layout_def_key.$ListView->end_link_wrapper;
}
$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();
return $ob_contents;
}
function display()
{
global $timedate;
global $mod_strings;
global $app_strings;
global $app_list_strings;
global $beanList;
global $beanFiles;
global $current_language;
$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;
}
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;
}
//saves overrides for defs
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';
//bug# 40171: "Custom subpanels not working as expected"
//each custom subpanel needs to have a unique custom def file
$filename = $panel->parent_bean->object_name . "_subpanel_" . $panel->name; //bug 42262 (filename with $panel->_instance_properties['get_subpanel_data'] can create problem if had word "function" in it)
$oldName1 = '_override' . $panel->parent_bean->object_name .$panel->_instance_properties['module'] . $panel->_instance_properties['subpanel_name'] ;
$oldName2 = '_override' . $panel->parent_bean->object_name .$panel->_instance_properties['get_subpanel_data'] ;
if (file_exists('custom/Extension/modules/'. $panel->parent_bean->module_dir . "/Ext/Layoutdefs/$oldName1.php")){
unlink('custom/Extension/modules/'. $panel->parent_bean->module_dir . "/Ext/Layoutdefs/$oldName1.php");
}
if (file_exists('custom/Extension/modules/'. $panel->parent_bean->module_dir . "/Ext/Layoutdefs/$oldName2.php")){
unlink('custom/Extension/modules/'. $panel->parent_bean->module_dir . "/Ext/Layoutdefs/$oldName2.php");
}
$extname = '_override'.$filename;
//end of bug# 40171
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
// $GLOBALS['log']->debug('SubPanel.php->saveSubPanelDefOverride(): '.$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 = sugar_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 from the registered layout_defs arrays.
*/
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;
}
function _get_default_subpanel_define($module, $subpanel_id)
{
$ret_val = array();
if($subpanel_id != '')
{
$layout_defs = get_layout_defs();
if(!empty($layout_defs[$subpanel_id]['default_subpanel_define']))
{
$ret_val = $layout_defs[$subpanel_id]['default_subpanel_define'];
}
}
return $ret_val;
}
}
?>