mirror of
https://github.com/salesagility/SuiteCRM.git
synced 2024-11-24 08:36:48 +00:00
447 lines
22 KiB
PHP
Executable File
447 lines
22 KiB
PHP
Executable File
<?php
|
|
if (!defined('sugarEntry') || !sugarEntry) {
|
|
die('Not A Valid Entry Point');
|
|
}
|
|
/**
|
|
*
|
|
* SugarCRM Community Edition is a customer relationship management program developed by
|
|
* SugarCRM, Inc. Copyright (C) 2004-2013 SugarCRM Inc.
|
|
*
|
|
* SuiteCRM is an extension to SugarCRM Community Edition developed by SalesAgility Ltd.
|
|
* Copyright (C) 2011 - 2018 SalesAgility Ltd.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it under
|
|
* the terms of the GNU Affero General Public License version 3 as published by the
|
|
* Free Software Foundation with the addition of the following permission added
|
|
* to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
|
|
* IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
|
|
* OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License along with
|
|
* this program; if not, see http://www.gnu.org/licenses or write to the Free
|
|
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
* 02110-1301 USA.
|
|
*
|
|
* You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
|
|
* SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
|
|
*
|
|
* The interactive user interfaces in modified source and object code versions
|
|
* of this program must display Appropriate Legal Notices, as required under
|
|
* Section 5 of the GNU Affero General Public License version 3.
|
|
*
|
|
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
|
|
* these Appropriate Legal Notices must retain the display of the "Powered by
|
|
* SugarCRM" logo and "Supercharged by SuiteCRM" logo. If the display of the logos is not
|
|
* reasonably feasible for technical reasons, the Appropriate Legal Notices must
|
|
* display the words "Powered by SugarCRM" and "Supercharged by SuiteCRM".
|
|
*/
|
|
|
|
|
|
/**
|
|
* DetailView - display single record
|
|
* @api
|
|
*/
|
|
#[\AllowDynamicProperties]
|
|
class DetailView extends ListView
|
|
{
|
|
public $list_row_count = null;
|
|
public $return_to_list_only=false;
|
|
public $offset_key_mismatch=false;
|
|
public $no_record_found=false;
|
|
|
|
public function __construct()
|
|
{
|
|
parent::__construct();
|
|
|
|
global $theme, $app_strings, $currentModule;
|
|
$this->local_theme = $theme;
|
|
$this->local_app_strings =$app_strings;
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
* @param string $html_varName
|
|
* @param SugarBean $seed
|
|
* @param int $offset
|
|
* @return SugarBean
|
|
*/
|
|
public function processSugarBean($html_varName, $seed, $offset)
|
|
{
|
|
global $row_count, $sugar_config;
|
|
|
|
global $next_offset;
|
|
global $previous_offset;
|
|
global $list_view_row_count;
|
|
global $current_offset;
|
|
if (!empty($sugar_config['disable_vcr'])) {
|
|
$seed->retrieve($_REQUEST['record']);
|
|
return $seed;
|
|
}
|
|
$isfirstview = 0;
|
|
|
|
$nav_history_set=false;
|
|
$nav_history_array=array();
|
|
$nav_offset='';
|
|
$nav_ids_visited=array();
|
|
$nav_stamp='';
|
|
|
|
//from list offset is there but $bNavHistorySet is false.
|
|
//from next,previous,start and end buttons offset and $bNavHistorySet is true.
|
|
//from tracker offset is not there but $bNavHistorySet may or may not exist.
|
|
if (isset($_REQUEST['offset']) && !empty($_REQUEST['offset'])) {
|
|
//get offset values.
|
|
$offset = $_REQUEST['offset'];
|
|
if ($offset < 0) {
|
|
$offset = 0;
|
|
}
|
|
//if the stamp has changed, ignore the offset and navigate to the record.
|
|
//use case, search, navigate to detail, copy URL, search again, paste URL.
|
|
if (!$this->isRequestFromListView($html_varName)) {
|
|
$result = $seed->retrieve($_REQUEST['record']);
|
|
return $result;
|
|
}
|
|
|
|
if ($nav_history_set) {
|
|
if (isset($nav_ids_visited[$offset])) {
|
|
unset($nav_ids_visited[$offset]);
|
|
}
|
|
}
|
|
} else {
|
|
if ($nav_history_set) {
|
|
//try to locate the ID in the nav_history array.
|
|
|
|
$key = array_search($_REQUEST['record'], $nav_ids_visited, true);
|
|
if ($key === false) {
|
|
//do not show the VCR buttons.
|
|
|
|
$result = $seed->retrieve($_REQUEST['record']);
|
|
return $result;
|
|
}
|
|
$offset=$key;
|
|
$_REQUEST['offset'] = $offset;
|
|
$_GET['offset'] = $offset;
|
|
$_POST['offset'] = $offset;
|
|
|
|
$_REQUEST['stamp'] = $nav_stamp;
|
|
$_GET['stamp'] = $nav_stamp;
|
|
$_POST['stamp'] = $nav_stamp;
|
|
if (isset($nav_ids_visited[$offset])) {
|
|
unset($nav_ids_visited[$offset]);
|
|
}
|
|
} else {
|
|
if (!empty($seed->id)) {
|
|
return $seed;
|
|
}
|
|
|
|
$result = $seed->retrieve($_REQUEST['record']);
|
|
return $result;
|
|
}
|
|
}
|
|
|
|
//Check if this is the first time we have viewed this record
|
|
$var = $this->getLocalSessionVariable($html_varName, "IS_FIRST_VIEW");
|
|
if (!isset($var) || !$var) {
|
|
$isFirstView = true;
|
|
} else {
|
|
$isFirstView = false;
|
|
}
|
|
//indicate that this is not the first time anymore
|
|
$this->setLocalSessionVariable($html_varName, "IS_FIRST_VIEW", false);
|
|
|
|
// All 3 databases require this because the limit query does a > db_offset comparison.
|
|
$db_offset=$offset-1;
|
|
|
|
$this->populateQueryWhere($isFirstView, $html_varName);
|
|
|
|
$accessWhere = $seed->buildAccessWhere('view');
|
|
if (!empty($accessWhere)) {
|
|
$this->query_where .= empty($this->query_where) ? $accessWhere : ' AND ' . $accessWhere;
|
|
}
|
|
|
|
$order = $this->getLocalSessionVariable($seed->module_dir.'2_'.$html_varName, "ORDER_BY");
|
|
$orderBy = '';
|
|
if (!empty($order['orderBy'])) {
|
|
$orderBy = $order['orderBy'];
|
|
}
|
|
if (!empty($orderBy) && !empty($order['direction'])) {
|
|
$orderBy .= ' ' . $order['direction'];
|
|
}
|
|
|
|
$this->query_orderby = $seed->process_order_by($orderBy, null);
|
|
$current_offset = $_REQUEST['offset'] -1;
|
|
$response = $seed->process_detail_query(SugarVCR::retrieve($seed->module_dir), 0, -1, -1, '', $current_offset);
|
|
//$response = $seed->get_detail(, $this->query_where, $db_offset);
|
|
$object = $response['bean'];
|
|
$row_count = $response['row_count'];
|
|
$next_offset = $response['next_offset'];
|
|
$previous_offset = $response['previous_offset'];
|
|
$list_view_row_count = $row_count;
|
|
$this->setListViewRowCount($row_count);
|
|
|
|
//if the retrieved id is not same as the request ID then hide the VCR buttons.
|
|
if (empty($object->id)) {
|
|
$this->no_record_found=true;
|
|
}
|
|
if (empty($_REQUEST['InDetailNav']) && strcmp($_REQUEST['record'], $object->id)!=0) {
|
|
$this->offset_key_mismatch=true;
|
|
}
|
|
if ($this->no_record_found || $this->offset_key_mismatch) {
|
|
if ($nav_history_set) {
|
|
$this->return_to_list_only=true;
|
|
}
|
|
$result = $seed->retrieve($_REQUEST['record']);
|
|
return $result;
|
|
}
|
|
|
|
//update the request with correct value for the record attribute.
|
|
//need only when using the VCR buttons. This is a workaround need to fix the values
|
|
//set in the VCR links.
|
|
$_REQUEST['record'] = $object->id;
|
|
$_GET['record'] = $object->id;
|
|
$_POST['record'] = $object->id;
|
|
|
|
//set nav_history.
|
|
if (empty($nav_stamp)) {
|
|
$nav_stamp=$_GET['stamp'];
|
|
}
|
|
if (empty($nav_offset)) {
|
|
$nav_offset=$offset;
|
|
}
|
|
|
|
return $object;
|
|
}
|
|
|
|
public function populateQueryWhere($isfirstview, $html_varName)
|
|
{
|
|
if ($isfirstview) {
|
|
$this->query_where = $this->getVariableFromSession($_REQUEST['module'], 'QUERY_WHERE');
|
|
|
|
//this is a fail safe, in case the old ListView is still in use
|
|
if (empty($this->query_where)) {
|
|
$this->query_where = $this->getLocalSessionVariable($html_varName, "QUERY_WHERE");
|
|
}
|
|
//SETTING QUERY FOR LATER USE
|
|
$this->setSessionVariable("QUERY_DETAIL", "where", $this->query_where);
|
|
} else {
|
|
$this->query_where = $this->getSessionVariable("QUERY_DETAIL", "where");
|
|
}
|
|
}
|
|
|
|
public function processListNavigation($xtpl, $html_varName, $current_offset, $display_audit_link = false, $next_offset = null, $previous_offset = null, $row_count = null, $sugarbean = null, $subpanel_def = null, $col_count = 20)
|
|
{
|
|
global $export_module, $sugar_config, $current_user;
|
|
//intialize audit_link
|
|
$audit_link = '';
|
|
|
|
$row_count = $this->getListViewRowCount();
|
|
|
|
if ($display_audit_link && (!isset($sugar_config['disc_client']) || $sugar_config['disc_client'] == false)) {
|
|
//Audit link
|
|
$popup_request_data = array(
|
|
'call_back_function' => 'set_return',
|
|
'form_name' => 'EditView',
|
|
'field_to_name_array' => array(),
|
|
);
|
|
$json = getJSONobj();
|
|
$encoded_popup_request_data = $json->encode($popup_request_data);
|
|
$audit_link = "<a href='javascript:void(0)' onclick='open_popup(\"Audit\", \"600\", \"400\", \"&record=".$_REQUEST['record']."&module_name=".$_REQUEST['module']."\", true, false, $encoded_popup_request_data);'>".$this->local_app_strings['LNK_VIEW_CHANGE_LOG']."</a>";
|
|
}
|
|
|
|
$html_text = "";
|
|
$pre_html_text = "";
|
|
$pre_html_text .= "<tr class='pagination'>\n";
|
|
$pre_html_text .= "<td COLSPAN=\"20\">\n";
|
|
$pre_html_text .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\"><tr><td style=\"text-align: left\" > ".$audit_link."</td>\n";
|
|
|
|
|
|
|
|
if ($this->return_to_list_only == true) {
|
|
if ($current_offset != 0 && $this->isRequestFromListView($html_varName)) {
|
|
if ($current_offset < 0) {
|
|
$current_offset = 1;
|
|
} else {
|
|
if ($current_offset > $row_count) {
|
|
$current_offset = $row_count;
|
|
}
|
|
}
|
|
|
|
$this->set_base_URL($html_varName);
|
|
$list_URL = $this->base_URL.'&action=index&module='.$_REQUEST['module'];
|
|
$current_page = floor($current_offset / $this->records_per_page) * $this->records_per_page;
|
|
|
|
$list_URL .= '&'.$this->getSessionVariableName($html_varName, "offset").'='.$current_page;
|
|
//$list_link = "<a href=\"$list_URL\" >".$this->local_app_strings['LNK_LIST_RETURN']." </a>";
|
|
$list_link = "<button type='button' class='button' title='{$GLOBALS['app_strings']['LNK_LIST_RETURN']}' onClick='location.href=\"$list_URL\";'>".$this->local_app_strings['LNK_LIST_RETURN']."</button>";
|
|
|
|
$html_text .= "<td nowrap align='right' scope='row'>".$list_link;
|
|
|
|
if ($row_count != 0) {
|
|
$resume_URL = $this->base_URL.$current_offset."&InDetailNav=1";
|
|
//$resume_link = "<a href=\"$resume_URL\" >".$this->local_app_strings['LNK_RESUME']." </a>";
|
|
$resume_link = "<button type='button' class='button' title='$this->local_app_strings['LNK_RESUME']' onClick='location.href=\"$resume_URL\";'>".$this->local_app_strings['LNK_RESUME']."</button>";
|
|
|
|
$html_text .= " ".$resume_link;
|
|
}
|
|
$html_text .= "</td>";
|
|
}
|
|
} else {
|
|
if ($current_offset != 0 && $this->isRequestFromListView($html_varName)) {
|
|
if ($current_offset < 0) {
|
|
$current_offset = 1;
|
|
} else {
|
|
if ($current_offset > $row_count) {
|
|
$current_offset = $row_count;
|
|
}
|
|
}
|
|
|
|
$next_offset = $current_offset + 1;
|
|
$previous_offset = $current_offset - 1;
|
|
|
|
$this->set_base_URL($html_varName);
|
|
|
|
$start_URL = $this->base_URL."1"."&InDetailNav=1";
|
|
$current_URL = $this->base_URL.$current_offset."&InDetailNav=1";
|
|
$previous_URL = $this->base_URL.$previous_offset."&InDetailNav=1";
|
|
$next_URL = $this->base_URL.$next_offset."&InDetailNav=1";
|
|
$end_URL = $this->base_URL.$row_count."&InDetailNav=1";
|
|
|
|
$current_page = floor($current_offset / $this->records_per_page) * $this->records_per_page;
|
|
|
|
if (1 == $current_offset) {
|
|
//$start_link = SugarThemeRegistry::current()->getImage("start_off","border='0' align='absmiddle'",null,null,'.gif',$this->local_app_strings['LNK_LIST_START'])." ".$this->local_app_strings['LNK_LIST_START'];
|
|
//$previous_link = SugarThemeRegistry::current()->getImage("previous_off","border='0' align='absmiddle'",null,null,'.gif',$this->local_app_strings['LNK_LIST_PREVIOUS'])." ".$this->local_app_strings['LNK_LIST_PREVIOUS']."";
|
|
$start_link = "<button type='button' title='{$this->local_app_strings['LNK_LIST_START']}' class='button' disabled>".SugarThemeRegistry::current()->getImage("start_off", "border='0' align='absmiddle'", null, null, '.gif', $this->local_app_strings['LNK_LIST_START'])."</button>";
|
|
$previous_link = "<button type='button' title='{$this->local_app_strings['LNK_LIST_PREVIOUS']}' class='button' disabled>".SugarThemeRegistry::current()->getImage("previous_off", "border='0' align='absmiddle'", null, null, '.gif', $this->local_app_strings['LNK_LIST_PREVIOUS'])."</button>";
|
|
} else {
|
|
//$start_link = "<a href=\"$start_URL\">".SugarThemeRegistry::current()->getImage("start","border='0' align='absmiddle'",null,null,'.gif',$this->local_app_strings['LNK_LIST_START'])."</a> <a href=\"$start_URL\">".$this->local_app_strings['LNK_LIST_START']."</a>";
|
|
$start_link = "<button type='button' class='button' title='{$this->local_app_strings['LNK_LIST_START']}' onClick='location.href=\"$start_URL\";'>".SugarThemeRegistry::current()->getImage("start", "border='0' align='absmiddle'", null, null, '.gif', $this->local_app_strings['LNK_LIST_START'])."</button>";
|
|
|
|
if (0 != $current_offset) {
|
|
//$previous_link = "<a href=\"$previous_URL\">".SugarThemeRegistry::current()->getImage("previous","border='0' align='absmiddle'",null,null,'.gif',$this->local_app_strings['LNK_LIST_PREVIOUS'])."</a> <a href=\"$previous_URL\" >".$this->local_app_strings['LNK_LIST_PREVIOUS']."</a>";
|
|
$previous_link = "<button type='button' class='button' title='{$this->local_app_strings['LNK_LIST_PREVIOUS']}' onClick='location.href=\"$previous_URL\";'>".SugarThemeRegistry::current()->getImage("previous", "border='0' align='absmiddle'", null, null, '.gif', $this->local_app_strings['LNK_LIST_PREVIOUS'])."</button>";
|
|
} else {
|
|
//$previous_link = SugarThemeRegistry::current()->getImage("previous_off","border='0' align='absmiddle'",null,null,'.gif',$this->local_app_strings['LNK_LIST_PREVIOUS'])." ".$this->local_app_strings['LNK_LIST_PREVIOUS'];
|
|
$previous_link = "<button type='button' title='{$this->local_app_strings['LNK_LIST_PREVIOUS']}' class='button' disabled>".SugarThemeRegistry::current()->getImage("previous_off", "border='0' align='absmiddle'", null, null, '.gif', $this->local_app_strings['LNK_LIST_PREVIOUS'])."</button>";
|
|
}
|
|
}
|
|
|
|
|
|
if ($row_count <= $current_offset) {
|
|
//$end_link = $this->local_app_strings['LNK_LIST_END']." ".SugarThemeRegistry::current()->getImage("end_off","border='0' align='absmiddle'",null,null,'.gif',$this->local_app_strings['LNK_LIST_END']);
|
|
//$next_link = $this->local_app_strings['LNK_LIST_NEXT']." ".SugarThemeRegistry::current()->getImage("next_off","border='0' align='absmiddle'",null,null,'.gif',$this->local_app_strings['LNK_LIST_NEXT']);
|
|
$end_link = "<button type='button' title='{$this->local_app_strings['LNK_LIST_END']}' class='button' disabled>".SugarThemeRegistry::current()->getImage("end_off", "border='0' align='absmiddle'", null, null, '.gif', $this->local_app_strings['LNK_LIST_END'])."</button>";
|
|
$next_link = "<button type='button' title='{$this->local_app_strings['LNK_LIST_NEXT']}' class='button' disabled>".SugarThemeRegistry::current()->getImage("next_off", "border='0' align='absmiddle'", null, null, '.gif', $this->local_app_strings['LNK_LIST_NEXT'])."</button>";
|
|
} else {
|
|
//$end_link = "<a href=\"$end_URL\">".$this->local_app_strings['LNK_LIST_END']."</a> <a href=\"$end_URL\">".SugarThemeRegistry::current()->getImage("end","border='0' align='absmiddle'",null,null,'.gif',$this->local_app_strings['LNK_LIST_END'])."</a>";
|
|
//$next_link = "<a href=\"$next_URL\">".$this->local_app_strings['LNK_LIST_NEXT']."</a> <a href=\"$next_URL\">".SugarThemeRegistry::current()->getImage("next","border='0' align='absmiddle'",,null,null,'.gif',$this->local_app_strings['LNK_LIST_NEXT'])."</a>";
|
|
$end_link = "<button type='button' class='button' title='{$this->local_app_strings['LNK_LIST_END']}' onClick='location.href=\"$end_URL\";'>".SugarThemeRegistry::current()->getImage("end", "border='0' align='absmiddle'", null, null, '.gif', $this->local_app_strings['LNK_LIST_END'])."</button>";
|
|
$next_link = "<button type='button' class='button' title='{$this->local_app_strings['LNK_LIST_NEXT']}' onClick='location.href=\"$next_URL\";'>".SugarThemeRegistry::current()->getImage("next", "border='0' align='absmiddle'", null, null, '.gif', $this->local_app_strings['LNK_LIST_NEXT'])."</button>";
|
|
}
|
|
|
|
$html_text .= "<td nowrap align='right' >".$start_link." ".$previous_link." (".$current_offset." ".$this->local_app_strings['LBL_LIST_OF']." ".$row_count.") ".$next_link." ".$end_link."</td>";
|
|
}
|
|
}
|
|
$post_html_text = "</tr></table>\n";
|
|
$post_html_text .= "</td>\n";
|
|
$post_html_text .= "</tr>\n";
|
|
$showVCRControl = true;
|
|
if (isset($sugar_config['disable_vcr'])) {
|
|
$showVCRControl = !$sugar_config['disable_vcr'];
|
|
}
|
|
if ($showVCRControl && $html_text != "") {
|
|
$xtpl->assign("PAGINATION", $pre_html_text.$html_text.$post_html_text);
|
|
}
|
|
}
|
|
|
|
|
|
public function set_base_URL($html_varName)
|
|
{
|
|
if (!isset($this->base_URL)) {
|
|
$this->base_URL = $_SERVER['PHP_SELF'];
|
|
if (empty($this->base_URL)) {
|
|
$this->base_URL = 'index.php';
|
|
}
|
|
|
|
/*fixes an issue with
|
|
deletes when doing a search*/
|
|
foreach ($_GET as $name=>$value) {
|
|
if (!empty($value)) {
|
|
if ($name != $this->getSessionVariableName($html_varName, "ORDER_BY") && $name != "offset" && substr_count($name, "ORDER_BY")==0 && $name!="isfirstview") {
|
|
if (is_array($value)) {
|
|
foreach ($value as $valuename=>$valuevalue) {
|
|
$this->base_URL .= "&{$name}[]=".$valuevalue;
|
|
}
|
|
} else {
|
|
if (substr_count((string) $this->base_URL, '?') > 0) {
|
|
$this->base_URL .= "&$name=$value";
|
|
} else {
|
|
$this->base_URL .= "?$name=$value";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
|
$this->base_URL .= '?';
|
|
if (isset($_REQUEST['action'])) {
|
|
$this->base_URL .= '&action='.$_REQUEST['action'];
|
|
}
|
|
if (isset($_REQUEST['record'])) {
|
|
$this->base_URL .= '&record='.$_REQUEST['record'];
|
|
}
|
|
if (isset($_REQUEST['module'])) {
|
|
$this->base_URL .= '&module='.$_REQUEST['module'];
|
|
}
|
|
}
|
|
$this->base_URL .= "&offset=";
|
|
}
|
|
}
|
|
public function setListViewRowCount($count)
|
|
{
|
|
$this->list_row_count = $count;
|
|
}
|
|
|
|
public function getListViewRowCount()
|
|
{
|
|
return $this->list_row_count;
|
|
}
|
|
|
|
/* This method will return in all of these cases: When selecting any of the VCR buttons (start,prev,next or last)
|
|
* and navigating from list to detail for the first time.
|
|
* if false in this case: the user changes the list query (which generates a new stamp) and pastes a URL
|
|
* from a previously navigated item.
|
|
*/
|
|
public function isRequestFromListView($html_varName)
|
|
{
|
|
$varList = $this->getLocalSessionVariable($html_varName, "FROM_LIST_VIEW");
|
|
if (isset($_GET['stamp']) && isset($varList) && $varList == $_GET['stamp']) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return a variable from the session. uses the new ListView session data. Hence the '2'
|
|
*
|
|
* @param unknown_type $name - the name of the variable to set in the session
|
|
* @param unknown_type $value - the value of the variable to set
|
|
*/
|
|
public function getVariableFromSession($name, $value)
|
|
{
|
|
if (isset($_SESSION[$name."2_".$value])) {
|
|
return $_SESSION[$name."2_".$value];
|
|
} else {
|
|
return "";
|
|
}
|
|
}
|
|
}
|