705 lines
29 KiB
PHP
705 lines
29 KiB
PHP
|
|
<?php
|
||
|
|
if (! defined ( 'sugarEntry' ) || ! sugarEntry)
|
||
|
|
die ( 'Not A Valid Entry Point' );
|
||
|
|
/**
|
||
|
|
* *******************************************************************************
|
||
|
|
* SugarCRM is a customer relationship management program developed by
|
||
|
|
* SugarCRM, Inc.
|
||
|
|
* Copyright (C) 2004-2010 SugarCRM Inc.
|
||
|
|
*
|
||
|
|
* 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. If the display of the logo is not reasonably feasible for
|
||
|
|
* technical reasons, the Appropriate Legal Notices must display the words
|
||
|
|
* "Powered by SugarCRM".
|
||
|
|
* ******************************************************************************
|
||
|
|
*/
|
||
|
|
|
||
|
|
require_once ('include/EditView/SugarVCR.php');
|
||
|
|
class ListViewData {
|
||
|
|
var $additionalDetails = true;
|
||
|
|
var $listviewName = null;
|
||
|
|
var $additionalDetailsAllow = null;
|
||
|
|
var $additionalDetailsAjax = true; // leave this true when using filter fields
|
||
|
|
var $additionalDetailsFieldToAdd = 'NAME'; // where the span will be attached to
|
||
|
|
var $base_url = null;
|
||
|
|
/*
|
||
|
|
* If you want overwrite the query for the count of the listview set this to your query
|
||
|
|
* otherwise leave it empty and it will use SugarBean::create_list_count_query
|
||
|
|
*/
|
||
|
|
var $count_query = '';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Constructor sets the limitName to look up the limit in $sugar_config
|
||
|
|
*
|
||
|
|
* @return ListViewData
|
||
|
|
*/
|
||
|
|
function ListViewData() {
|
||
|
|
$this->limitName = 'list_max_entries_per_page';
|
||
|
|
$this->db = &DBManagerFactory::getInstance ( 'listviews' );
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* checks the request for the order by and if that is not set then it checks the session for it
|
||
|
|
*
|
||
|
|
* @return array containing the keys orderBy => field being ordered off of and sortOrder => the sort order of that field
|
||
|
|
*/
|
||
|
|
function getOrderBy($orderBy = '', $direction = '') {
|
||
|
|
if (! empty ( $orderBy ) || ! empty ( $_REQUEST [$this->var_order_by] )) {
|
||
|
|
if (! empty ( $_REQUEST [$this->var_order_by] )) {
|
||
|
|
$direction = 'ASC';
|
||
|
|
$orderBy = $_REQUEST [$this->var_order_by];
|
||
|
|
if (! empty ( $_REQUEST ['lvso'] ) && (empty ( $_SESSION ['lvd'] ['last_ob'] ) || strcmp ( $orderBy, $_SESSION ['lvd'] ['last_ob'] ) == 0)) {
|
||
|
|
$direction = $_REQUEST ['lvso'];
|
||
|
|
|
||
|
|
$trackerManager = TrackerManager::getInstance ();
|
||
|
|
if ($monitor = $trackerManager->getMonitor ( 'tracker' )) {
|
||
|
|
$monitor->setValue ( 'module_name', $GLOBALS ['module'] );
|
||
|
|
$monitor->setValue ( 'item_summary', "lvso=" . $direction . "&" . $this->var_order_by . "=" . $_REQUEST [$this->var_order_by] );
|
||
|
|
$monitor->setValue ( 'action', 'listview' );
|
||
|
|
$monitor->setValue ( 'user_id', $GLOBALS ['current_user']->id );
|
||
|
|
$monitor->setValue ( 'date_modified', gmdate ( $GLOBALS ['timedate']->get_db_date_time_format () ) );
|
||
|
|
$monitor->save ();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
$_SESSION [$this->var_order_by] = array (
|
||
|
|
'orderBy' => $orderBy,
|
||
|
|
'direction' => $direction
|
||
|
|
);
|
||
|
|
$_SESSION ['lvd'] ['last_ob'] = $orderBy;
|
||
|
|
} else {
|
||
|
|
if (! empty ( $_SESSION [$this->var_order_by] )) {
|
||
|
|
$orderBy = $_SESSION [$this->var_order_by] ['orderBy'];
|
||
|
|
$direction = $_SESSION [$this->var_order_by] ['direction'];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return array (
|
||
|
|
'orderBy' => $orderBy,
|
||
|
|
'sortOrder' => $direction
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* gets the reverse of the sort order for use on links to reverse a sort order from what is currently used
|
||
|
|
*
|
||
|
|
* @param
|
||
|
|
* STRING (ASC or DESC) $current_order
|
||
|
|
* @return STRING (ASC or DESC)
|
||
|
|
*/
|
||
|
|
function getReverseSortOrder($current_order) {
|
||
|
|
return (strcmp ( strtolower ( $current_order ), 'asc' ) == 0) ? 'DESC' : 'ASC';
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* gets the limit of how many rows to show per page
|
||
|
|
*
|
||
|
|
* @return INT (the limit)
|
||
|
|
*/
|
||
|
|
function getLimit() {
|
||
|
|
return $GLOBALS ['sugar_config'] [$this->limitName];
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* returns the current offset
|
||
|
|
*
|
||
|
|
* @return INT (current offset)
|
||
|
|
*/
|
||
|
|
function getOffset() {
|
||
|
|
return (! empty ( $_REQUEST [$this->var_offset] )) ? $_REQUEST [$this->var_offset] : 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* generates the base url without
|
||
|
|
* any files in the block variables will not be part of the url
|
||
|
|
*
|
||
|
|
*
|
||
|
|
* @return STRING (the base url)
|
||
|
|
*/
|
||
|
|
function getBaseURL() {
|
||
|
|
global $beanList;
|
||
|
|
if (empty ( $this->base_url )) {
|
||
|
|
$blockVariables = array (
|
||
|
|
'mass',
|
||
|
|
'uid',
|
||
|
|
'massupdate',
|
||
|
|
'delete',
|
||
|
|
'merge',
|
||
|
|
'selectCount',
|
||
|
|
$this->var_order_by,
|
||
|
|
$this->var_offset,
|
||
|
|
'lvso',
|
||
|
|
'sortOrder',
|
||
|
|
'orderBy',
|
||
|
|
'request_data',
|
||
|
|
'current_query_by_page'
|
||
|
|
);
|
||
|
|
$base_url = 'index.php?';
|
||
|
|
foreach ( $beanList as $bean ) {
|
||
|
|
$blockVariables [] = 'Home2_' . strtoupper ( $bean ) . '_ORDER_BY';
|
||
|
|
}
|
||
|
|
$blockVariables [] = 'Home2_CASE_ORDER_BY';
|
||
|
|
$params = array ();
|
||
|
|
if (isset ( $_POST ) && is_array ( $_POST )) {
|
||
|
|
$params = array_merge ( $params, $_POST );
|
||
|
|
}
|
||
|
|
if (isset ( $_GET ) && is_array ( $_GET )) {
|
||
|
|
$params = array_merge ( $params, $_GET );
|
||
|
|
}
|
||
|
|
foreach ( $params as $name => $value ) {
|
||
|
|
if (! in_array ( $name, $blockVariables )) {
|
||
|
|
if (is_array ( $value )) {
|
||
|
|
foreach ( $value as $v ) {
|
||
|
|
$base_url .= $name . urlencode ( '[]' ) . '=' . urlencode ( $v ) . '&';
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
$base_url .= $name . '=' . urlencode ( $value ) . '&';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
$this->base_url = $base_url;
|
||
|
|
}
|
||
|
|
return $this->base_url;
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* based off of a base name it sets base, offset, and order by variable names to retrieve them from requests and sessions
|
||
|
|
*
|
||
|
|
* @param unknown_type $baseName
|
||
|
|
*/
|
||
|
|
function setVariableName($baseName, $where, $listviewName = null) {
|
||
|
|
global $timedate;
|
||
|
|
$module = (! empty ( $listviewName )) ? $listviewName : $_REQUEST ['module'];
|
||
|
|
$this->var_name = $module . '2_' . strtoupper ( $baseName );
|
||
|
|
|
||
|
|
$this->var_order_by = $this->var_name . '_ORDER_BY';
|
||
|
|
$this->var_offset = $this->var_name . '_offset';
|
||
|
|
$timestamp = $timedate->get_microtime_string ();
|
||
|
|
$this->stamp = $timestamp;
|
||
|
|
|
||
|
|
$_SESSION [$module . '2_QUERY_QUERY'] = $where;
|
||
|
|
|
||
|
|
$_SESSION [strtoupper ( $baseName ) . "_FROM_LIST_VIEW"] = $timestamp;
|
||
|
|
$_SESSION [strtoupper ( $baseName ) . "_DETAIL_NAV_HISTORY"] = false;
|
||
|
|
}
|
||
|
|
function getTotalCount($main_query) {
|
||
|
|
if (! empty ( $this->count_query )) {
|
||
|
|
$count_query = $this->count_query;
|
||
|
|
} else {
|
||
|
|
$count_query = SugarBean::create_list_count_query ( $main_query );
|
||
|
|
}
|
||
|
|
$result = $this->db->query ( $count_query );
|
||
|
|
if ($row = $this->db->fetchByAssoc ( $result )) {
|
||
|
|
return $row ['c'];
|
||
|
|
}
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* takes in a seed and creates the list view query based off of that seed
|
||
|
|
* if the $limit value is set to -1 then it will use the default limit and offset values
|
||
|
|
*
|
||
|
|
* it will return an array with two key values
|
||
|
|
* 1. 'data'=> this is an array of row data
|
||
|
|
* 2. 'pageData'=> this is an array containg three values
|
||
|
|
* a.'ordering'=> array('orderBy'=> the field being ordered by , 'sortOrder'=> 'ASC' or 'DESC')
|
||
|
|
* b.'urls'=>array('baseURL'=>url used to generate other urls ,
|
||
|
|
* 'orderBy'=> the base url for order by
|
||
|
|
* //the following may not be set (so check empty to see if they are set)
|
||
|
|
* 'nextPage'=> the url for the next group of results,
|
||
|
|
* 'prevPage'=> the url for the prev group of results,
|
||
|
|
* 'startPage'=> the url for the start of the group,
|
||
|
|
* 'endPage'=> the url for the last set of results in the group
|
||
|
|
* c.'offsets'=>array(
|
||
|
|
* 'current'=>current offset
|
||
|
|
* 'next'=> next group offset
|
||
|
|
* 'prev'=> prev group offset
|
||
|
|
* 'end'=> the offset of the last group
|
||
|
|
* 'total'=> the total count (only accurate if totalCounted = true otherwise it is either the total count if less than the limit or the total count + 1 )
|
||
|
|
* 'totalCounted'=> if a count query was used to get the total count
|
||
|
|
*
|
||
|
|
* @param SugarBean $seed
|
||
|
|
* @param string $where
|
||
|
|
* @param int:0 $offset
|
||
|
|
* @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['custom_XXXX'] = append custom statements to query
|
||
|
|
* @param string:'id' $id_field
|
||
|
|
* @return array('data'=> row data 'pageData' => page data information
|
||
|
|
*/
|
||
|
|
function getListViewData($seed, $where, $offset = -1, $limit = -1, $filter_fields = array(), $params = array(), $id_field = 'id') {
|
||
|
|
global $current_user;
|
||
|
|
|
||
|
|
// add mz 2014-08-19
|
||
|
|
$where = str_replace ( "like '", "like '%", $where );
|
||
|
|
// end mz
|
||
|
|
|
||
|
|
SugarVCR::erase ( $seed->module_dir );
|
||
|
|
$this->seed = & $seed;
|
||
|
|
$totalCounted = empty ( $GLOBALS ['sugar_config'] ['disable_count_query'] );
|
||
|
|
$_SESSION ['MAILMERGE_MODULE_FROM_LISTVIEW'] = $seed->module_dir;
|
||
|
|
if (empty ( $_REQUEST ['action'] ) || $_REQUEST ['action'] != 'Popup') {
|
||
|
|
$_SESSION ['MAILMERGE_MODULE'] = $seed->module_dir;
|
||
|
|
}
|
||
|
|
|
||
|
|
$this->setVariableName ( $seed->object_name, $where, $this->listviewName );
|
||
|
|
|
||
|
|
$this->seed->id = '[SELECT_ID_LIST]';
|
||
|
|
|
||
|
|
// if $params tell us to override all ordering
|
||
|
|
if (! empty ( $params ['overrideOrder'] ) && ! empty ( $params ['orderBy'] )) {
|
||
|
|
$order = $this->getOrderBy ( strtolower ( $params ['orderBy'] ), (empty ( $params ['sortOrder'] ) ? '' : $params ['sortOrder']) ); // retreive from $_REQUEST
|
||
|
|
} else {
|
||
|
|
$order = $this->getOrderBy (); // retreive from $_REQUEST
|
||
|
|
}
|
||
|
|
|
||
|
|
// else use stored preference
|
||
|
|
$userPreferenceOrder = $current_user->getPreference ( 'listviewOrder', $this->var_name );
|
||
|
|
|
||
|
|
if (empty ( $order ['orderBy'] ) && ! empty ( $userPreferenceOrder )) {
|
||
|
|
$order = $userPreferenceOrder;
|
||
|
|
}
|
||
|
|
// still empty? try to use settings passed in $param
|
||
|
|
if (empty ( $order ['orderBy'] ) && ! empty ( $params ['orderBy'] )) {
|
||
|
|
$order ['orderBy'] = $params ['orderBy'];
|
||
|
|
$order ['sortOrder'] = (empty ( $params ['sortOrder'] ) ? '' : $params ['sortOrder']);
|
||
|
|
}
|
||
|
|
|
||
|
|
// rrs - bug: 21788. Do not use Order by stmts with fields that are not in the query.
|
||
|
|
// Bug 22740 - Tweak this check to strip off the table name off the order by parameter.
|
||
|
|
// Samir Gandhi : Do not remove the report_cache.date_modified condition as the report list view is broken
|
||
|
|
$orderby = $order ['orderBy'];
|
||
|
|
if (strpos ( $order ['orderBy'], '.' ) && ($order ['orderBy'] != "report_cache.date_modified"))
|
||
|
|
$orderby = substr ( $order ['orderBy'], strpos ( $order ['orderBy'], '.' ) + 1 );
|
||
|
|
if (! in_array ( $orderby, array_keys ( $filter_fields ) )) {
|
||
|
|
$order ['orderBy'] = '';
|
||
|
|
$order ['sortOrder'] = '';
|
||
|
|
}
|
||
|
|
|
||
|
|
if (empty ( $order ['orderBy'] )) {
|
||
|
|
$orderBy = '';
|
||
|
|
} else {
|
||
|
|
$orderBy = $order ['orderBy'] . ' ' . $order ['sortOrder'];
|
||
|
|
// wdong, Bug 25476, fix the sorting problem of Oracle.
|
||
|
|
if (isset ( $params ['custom_order_by_override'] ['ori_code'] ) && $order ['orderBy'] == $params ['custom_order_by_override'] ['ori_code'])
|
||
|
|
$orderBy = $params ['custom_order_by_override'] ['custom_code'] . ' ' . $order ['sortOrder'];
|
||
|
|
}
|
||
|
|
|
||
|
|
if (empty ( $params ['skipOrderSave'] )) // don't save preferences if told so
|
||
|
|
$current_user->setPreference ( 'listviewOrder', $order, 0, $this->var_name ); // save preference
|
||
|
|
$ret_array = $seed->create_new_list_query ( $orderBy, $where, $filter_fields, $params, 0, '', true, $seed, true );
|
||
|
|
$ret_array ['inner_join'] = '';
|
||
|
|
if (! empty ( $this->seed->listview_inner_join )) {
|
||
|
|
$ret_array ['inner_join'] = ' ' . implode ( ' ', $this->seed->listview_inner_join ) . ' ';
|
||
|
|
}
|
||
|
|
|
||
|
|
if (! is_array ( $params ))
|
||
|
|
$params = array ();
|
||
|
|
if (! isset ( $params ['custom_select'] ))
|
||
|
|
$params ['custom_select'] = '';
|
||
|
|
if (! isset ( $params ['custom_from'] ))
|
||
|
|
$params ['custom_from'] = '';
|
||
|
|
|
||
|
|
// add mz 2014-05-13
|
||
|
|
if (isset ( $_REQUEST ['custom_parent_id'] )) {
|
||
|
|
$params ['custom_where'] = " AND parent_id='" . $_REQUEST ['custom_parent_id'] . "'";
|
||
|
|
$ret_array ['where'] = ' where ecmstockoperations.deleted=0';
|
||
|
|
}
|
||
|
|
if (! isset ( $params ['custom_where'] ))
|
||
|
|
$params ['custom_where'] = '';
|
||
|
|
if (! isset ( $params ['custom_order_by'] ))
|
||
|
|
$params ['custom_order_by'] = '';
|
||
|
|
|
||
|
|
$main_query = $ret_array ['select'] . $params ['custom_select'] . $ret_array ['from'] . $params ['custom_from'] . $ret_array ['inner_join'] . $ret_array ['where'] . $params ['custom_where'] . $ret_array ['order_by'] . $params ['custom_order_by'];
|
||
|
|
// C.L. - Fix for 23461
|
||
|
|
if ($_REQUEST ['parent_id'] != "") {
|
||
|
|
if ($_REQUEST ['module'] == 'Documents') {
|
||
|
|
|
||
|
|
$custom_join = " inner join documents_accounts on documents.id = documents_accounts.document_id ";
|
||
|
|
$custom_where = " and documents_accounts.parent_id='" . $_REQUEST ['parent_id'] . "'";
|
||
|
|
$main_query = $ret_array ['select'] . $params ['custom_select'] . $ret_array ['from'] . $params ['custom_from'] . $ret_array ['inner_join'] . $custom_join . $ret_array ['where'] . $params ['custom_where'] . $custom_where . $ret_array ['order_by'] . $params ['custom_order_by'];
|
||
|
|
} else {
|
||
|
|
$main_query = $ret_array ['select'] . $params ['custom_select'] . $ret_array ['from'] . $params ['custom_from'] . $ret_array ['inner_join'] . $ret_array ['where'] . $params ['custom_where'] . $ret_array ['order_by'] . $params ['custom_order_by'];
|
||
|
|
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
if($_REQUEST['module']=='EcmWorkCards'){
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
if($orderBy=='date asc'){
|
||
|
|
$innerString=' inner join ecmworkers on ecmworkers.id=ecmworkcards.worker_id';
|
||
|
|
$orderString=' order by ecmworkcards.date asc, ecmworkers.last_name asc,ecmworkcards.time_from asc';
|
||
|
|
}
|
||
|
|
|
||
|
|
if($orderBy=='date desc'){
|
||
|
|
$innerString=' inner join ecmworkers on ecmworkers.id=ecmworkcards.worker_id';
|
||
|
|
$orderString=' order by ecmworkcards.date desc, ecmworkers.last_name desc,ecmworkcards.time_from desc';
|
||
|
|
}
|
||
|
|
|
||
|
|
if($orderBy=='worker_name asc'){
|
||
|
|
$innerString=' inner join ecmworkers on ecmworkers.id=ecmworkcards.worker_id';
|
||
|
|
$orderString=' order by ecmworkers.last_name asc';
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
if($orderBy=='worker_name desc'){
|
||
|
|
$innerString=' inner join ecmworkers on ecmworkers.id=ecmworkcards.worker_id';
|
||
|
|
$orderString=' order by ecmworkers.last_name desc';
|
||
|
|
}
|
||
|
|
|
||
|
|
$main_query = $ret_array ['select'] . $params ['custom_select'] . $ret_array ['from'] . $params ['custom_from'] . $ret_array ['inner_join'] . $innerString . $ret_array ['where'] . $params ['custom_where'].$orderString;
|
||
|
|
|
||
|
|
// echo $main_query;
|
||
|
|
} else {
|
||
|
|
$main_query = $ret_array ['select'] . $params ['custom_select'] . $ret_array ['from'] . $params ['custom_from'] . $ret_array ['inner_join'] . $ret_array ['where'] . $params ['custom_where'] . $ret_array ['order_by'] . $params ['custom_order_by'];
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (empty ( $_REQUEST ['action'] ) || $_REQUEST ['action'] != 'Popup') {
|
||
|
|
$_SESSION ['export_where'] = $ret_array ['where'];
|
||
|
|
}
|
||
|
|
if ($_REQUEST ['module'] == 'Accounts') {
|
||
|
|
$lead_query = str_replace ( 'accounts', 'leads', $main_query );
|
||
|
|
$leads = $this->db->query ( $lead_query );
|
||
|
|
if ($leads->num_rows > 0)
|
||
|
|
echo '<H1>Uwaga! W bazie potencjalnych kontrahentów istnieje obiekt o zadanych kryteriach!</H1>';
|
||
|
|
}
|
||
|
|
|
||
|
|
if ($_REQUEST ['module'] == 'Leads') {
|
||
|
|
$account_query = str_replace ( 'leads', 'accounts', $main_query );
|
||
|
|
$accounts = $this->db->query ( $account_query );
|
||
|
|
if ($accounts->num_rows > 0)
|
||
|
|
echo '<H1>Uwaga! W bazie kontrahentów istnieje obiekt o zadanych kryteriach!</H1>';
|
||
|
|
}
|
||
|
|
|
||
|
|
if ($limit < - 1) {
|
||
|
|
$result = $this->db->query ( $main_query );
|
||
|
|
} else {
|
||
|
|
if ($limit == - 1) {
|
||
|
|
$limit = $this->getLimit ();
|
||
|
|
}
|
||
|
|
$dyn_offset = $this->getOffset ();
|
||
|
|
if ($dyn_offset > 0 || ! is_int ( $dyn_offset ))
|
||
|
|
$offset = $dyn_offset;
|
||
|
|
|
||
|
|
if (strcmp ( $offset, 'end' ) == 0) {
|
||
|
|
$totalCount = $this->getTotalCount ( $main_query );
|
||
|
|
$offset = (floor ( ($totalCount - 1) / $limit )) * $limit;
|
||
|
|
}
|
||
|
|
if ($this->seed->ACLAccess ( 'ListView' )) {
|
||
|
|
$result = $this->db->limitQuery ( $main_query, $offset, $limit + 1 );
|
||
|
|
} else {
|
||
|
|
$result = array ();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if ($_REQUEST ['module'] == 'EcmStockDocIns') {
|
||
|
|
$_SESSION [$current_user->id . '_pdf_ecmstockdocins'] = $main_query;
|
||
|
|
}
|
||
|
|
|
||
|
|
if ($_REQUEST ['module'] == 'EcmStockDocOuts') {
|
||
|
|
$_SESSION [$current_user->id . '_pdf_ecmstockdocouts'] = $main_query;
|
||
|
|
}
|
||
|
|
|
||
|
|
if ($_REQUEST ['module'] == 'EcmStockDocCorrects') {
|
||
|
|
$_SESSION [$current_user->id . '_pdf_ecmstockdoccorrects'] = $main_query;
|
||
|
|
}
|
||
|
|
|
||
|
|
$data = array ();
|
||
|
|
|
||
|
|
$temp = clone $seed;
|
||
|
|
|
||
|
|
$rows = array ();
|
||
|
|
$count = 0;
|
||
|
|
$idIndex = array ();
|
||
|
|
$id_list = '';
|
||
|
|
while ( $row = $this->db->fetchByAssoc ( $result ) ) {
|
||
|
|
if ($count < $limit) {
|
||
|
|
if (! empty ( $id_list )) {
|
||
|
|
$id_list = '(';
|
||
|
|
} else {
|
||
|
|
$id_list .= ',';
|
||
|
|
}
|
||
|
|
$id_list .= '\'' . $row [$id_field] . '\'';
|
||
|
|
// handles date formating and such
|
||
|
|
$idIndex [$row [$id_field]] [] = count ( $rows );
|
||
|
|
$rows [] = $row;
|
||
|
|
}
|
||
|
|
$count ++;
|
||
|
|
}
|
||
|
|
if (! empty ( $id_list ))
|
||
|
|
$id_list .= ')';
|
||
|
|
|
||
|
|
SugarVCR::store ( $this->seed->module_dir, $main_query );
|
||
|
|
if ($count != 0) {
|
||
|
|
// NOW HANDLE SECONDARY QUERIES
|
||
|
|
if (! empty ( $ret_array ['secondary_select'] )) {
|
||
|
|
$secondary_query = $ret_array ['secondary_select'] . $ret_array ['secondary_from'] . ' WHERE ' . $this->seed->table_name . '.id IN ' . $id_list;
|
||
|
|
$secondary_result = $this->db->query ( $secondary_query );
|
||
|
|
while ( $row = $this->db->fetchByAssoc ( $secondary_result ) ) {
|
||
|
|
foreach ( $row as $name => $value ) {
|
||
|
|
// add it to every row with the given id
|
||
|
|
foreach ( $idIndex [$row ['ref_id']] as $index ) {
|
||
|
|
$rows [$index] [$name] = $value;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// retrieve parent names
|
||
|
|
if (! empty ( $filter_fields ['parent_name'] ) && ! empty ( $filter_fields ['parent_id'] ) && ! empty ( $filter_fields ['parent_type'] )) {
|
||
|
|
foreach ( $idIndex as $id => $rowIndex ) {
|
||
|
|
if (! isset ( $post_retrieve [$rows [$rowIndex [0]] ['parent_type']] )) {
|
||
|
|
$post_retrieve [$rows [$rowIndex [0]] ['parent_type']] = array ();
|
||
|
|
}
|
||
|
|
if (! empty ( $rows [$rowIndex [0]] ['parent_id'] ))
|
||
|
|
$post_retrieve [$rows [$rowIndex [0]] ['parent_type']] [] = array (
|
||
|
|
'child_id' => $id,
|
||
|
|
'parent_id' => $rows [$rowIndex [0]] ['parent_id'],
|
||
|
|
'parent_type' => $rows [$rowIndex [0]] ['parent_type'],
|
||
|
|
'type' => 'parent'
|
||
|
|
);
|
||
|
|
}
|
||
|
|
if (isset ( $post_retrieve )) {
|
||
|
|
$parent_fields = $seed->retrieve_parent_fields ( $post_retrieve );
|
||
|
|
foreach ( $parent_fields as $child_id => $parent_data ) {
|
||
|
|
// add it to every row with the given id
|
||
|
|
foreach ( $idIndex [$child_id] as $index ) {
|
||
|
|
$rows [$index] ['parent_name'] = $parent_data ['parent_name'];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
$pageData = array ();
|
||
|
|
|
||
|
|
$additionalDetailsAllow = $this->additionalDetails && $this->seed->ACLAccess ( 'DetailView' ) && (file_exists ( 'modules/' . $this->seed->module_dir . '/metadata/additionalDetails.php' ) || file_exists ( 'custom/modules/' . $this->seed->module_dir . '/metadata/additionalDetails.php' ));
|
||
|
|
if ($additionalDetailsAllow)
|
||
|
|
$pageData ['additionalDetails'] = array ();
|
||
|
|
$additionalDetailsEdit = $this->seed->ACLAccess ( 'EditView' );
|
||
|
|
reset ( $rows );
|
||
|
|
while ( $row = current ( $rows ) ) {
|
||
|
|
$temp = clone $seed;
|
||
|
|
$dataIndex = count ( $data );
|
||
|
|
|
||
|
|
$temp->setupCustomFields ( $temp->module_dir );
|
||
|
|
$temp->loadFromRow ( $row );
|
||
|
|
if ($idIndex [$row [$id_field]] [0] == $dataIndex) {
|
||
|
|
$pageData ['tag'] [$dataIndex] = $temp->listviewACLHelper ();
|
||
|
|
} else {
|
||
|
|
$pageData ['tag'] [$dataIndex] = $pageData ['tag'] [$idIndex [$row [$id_field]] [0]];
|
||
|
|
}
|
||
|
|
|
||
|
|
$data [$dataIndex] = $temp->get_list_view_data ( $filter_fields );
|
||
|
|
|
||
|
|
if ($additionalDetailsAllow) {
|
||
|
|
if ($this->additionalDetailsAjax) {
|
||
|
|
$ar = $this->getAdditionalDetailsAjax ( $data [$dataIndex] ['ID'] );
|
||
|
|
} else {
|
||
|
|
$additionalDetailsFile = 'modules/' . $this->seed->module_dir . '/metadata/additionalDetails.php';
|
||
|
|
if (file_exists ( 'custom/modules/' . $this->seed->module_dir . '/metadata/additionalDetails.php' )) {
|
||
|
|
$additionalDetailsFile = 'custom/modules/' . $this->seed->module_dir . '/metadata/additionalDetails.php';
|
||
|
|
}
|
||
|
|
require_once ($additionalDetailsFile);
|
||
|
|
$ar = $this->getAdditionalDetails ( $data [$dataIndex], (empty ( $this->additionalDetailsFunction ) ? 'additionalDetails' : $this->additionalDetailsFunction) . $this->seed->object_name, $additionalDetailsEdit );
|
||
|
|
}
|
||
|
|
$pageData ['additionalDetails'] [$dataIndex] = $ar ['string'];
|
||
|
|
$pageData ['additionalDetails'] ['fieldToAddTo'] = $ar ['fieldToAddTo'];
|
||
|
|
}
|
||
|
|
next ( $rows );
|
||
|
|
}
|
||
|
|
}
|
||
|
|
$nextOffset = - 1;
|
||
|
|
$prevOffset = - 1;
|
||
|
|
$endOffset = - 1;
|
||
|
|
if ($count > $limit) {
|
||
|
|
$nextOffset = $offset + $limit;
|
||
|
|
}
|
||
|
|
|
||
|
|
if ($offset > 0) {
|
||
|
|
$prevOffset = $offset - $limit;
|
||
|
|
if ($prevOffset < 0)
|
||
|
|
$prevOffset = 0;
|
||
|
|
}
|
||
|
|
$totalCount = $count + $offset;
|
||
|
|
|
||
|
|
if ($count >= $limit && $totalCounted) {
|
||
|
|
$totalCount = $this->getTotalCount ( $main_query );
|
||
|
|
}
|
||
|
|
SugarVCR::recordIDs ( $this->seed->module_dir, array_keys ( $idIndex ), $offset, $totalCount );
|
||
|
|
$endOffset = (floor ( ($totalCount - 1) / $limit )) * $limit;
|
||
|
|
$pageData ['ordering'] = $order;
|
||
|
|
$pageData ['ordering'] ['sortOrder'] = $this->getReverseSortOrder ( $pageData ['ordering'] ['sortOrder'] );
|
||
|
|
$pageData ['urls'] = $this->generateURLS ( $pageData ['ordering'] ['sortOrder'], $offset, $prevOffset, $nextOffset, $endOffset, $totalCounted );
|
||
|
|
$pageData ['offsets'] = array (
|
||
|
|
'current' => $offset,
|
||
|
|
'next' => $nextOffset,
|
||
|
|
'prev' => $prevOffset,
|
||
|
|
'end' => $endOffset,
|
||
|
|
'total' => $totalCount,
|
||
|
|
'totalCounted' => $totalCounted
|
||
|
|
);
|
||
|
|
$pageData ['bean'] = array (
|
||
|
|
'objectName' => $seed->object_name,
|
||
|
|
'moduleDir' => $seed->module_dir
|
||
|
|
);
|
||
|
|
$pageData ['stamp'] = $this->stamp;
|
||
|
|
$pageData ['access'] = array (
|
||
|
|
'view' => $this->seed->ACLAccess ( 'DetailView' ),
|
||
|
|
'edit' => $this->seed->ACLAccess ( 'EditView' )
|
||
|
|
);
|
||
|
|
$pageData ['idIndex'] = $idIndex;
|
||
|
|
if (! $this->seed->ACLAccess ( 'ListView' )) {
|
||
|
|
$pageData ['error'] = 'ACL restricted access';
|
||
|
|
}
|
||
|
|
|
||
|
|
return array (
|
||
|
|
'data' => $data,
|
||
|
|
'pageData' => $pageData
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* generates urls for use by the display layer
|
||
|
|
*
|
||
|
|
* @param int $sortOrder
|
||
|
|
* @param int $offset
|
||
|
|
* @param int $prevOffset
|
||
|
|
* @param int $nextOffset
|
||
|
|
* @param int $endOffset
|
||
|
|
* @param int $totalCounted
|
||
|
|
* @return array of urls orderBy and baseURL are always returned the others are only returned according to values passed in.
|
||
|
|
*/
|
||
|
|
function generateURLS($sortOrder, $offset, $prevOffset, $nextOffset, $endOffset, $totalCounted) {
|
||
|
|
$urls = array ();
|
||
|
|
$urls ['baseURL'] = $this->getBaseURL () . 'lvso=' . $sortOrder . '&';
|
||
|
|
$urls ['orderBy'] = $urls ['baseURL'] . $this->var_order_by . '=';
|
||
|
|
|
||
|
|
$dynamicUrl = '';
|
||
|
|
if ($nextOffset > - 1) {
|
||
|
|
$urls ['nextPage'] = $urls ['baseURL'] . $this->var_offset . '=' . $nextOffset . $dynamicUrl;
|
||
|
|
}
|
||
|
|
if ($offset > 0) {
|
||
|
|
$urls ['startPage'] = $urls ['baseURL'] . $this->var_offset . '=0' . $dynamicUrl;
|
||
|
|
}
|
||
|
|
if ($prevOffset > - 1) {
|
||
|
|
$urls ['prevPage'] = $urls ['baseURL'] . $this->var_offset . '=' . $prevOffset . $dynamicUrl;
|
||
|
|
}
|
||
|
|
if ($totalCounted) {
|
||
|
|
$urls ['endPage'] = $urls ['baseURL'] . $this->var_offset . '=' . $endOffset . $dynamicUrl;
|
||
|
|
} else {
|
||
|
|
$urls ['endPage'] = $urls ['baseURL'] . $this->var_offset . '=end' . $dynamicUrl;
|
||
|
|
}
|
||
|
|
|
||
|
|
return $urls;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* generates the additional details span to be retrieved via ajax
|
||
|
|
*
|
||
|
|
* @param
|
||
|
|
* GUID id id of the record
|
||
|
|
* @return array string to attach to field
|
||
|
|
*/
|
||
|
|
function getAdditionalDetailsAjax($id) {
|
||
|
|
global $app_strings;
|
||
|
|
|
||
|
|
$jscalendarImage = SugarThemeRegistry::current ()->getImageURL ( 'info_inline.gif' );
|
||
|
|
|
||
|
|
$extra = "<span id='adspan_" . $id . "' onmouseout=\"return SUGAR.util.clearAdditionalDetailsCall()\" " . "onmouseover=\"lvg_dtails('$id')\" " . "onmouseout=\"return nd(1000);\" style='position: relative;'><img vertical-align='middle' class='info' border='0' src='$jscalendarImage'></span>";
|
||
|
|
|
||
|
|
return array (
|
||
|
|
'fieldToAddTo' => $this->additionalDetailsFieldToAdd,
|
||
|
|
'string' => $extra
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* generates the additional details values
|
||
|
|
*
|
||
|
|
* @param unknown_type $fields
|
||
|
|
* @param unknown_type $adFunction
|
||
|
|
* @param unknown_type $editAccess
|
||
|
|
* @return array string to attach to field
|
||
|
|
*/
|
||
|
|
function getAdditionalDetails($fields, $adFunction, $editAccess) {
|
||
|
|
global $app_strings;
|
||
|
|
|
||
|
|
$results = $adFunction ( $fields );
|
||
|
|
$results ['string'] = str_replace ( array (
|
||
|
|
"'",
|
||
|
|
"'"
|
||
|
|
), '\'', $results ['string'] ); // no xss!
|
||
|
|
|
||
|
|
if (trim ( $results ['string'] ) == '')
|
||
|
|
$results ['string'] = $app_strings ['LBL_NONE'];
|
||
|
|
$extra = "<span onmouseover=\"return overlib('" . str_replace ( array (
|
||
|
|
"\rn",
|
||
|
|
"\r",
|
||
|
|
"\n"
|
||
|
|
), array (
|
||
|
|
'',
|
||
|
|
'',
|
||
|
|
'<br />'
|
||
|
|
), $results ['string'] ) . "', CAPTION, '<div style=\'float:left\'>{$app_strings['LBL_ADDITIONAL_DETAILS']}</div><div style=\'float: right\'>";
|
||
|
|
if ($editAccess)
|
||
|
|
$extra .= (! empty ( $results ['editLink'] ) ? "<a title=\'{$app_strings['LBL_EDIT_BUTTON']}\' href={$results['editLink']}><img border=0 src=" . SugarThemeRegistry::current ()->getImageURL ( 'edit_inline.gif' ) . "></a>" : '');
|
||
|
|
$extra .= (! empty ( $results ['viewLink'] ) ? "<a title=\'{$app_strings['LBL_VIEW_BUTTON']}\' href={$results['viewLink']}><img style=\'margin-left: 2px;\' border=0 src=" . SugarThemeRegistry::current ()->getImageURL ( 'view_inline.gif' ) . "></a>" : '') . "', DELAY, 200, STICKY, MOUSEOFF, 1000, WIDTH, " . (empty ( $results ['width'] ) ? '300' : $results ['width']) . ", CLOSETEXT, '<img border=0 style=\'margin-left:2px; margin-right: 2px;\' src='" . SugarThemeRegistry::current ()->getImageURL ( 'close.gif' ) . "'></div>', " . "CLOSETITLE, '{$app_strings['LBL_ADDITIONAL_DETAILS_CLOSE_TITLE']}', CLOSECLICK, FGCLASS, 'olFgClass', " . "CGCLASS, 'olCgClass', BGCLASS, 'olBgClass', TEXTFONTCLASS, 'olFontClass', CAPTIONFONTCLASS, 'olCapFontClass', CLOSEFONTCLASS, 'olCloseFontClass');\" " . "onmouseout=\"return nd(1000);\"><img style='padding: 0px 5px 0px 2px' border='0' src='" . SugarThemeRegistry::current ()->getImageURL ( 'info_inline.png' ) . "' ></span>";
|
||
|
|
|
||
|
|
$results = $adFunction ( $fields );
|
||
|
|
$results ['string'] = str_replace ( array (
|
||
|
|
"'",
|
||
|
|
"'"
|
||
|
|
), '\'', $results ['string'] ); // no xss!
|
||
|
|
|
||
|
|
if (trim ( $results ['string'] ) == '')
|
||
|
|
$results ['string'] = $app_strings ['LBL_NONE'];
|
||
|
|
$extra = "<span onmouseover=\"return overlib('" . str_replace ( array (
|
||
|
|
"\rn",
|
||
|
|
"\r",
|
||
|
|
"\n"
|
||
|
|
), array (
|
||
|
|
'',
|
||
|
|
'',
|
||
|
|
'<br />'
|
||
|
|
), $results ['string'] ) . "', CAPTION, '<div style=\'float:left\'>{$app_strings['LBL_ADDITIONAL_DETAILS']}</div><div style=\'float: right\'>";
|
||
|
|
if ($editAccess)
|
||
|
|
$extra .= (! empty ( $results ['editLink'] ) ? "<a title=\'{$app_strings['LBL_EDIT_BUTTON']}\' href={$results['editLink']}><img border=0 src=" . SugarThemeRegistry::current ()->getImageURL ( 'edit_inline.gif' ) . "></a>" : '');
|
||
|
|
$extra .= (! empty ( $results ['viewLink'] ) ? "<a title=\'{$app_strings['LBL_VIEW_BUTTON']}\' href={$results['viewLink']}><img style=\'margin-left: 2px;\' border=0 src=" . SugarThemeRegistry::current ()->getImageURL ( 'view_inline.gif' ) . "></a>" : '') . "', DELAY, 200, STICKY, MOUSEOFF, 1000, WIDTH, " . (empty ( $results ['width'] ) ? '300' : $results ['width']) . ", CLOSETEXT, '<img border=0 style=\'margin-left:2px; margin-right: 2px;\' src=" . SugarThemeRegistry::current ()->getImageURL ( 'close.gif' ) . "></div>', " . "CLOSETITLE, '{$app_strings['LBL_ADDITIONAL_DETAILS_CLOSE_TITLE']}', CLOSECLICK, FGCLASS, 'olFgClass', " . "CGCLASS, 'olCgClass', BGCLASS, 'olBgClass', TEXTFONTCLASS, 'olFontClass', CAPTIONFONTCLASS, 'olCapFontClass', CLOSEFONTCLASS, 'olCloseFontClass');\" " . "onmouseout=\"return nd(1000);\"><img style='padding: 0px 5px 0px 2px' border='0' src='" . SugarThemeRegistry::current ()->getImageURL ( 'info_inline.png' ) . "' ></span>";
|
||
|
|
|
||
|
|
return array (
|
||
|
|
'fieldToAddTo' => $results ['fieldToAddTo'],
|
||
|
|
'string' => $extra
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|