lvd = new ListViewData();
$this->searchColumns = array () ;
}
function shouldProcess($moduleDir){
$searching = false;
$sessionSearchQuery = "{$moduleDir}2_QUERY_QUERY";
if (!empty($_SESSION[$sessionSearchQuery])) {
$searching = true;
}
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' )
&& (!$searching)))) {
$_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 = $this->getMassUpdate();
$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->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, $location="top") {
global $app_strings;
if ($pageTotal < 0)
$pageTotal = $total;
$total_label = "";
if (!empty($GLOBALS['sugar_config']['disable_count_query']) && $GLOBALS['sugar_config']['disable_count_query'] === true && $total > $pageTotal) {
$this->show_plus = true;
$total_label = $pageTotal.'+';
$total = $pageTotal;
} else {
$total_label = $total;
}
$close_inline_img = SugarThemeRegistry::current()->getImage('close_inline', 'border=0', null, null, ".gif", $app_strings['LBL_CLOSEINLINE']);
$menuItems = array(
"",
"",
"",
"",
);
$link = array(
'class' => 'clickMenu selectmenu',
'id' => 'selectLink',
'buttons' => $menuItems,
'flat' => false,
);
return $link;
}
/**
* Display the actions link
*
* @param string $id link id attribute, defaults to 'actions_link'
* @return string HTML source
*/
protected function buildActionsLink($id = 'actions_link', $location = 'top')
{
global $app_strings;
$closeText = SugarThemeRegistry::current()->getImage('close_inline', 'border=0', null, null, ".gif", $app_strings['LBL_CLOSEINLINE']);
$moreDetailImage = SugarThemeRegistry::current()->getImageURL('MoreDetail.png');
$menuItems = array();
// delete
if ( ACLController::checkAccess($this->seed->module_dir,'delete',true) && $this->delete )
$menuItems[] = $this->buildDeleteLink($location);
// compose email
if ( $this->email )
$menuItems[] = $this->buildComposeEmailLink($this->data['pageData']['offsets']['total'], $location);
// mass update
$mass = $this->getMassUpdate();
$mass->setSugarBean($this->seed);
if ( ( ACLController::checkAccess($this->seed->module_dir,'edit',true) && ACLController::checkAccess($this->seed->module_dir,'massupdate',true) ) && $this->showMassupdateFields && $mass->doMassUpdateFieldsExistForFocus() )
$menuItems[] = $this->buildMassUpdateLink($location);
// merge
if ( $this->mailMerge )
$menuItems[] = $this->buildMergeLink(null, $location);
if ( $this->mergeduplicates )
$menuItems[] = $this->buildMergeDuplicatesLink($location);
// add to target list
if ( $this->targetList && ACLController::checkAccess('ProspectLists','edit',true) )
$menuItems[] = $this->buildTargetList($location);
// export
if ( ACLController::checkAccess($this->seed->module_dir,'export',true) && $this->export )
$menuItems[] = $this->buildExportLink($location);
foreach ( $this->actionsMenuExtraItems as $item )
$menuItems[] = $item;
$link = array(
'class' => 'clickMenu selectActions fancymenu',
'id' => 'selectActions',
'name' => 'selectActions',
'buttons' => $menuItems,
'flat' => false,
);
return $link;
}
/**
* Builds the export link
*
* @return string HTML
*/
protected function buildExportLink($loc = 'top')
{
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($loc = 'top')
{
global $app_strings;
$onClick = "document.getElementById('massupdate_form').style.display = ''; var yLoc = YAHOO.util.Dom.getY('massupdate_form'); scroll(0,yLoc);";
return "{$app_strings['LBL_MASS_UPDATE']}";
}
/**
* Builds the compose email link
*
* @return string HTML
*/
protected function buildComposeEmailLink($totalCount, $loc = 'top')
{
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($loc = 'top')
{
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;
$displayStyle = $total > 0 ? "" : "display: none;";
$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($loc = 'top')
{
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 " 1) {sListView.send_form(true, \"MergeRecords\", \"index.php\", \"{$app_strings['LBL_LISTVIEW_NO_SELECTED']}\", \"{$this->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, $loc = 'top')
{
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])) {
return "' .
$app_strings['LBL_MAILMERGE'].'';
}
return $str;
}
/**
* Builds the add to target list link
*
* @return string HTML
*/
protected function buildTargetList($loc = 'top')
{
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 = ($massUpdateRun) ? 0 : (isset($_POST['select_entire_list']) ? $_POST['select_entire_list'] : (isset($_REQUEST['select_entire_list']) ? $_REQUEST['select_entire_list'] : 0));
$str .= "\n" .
"\n".
"\n".
"\n";
return $str;
}
/**
* @return MassUpdate instance
*/
protected function getMassUpdate()
{
return new MassUpdate();
}
}