lvd = new ListViewData(); $this->searchColumns = array () ; } function shouldProcess($moduleDir){ if(!empty($GLOBALS['sugar_config']['save_query']) && $GLOBALS['sugar_config']['save_query'] == 'populate_only'){ if(empty($GLOBALS['displayListView']) && (!empty($_REQUEST['clear_query']) || $_REQUEST['module'] == $moduleDir && ((empty($_REQUEST['query']) || $_REQUEST['query'] == 'MSI' ) && (empty($_SESSION['last_search_mod']) || $_SESSION['last_search_mod'] != $moduleDir ) ))){ $_SESSION['last_search_mod'] = $_REQUEST['module'] ; $this->should_process = false; return false; } } $this->should_process = true; return true; } /** * Setup the class * @param seed SugarBean Seed SugarBean to use * @param file File Template file to use * @param string $where * @param offset:0 int offset to start at * @param int:-1 $limit * @param string[]:array() $filter_fields * @param array:array() $params * Potential $params are $params['distinct'] = use distinct key word $params['include_custom_fields'] = (on by default) $params['massupdate'] = true by default; $params['handleMassupdate'] = true by default, have massupdate.php handle massupdates? * @param string:'id' $id_field */ function setup($seed, $file, $where, $params = array(), $offset = 0, $limit = -1, $filter_fields = array(), $id_field = 'id') { $this->should_process = true; if(isset($seed->module_dir) && !$this->shouldProcess($seed->module_dir)){ return false; } if(isset($params['export'])) { $this->export = $params['export']; } if(!empty($params['multiSelectPopup'])) { $this->multi_select_popup = $params['multiSelectPopup']; } if(!empty($params['massupdate']) && $params['massupdate'] != false) { $this->show_mass_update_form = true; $this->mass = new MassUpdate(); $this->mass->setSugarBean($seed); if(!empty($params['handleMassupdate']) || !isset($params['handleMassupdate'])) { $this->mass->handleMassUpdate(); } } $this->seed = $seed; $filter_fields = $this->setupFilterFields($filter_fields); $data = $this->lvd->getListViewData($seed, $where, $offset, $limit, $filter_fields, $params, $id_field); foreach($this->displayColumns as $columnName => $def) { $seedName = strtolower($columnName); if(!empty($this->lvd->seed->field_defs[$seedName])){ $seedDef = $this->lvd->seed->field_defs[$seedName]; } if(empty($this->displayColumns[$columnName]['type'])){ if(!empty($seedDef['type'])){ $this->displayColumns[$columnName]['type'] = (!empty($seedDef['custom_type']))?$seedDef['custom_type']:$seedDef['type']; }else{ $this->displayColumns[$columnName]['type'] = ''; } }//fi empty(...) if(!empty($seedDef['options'])){ $this->displayColumns[$columnName]['options'] = $seedDef['options']; } //C.L. Fix for 11177 if($this->displayColumns[$columnName]['type'] == 'html') { $cField = $this->seed->custom_fields; if(isset($cField) && isset($cField->bean->$seedName)) { $seedName2 = strtoupper($columnName); $htmlDisplay = html_entity_decode($cField->bean->$seedName); $count = 0; while($count < count($data['data'])) { $data['data'][$count][$seedName2] = &$htmlDisplay; $count++; } } }//fi == 'html' //Bug 40511, make sure relate fields have the correct module defined if ($this->displayColumns[$columnName]['type'] == "relate" && !empty($seedDef['link']) && empty( $this->displayColumns[$columnName]['module'])) { $link = $seedDef['link']; if (!empty($this->lvd->seed->field_defs[$link]) && !empty($this->lvd->seed->field_defs[$seedDef['link']]['module'])) { $this->displayColumns[$columnName]['module'] = $this->lvd->seed->field_defs[$seedDef['link']]['module']; } } if (!empty($seedDef['sort_on'])) { $this->displayColumns[$columnName]['orderBy'] = $seedDef['sort_on']; } if(isset($seedDef)){ // Merge the two arrays together, making sure the seedDef doesn't override anything explicitly set in the displayColumns array. $this->displayColumns[$columnName] = $this->displayColumns[$columnName] + $seedDef; } //C.L. Bug 38388 - ensure that ['id'] is set for related fields if(!isset($this->displayColumns[$columnName]['id']) && isset($this->displayColumns[$columnName]['id_name'])) { $this->displayColumns[$columnName]['id'] = strtoupper($this->displayColumns[$columnName]['id_name']); } } $this->process($file, $data, $seed->object_name); return true; } function setupFilterFields($filter_fields = array()) { // create filter fields based off of display columns if(empty($filter_fields) || $this->mergeDisplayColumns) { foreach($this->displayColumns as $columnName => $def) { $filter_fields[strtolower($columnName)] = true; if(isset($this->seed->field_defs[strtolower($columnName)]['type']) && strtolower($this->seed->field_defs[strtolower($columnName)]['type']) == 'currency' && isset($this->seed->field_defs['currency_id'])) { $filter_fields['currency_id'] = true; } if(!empty($def['related_fields'])) { foreach($def['related_fields'] as $field) { //id column is added by query construction function. This addition creates duplicates //and causes issues in oracle. #10165 if ($field != 'id') { $filter_fields[$field] = true; } } } if (!empty($this->seed->field_defs[strtolower($columnName)]['db_concat_fields'])) { foreach($this->seed->field_defs[strtolower($columnName)]['db_concat_fields'] as $index=>$field){ if(!isset($filter_fields[strtolower($field)]) || !$filter_fields[strtolower($field)]) { $filter_fields[strtolower($field)] = true; } } } } foreach ($this->searchColumns as $columnName => $def ) { $filter_fields[strtolower($columnName)] = true; } } return $filter_fields; } /** * Any additional processing * @param file File template file to use * @param data array row data * @param html_var string html string to be passed back and forth */ function process($file, $data, $htmlVar) { $this->rowCount = count($data['data']); $this->moduleString = $data['pageData']['bean']['moduleDir'] . '2_' . strtoupper($htmlVar) . '_offset'; } /** * Display the listview * @return string ListView contents */ public function display() { if (!$this->should_process) { return ''; } $str = ''; if ($this->multiSelect == true && $this->show_mass_update_form) { $str = $this->mass->getDisplayMassUpdateForm(true, $this->multi_select_popup).$this->mass->getMassUpdateFormHeader($this->multi_select_popup); } return $str; } /** * Display the select link * @return string select link html * @param echo Bool set true if you want it echo'd, set false to have contents returned */ function buildSelectLink($id = 'select_link', $total=0, $pageTotal=0) { global $app_strings; if ($pageTotal < 0) $pageTotal = $total; $plus = ''; if (!empty($GLOBALS['sugar_config']['disable_count_query']) && $total > $pageTotal) { $plus = '+'; $this->show_plus = true; } $script = ""; $script .= "".""; return $script; } /** * Display the actions link * * @param string $id link id attribute, defaults to 'actions_link' * @return string HTML source */ protected function buildActionsLink( $id = 'actions_link' ) { global $app_strings; $closeText = ""; $moreDetailImage = SugarThemeRegistry::current()->getImageURL('MoreDetail.png'); $menuItems = ''; // delete if ( ACLController::checkAccess($this->seed->module_dir,'delete',true) && $this->delete ) $menuItems .= $this->buildDeleteLink(); // compose email if ( $this->email ) $menuItems .= $this->buildComposeEmailLink($this->data['pageData']['offsets']['total']); // mass update $mass = new MassUpdate(); $mass->setSugarBean($this->seed); if ( ACLController::checkAccess($this->seed->module_dir,'edit',true) && $this->showMassupdateFields && $mass->doMassUpdateFieldsExistForFocus() ) $menuItems .= $this->buildMassUpdateLink(); // merge if ( $this->mailMerge ) $menuItems .= $this->buildMergeLink(); if ( $this->mergeduplicates ) $menuItems .= $this->buildMergeDuplicatesLink(); // add to target list if ( $this->targetList && ACLController::checkAccess('ProspectLists','edit',true) ) $menuItems .= $this->buildTargetList(); // export if ( ACLController::checkAccess($this->seed->module_dir,'export',true) && $this->export ) $menuItems .= $this->buildExportLink(); foreach ( $this->actionsMenuExtraItems as $item ) $menuItems .= $item; $menuItems = str_replace('"','\"',$menuItems); $menuItems = str_replace(array("\r","\n"),'',$menuItems); if ( empty($menuItems) ) return ''; return << {$app_strings['LBL_LINK_ACTIONS']}  EOHTML; } /** * Builds the export link * * @return string HTML */ protected function buildExportLink() { global $app_strings; return "seed->module_dir}', 'index.php?entryPoint=export','{$app_strings['LBL_LISTVIEW_NO_SELECTED']}')\">{$app_strings['LBL_EXPORT']}"; } /** * Builds the massupdate link * * @return string HTML */ protected function buildMassUpdateLink() { global $app_strings; return "{$app_strings['LBL_MASS_UPDATE']}"; } /** * Builds the compose email link * * @return string HTML */ protected function buildComposeEmailLink( $totalCount ) { global $app_strings,$dictionary; if (!is_array($this->seed->field_defs)) { return ''; } $foundEmailField = false; // Search for fields that look like an email address foreach ($this->seed->field_defs as $field) { if(isset($field['type'])&&$field['type']=='link' &&isset($field['relationship'])&&isset($dictionary[$this->seed->object_name]['relationships'][$field['relationship']]) &&$dictionary[$this->seed->object_name]['relationships'][$field['relationship']]['rhs_module']=='EmailAddresses') { $foundEmailField = true; break; } } if (!$foundEmailField) { return ''; } $userPref = $GLOBALS['current_user']->getPreference('email_link_type'); $defaultPref = $GLOBALS['sugar_config']['email_default_client']; if($userPref != '') $client = $userPref; else $client = $defaultPref; if($client == 'sugar') $script = "seed->module_dir.'\', \''.$totalCount.'\', \''.$app_strings['LBL_LISTVIEW_LESS_THAN_TEN_SELECT'].'\')">' . $app_strings['LBL_EMAIL_COMPOSE'] . ''; else $script = "" . $app_strings['LBL_EMAIL_COMPOSE'] . ''; return $script; } // fn /** * Builds the delete link * * @return string HTML */ protected function buildDeleteLink() { global $app_strings; return "{$app_strings['LBL_DELETE_BUTTON_LABEL']}"; } /** * Display the selected object span object * * @return string select object span */ function buildSelectedObjectsSpan($echo = true, $total=0) { global $app_strings; $selectedObjectSpan = "{$app_strings['LBL_LISTVIEW_SELECTED_OBJECTS']}"; return $selectedObjectSpan; } /** * Builds the mail merge link * The link can be disabled by setting module level duplicate_merge property to false * in the moudle's vardef file. * * @return string HTML */ protected function buildMergeDuplicatesLink() { global $app_strings, $dictionary; $return_string=''; $return_string.= isset($_REQUEST['module']) ? "&return_module={$_REQUEST['module']}" : ""; $return_string.= isset($_REQUEST['action']) ? "&return_action={$_REQUEST['action']}" : ""; $return_string.= isset($_REQUEST['record']) ? "&return_id={$_REQUEST['record']}" : ""; //need delete and edit access. if (!(ACLController::checkAccess($this->seed->module_dir, 'edit', true)) or !(ACLController::checkAccess($this->seed->module_dir, 'delete', true))) { return ''; } if (isset($dictionary[$this->seed->object_name]['duplicate_merge']) && $dictionary[$this->seed->object_name]['duplicate_merge']==true ) { return "seed->module_dir}\",\"$return_string\");} else {alert(\"{$app_strings['LBL_LISTVIEW_TWO_REQUIRED']}\");return false;}'>". $app_strings['LBL_MERGE_DUPLICATES'].''; } return ''; } /** * Builds the mail merge link * * @return string HTML */ protected function buildMergeLink(array $modules_array = null) { if ( empty($modules_array) ) { require('modules/MailMerge/modules_array.php'); } global $current_user, $app_strings; $admin = new Administration(); $admin->retrieveSettings('system'); $user_merge = $current_user->getPreference('mailmerge_on'); $module_dir = (!empty($this->seed->module_dir) ? $this->seed->module_dir : ''); $str = ''; if ($user_merge == 'on' && isset($admin->settings['system_mailmerge_on']) && $admin->settings['system_mailmerge_on'] && !empty($modules_array[$module_dir])) { $str = "' . $app_strings['LBL_MAILMERGE'].''; } return $str; } /** * Builds the add to target list link * * @return string HTML */ protected function buildTargetList() { global $app_strings; unset($_REQUEST[session_name()]); unset($_REQUEST['PHPSESSID']); $current_query_by_page = base64_encode(serialize($_REQUEST)); $js = <<seed->module_dir}' ); input.setAttribute ( 'type' , 'hidden' ); form.appendChild ( input ) ; var input = document.createElement('input'); input.setAttribute ( 'name' , 'action' ); input.setAttribute ( 'value' , 'TargetListUpdate' ); input.setAttribute ( 'type' , 'hidden' ); form.appendChild ( input ) ; } if ( !form.uids ) { var input = document.createElement('input'); input.setAttribute ( 'name' , 'uids' ); input.setAttribute ( 'type' , 'hidden' ); form.appendChild ( input ) ; } if ( !form.prospect_list ) { var input = document.createElement('input'); input.setAttribute ( 'name' , 'prospect_list' ); input.setAttribute ( 'type' , 'hidden' ); form.appendChild ( input ) ; } if ( !form.return_module ) { var input = document.createElement('input'); input.setAttribute ( 'name' , 'return_module' ); input.setAttribute ( 'type' , 'hidden' ); form.appendChild ( input ) ; } if ( !form.return_action ) { var input = document.createElement('input'); input.setAttribute ( 'name' , 'return_action' ); input.setAttribute ( 'type' , 'hidden' ); form.appendChild ( input ) ; } if ( !form.select_entire_list ) { var input = document.createElement('input'); input.setAttribute ( 'name' , 'select_entire_list' ); input.setAttribute ( 'value', document.MassUpdate.select_entire_list.value); input.setAttribute ( 'type' , 'hidden' ); form.appendChild ( input ) ; } if ( !form.current_query_by_page ) { var input = document.createElement('input'); input.setAttribute ( 'name' , 'current_query_by_page' ); input.setAttribute ( 'value', '{$current_query_by_page}' ); input.setAttribute ( 'type' , 'hidden' ); form.appendChild ( input ) ; } open_popup('ProspectLists','600','400','',true,false,{ 'call_back_function':'set_return_and_save_targetlist','form_name':'targetlist_form','field_to_name_array':{'id':'prospect_list'} } ); EOF; $js = str_replace(array("\r","\n"),'',$js); return "{$app_strings['LBL_ADD_TO_PROSPECT_LIST_BUTTON_LABEL']}"; } /** * Display the bottom of the ListView (ie MassUpdate * @return string contents */ public function displayEnd() { $str = ''; if($this->show_mass_update_form) { $str .= $this->mass->getMassUpdateForm(true); $str .= $this->mass->endMassUpdateForm(); } return $str; } /** * Display the multi select data box etc. * @return string contents */ public function getMultiSelectData() { $str = "\n"; $massUpdateRun = isset($_REQUEST['massupdate']) && $_REQUEST['massupdate'] == 'true'; $uids = empty($_REQUEST['uid']) || $massUpdateRun ? '' : $_REQUEST['uid']; $select_entire_list = isset($_REQUEST['select_entire_list']) && !$massUpdateRun ? $_REQUEST['select_entire_list'] : 0; $str .= "\n" . "\n". "\n". "\n"; return $str; } } ?>