This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | /********************************************************************************* |
||
3 | * SugarCRM Community Edition is a customer relationship management program developed by |
||
4 | * SugarCRM, Inc. Copyright (C) 2004-2013 SugarCRM Inc. |
||
5 | |||
6 | * SuiteCRM is an extension to SugarCRM Community Edition developed by Salesagility Ltd. |
||
7 | * Copyright (C) 2011 - 2014 Salesagility Ltd. |
||
8 | * |
||
9 | * This program is free software; you can redistribute it and/or modify it under |
||
10 | * the terms of the GNU Affero General Public License version 3 as published by the |
||
11 | * Free Software Foundation with the addition of the following permission added |
||
12 | * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK |
||
13 | * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY |
||
14 | * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. |
||
15 | * |
||
16 | * This program is distributed in the hope that it will be useful, but WITHOUT |
||
17 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
||
18 | * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more |
||
19 | * details. |
||
20 | * |
||
21 | * You should have received a copy of the GNU Affero General Public License along with |
||
22 | * this program; if not, see http://www.gnu.org/licenses or write to the Free |
||
23 | * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
||
24 | * 02110-1301 USA. |
||
25 | * |
||
26 | * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, |
||
27 | * SW2-130, Cupertino, CA 95014, USA. or at email address [email protected]. |
||
28 | * |
||
29 | * The interactive user interfaces in modified source and object code versions |
||
30 | * of this program must display Appropriate Legal Notices, as required under |
||
31 | * Section 5 of the GNU Affero General Public License version 3. |
||
32 | * |
||
33 | * In accordance with Section 7(b) of the GNU Affero General Public License version 3, |
||
34 | * these Appropriate Legal Notices must retain the display of the "Powered by |
||
35 | * SugarCRM" logo and "Supercharged by SuiteCRM" logo. If the display of the logos is not |
||
36 | * reasonably feasible for technical reasons, the Appropriate Legal Notices must |
||
37 | * display the words "Powered by SugarCRM" and "Supercharged by SuiteCRM". |
||
38 | ********************************************************************************/ |
||
39 | |||
40 | /** |
||
41 | * Base Sugar view |
||
42 | * @api |
||
43 | */ |
||
44 | class SugarView |
||
45 | { |
||
46 | /** |
||
47 | * This array is meant to hold an objects/data that we would like to pass between |
||
48 | * the controller and the view. The bean will automatically be set for us, but this |
||
49 | * is meant to hold anything else. |
||
50 | */ |
||
51 | var $view_object_map = array(); |
||
52 | /** |
||
53 | * The name of the current module. |
||
54 | */ |
||
55 | var $module = ''; |
||
56 | /** |
||
57 | * The name of the current action. |
||
58 | */ |
||
59 | var $action = ''; |
||
60 | /** |
||
61 | */ |
||
62 | var $bean = null; |
||
63 | /** |
||
64 | * @var Sugar_Smarty |
||
65 | * Sugar_Smarty. This is useful if you have a view and a subview you can |
||
66 | * share the same smarty object. |
||
67 | */ |
||
68 | var $ss = null; |
||
69 | /** |
||
70 | * Any errors that occured this can either be set by the view or the controller or the model |
||
71 | */ |
||
72 | var $errors = array(); |
||
73 | /** |
||
74 | * Set to true if you do not want to display errors from SugarView::displayErrors(); instead they will be returned |
||
75 | */ |
||
76 | var $suppressDisplayErrors = false; |
||
77 | |||
78 | /** |
||
79 | * Options for what UI elements to hide/show/ |
||
80 | */ |
||
81 | var $options = array('show_header' => true, 'show_title' => true, 'show_subpanels' => false, 'show_search' => true, 'show_footer' => true, 'show_javascript' => true, 'view_print' => false,); |
||
82 | var $type = null; |
||
83 | var $responseTime; |
||
84 | var $fileResources; |
||
85 | |||
86 | /** |
||
87 | * Constructor which will peform the setup. |
||
88 | */ |
||
89 | 70 | public function __construct( |
|
90 | $bean = null, |
||
91 | $view_object_map = array() |
||
92 | ) |
||
93 | { |
||
94 | 70 | } |
|
95 | |||
96 | /** |
||
97 | * @deprecated deprecated since version 7.6, PHP4 Style Constructors are deprecated and will be remove in 7.8, please update your code, use __construct instead |
||
98 | */ |
||
99 | public function SugarView($bean = null, |
||
100 | $view_object_map = array() |
||
101 | ){ |
||
102 | $deprecatedMessage = 'PHP4 Style Constructors are deprecated and will be remove in 7.8, please update your code'; |
||
103 | if(isset($GLOBALS['log'])) { |
||
104 | $GLOBALS['log']->deprecated($deprecatedMessage); |
||
105 | } |
||
106 | else { |
||
107 | trigger_error($deprecatedMessage, E_USER_DEPRECATED); |
||
108 | } |
||
109 | self::__construct($bean, $view_object_map); |
||
110 | } |
||
111 | |||
112 | |||
113 | 6 | public function init( |
|
114 | $bean = null, |
||
115 | $view_object_map = array() |
||
116 | ) |
||
117 | { |
||
118 | 6 | $this->bean = $bean; |
|
119 | 6 | $this->view_object_map = $view_object_map; |
|
120 | 6 | $this->action = $GLOBALS['action']; |
|
121 | 6 | $this->module = $GLOBALS['module']; |
|
122 | 6 | $this->_initSmarty(); |
|
123 | 5 | } |
|
124 | |||
125 | 6 | protected function _initSmarty() |
|
126 | { |
||
127 | 6 | $this->ss = new Sugar_Smarty(); |
|
128 | 6 | $this->ss->assign('MOD', $GLOBALS['mod_strings']); |
|
129 | 5 | $this->ss->assign('APP', $GLOBALS['app_strings']); |
|
130 | 5 | } |
|
131 | |||
132 | /** |
||
133 | * This method will be called from the controller and is not meant to be overridden. |
||
134 | */ |
||
135 | 1 | public function process() |
|
136 | { |
||
137 | 1 | LogicHook::initialize(); |
|
138 | 1 | $this->_checkModule(); |
|
139 | |||
140 | //trackView has to be here in order to track for breadcrumbs |
||
141 | 1 | $this->_trackView(); |
|
142 | |||
143 | //For the ajaxUI, we need to use output buffering to return the page in an ajax friendly format |
||
144 | 1 | if ($this->_getOption('json_output')){ |
|
145 | ob_start(); |
||
146 | if(!empty($_REQUEST['ajax_load']) && !empty($_REQUEST['loadLanguageJS'])) { |
||
147 | echo $this->_getModLanguageJS(); |
||
148 | } |
||
149 | } |
||
150 | |||
151 | 1 | if ($this->_getOption('show_header')) { |
|
152 | 1 | $this->displayHeader(); |
|
153 | } else { |
||
154 | $this->renderJavascript(); |
||
155 | } |
||
156 | |||
157 | 1 | $this->_buildModuleList(); |
|
158 | 1 | $this->preDisplay(); |
|
159 | 1 | $this->displayErrors(); |
|
160 | 1 | $this->display(); |
|
161 | 1 | if ( !empty($this->module) ) { |
|
162 | 1 | $GLOBALS['logic_hook']->call_custom_logic($this->module, 'after_ui_frame'); |
|
163 | } else { |
||
164 | $GLOBALS['logic_hook']->call_custom_logic('', 'after_ui_frame'); |
||
165 | } |
||
166 | |||
167 | // We have to update jsAlerts as soon as possible |
||
168 | if ( |
||
169 | 1 | !isset($_SESSION['isMobile']) |
|
170 | && |
||
171 | ( |
||
172 | $this instanceof ViewList |
||
173 | 1 | || $this instanceof ViewDetail |
|
174 | 1 | || $this instanceof ViewEdit |
|
175 | ) |
||
176 | ) { |
||
177 | $jsAlerts = new jsAlerts(); |
||
178 | echo $jsAlerts->getScript(); |
||
179 | } |
||
180 | |||
181 | 1 | if ($this->_getOption('show_subpanels') && !empty($_REQUEST['record'])) $this->_displaySubPanels(); |
|
182 | |||
183 | 1 | if ($this->action === 'Login') { |
|
184 | //this is needed for a faster loading login page ie won't render unless the tables are closed |
||
185 | ob_flush(); |
||
186 | } |
||
187 | 1 | if ($this->_getOption('show_footer')) $this->displayFooter(); |
|
188 | 1 | $GLOBALS['logic_hook']->call_custom_logic('', 'after_ui_footer'); |
|
189 | 1 | if ($this->_getOption('json_output')) |
|
190 | { |
||
191 | $content = ob_get_clean(); |
||
192 | $module = $this->module; |
||
193 | $ajax_ret = array( |
||
194 | 'content' => mb_detect_encoding($content) == "UTF-8" ? $content : utf8_encode($content), |
||
195 | 'menu' => array( |
||
196 | 'module' => $module, |
||
197 | 'label' => translate($module), |
||
198 | $this->getMenu($module), |
||
199 | ), |
||
200 | 'title' => $this->getBrowserTitle(), |
||
201 | 'action' => isset($_REQUEST['action']) ? $_REQUEST['action'] : "", |
||
202 | 'record' => isset($_REQUEST['record']) ? $_REQUEST['record'] : "", |
||
203 | 'favicon' => $this->getFavicon(), |
||
204 | ); |
||
205 | |||
206 | if(SugarThemeRegistry::current()->name == 'Classic' || SugarThemeRegistry::current()->classic) |
||
0 ignored issues
–
show
|
|||
207 | $ajax_ret['moduleList'] = $this->displayHeader(true); |
||
208 | |||
209 | if(empty($this->responseTime)) |
||
210 | $this->_calculateFooterMetrics(); |
||
211 | $ajax_ret['responseTime'] = $this->responseTime; |
||
212 | $json = getJSONobj(); |
||
213 | echo $json->encode($ajax_ret); |
||
214 | $GLOBALS['app']->headerDisplayed = false; |
||
215 | ob_flush(); |
||
216 | } |
||
217 | //Do not track if there is no module or if module is not a String |
||
218 | 1 | $this->_track(); |
|
219 | 1 | } |
|
220 | |||
221 | /** |
||
222 | * This method will display the errors on the page. |
||
223 | */ |
||
224 | 2 | public function displayErrors() |
|
225 | { |
||
226 | 2 | $errors = ''; |
|
227 | |||
228 | 2 | foreach($this->errors as $error) { |
|
229 | $errors .= '<span class="error">' . $error . '</span><br>'; |
||
230 | } |
||
231 | |||
232 | 2 | if ( !$this->suppressDisplayErrors ) { |
|
233 | 2 | echo $errors; |
|
234 | } |
||
235 | else { |
||
236 | return $errors; |
||
237 | } |
||
238 | 2 | } |
|
239 | |||
240 | /** |
||
241 | * [OVERRIDE] - This method is meant to overidden in a subclass. The purpose of this method is |
||
242 | * to allow a view to do some preprocessing before the display method is called. This becomes |
||
243 | * useful when you have a view defined at the application level and then within a module |
||
244 | * have a sub-view that extends from this application level view. The application level |
||
245 | * view can do the setup in preDisplay() that is common to itself and any subviews |
||
246 | * and then the subview can just override display(). If it so desires, can also override |
||
247 | * preDisplay(). |
||
248 | */ |
||
249 | 2 | public function preDisplay() |
|
250 | { |
||
251 | 2 | } |
|
252 | |||
253 | /** |
||
254 | * [OVERRIDE] - This method is meant to overidden in a subclass. This method |
||
255 | * will handle the actual display logic of the view. |
||
256 | */ |
||
257 | 2 | public function display() |
|
258 | { |
||
259 | 2 | } |
|
260 | |||
261 | |||
262 | /** |
||
263 | * trackView |
||
264 | */ |
||
265 | 1 | protected function _trackView() |
|
266 | { |
||
267 | 1 | $action = strtolower($this->action); |
|
268 | //Skip save, tracked in SugarBean instead |
||
269 | 1 | if($action == 'save') { |
|
270 | return; |
||
271 | } |
||
272 | |||
273 | |||
274 | 1 | $trackerManager = TrackerManager::getInstance(); |
|
275 | 1 | $timeStamp = TimeDate::getInstance()->nowDb(); |
|
276 | 1 | if($monitor = $trackerManager->getMonitor('tracker')){ |
|
277 | 1 | $monitor->setValue('action', $action); |
|
278 | 1 | $monitor->setValue('user_id', $GLOBALS['current_user']->id); |
|
279 | 1 | $monitor->setValue('module_name', $this->module); |
|
280 | 1 | $monitor->setValue('date_modified', $timeStamp); |
|
281 | 1 | $monitor->setValue('visible', (($monitor->action == 'detailview') || ($monitor->action == 'editview') |
|
282 | 1 | ) ? 1 : 0); |
|
283 | |||
284 | 1 | if (!empty($this->bean->id)) { |
|
285 | $monitor->setValue('item_id', $this->bean->id); |
||
286 | $monitor->setValue('item_summary', $this->bean->get_summary_text()); |
||
287 | } |
||
288 | |||
289 | //If visible is true, but there is no bean, do not track (invalid/unauthorized reference) |
||
290 | //Also, do not track save actions where there is no bean id |
||
291 | 1 | if($monitor->visible && empty($this->bean->id)) { |
|
292 | $trackerManager->unsetMonitor($monitor); |
||
293 | return; |
||
294 | } |
||
295 | 1 | $trackerManager->saveMonitor($monitor, true, true); |
|
296 | } |
||
297 | 1 | } |
|
298 | |||
299 | |||
300 | /** |
||
301 | * Displays the header on section of the page; basically everything before the content |
||
302 | */ |
||
303 | 2 | public function displayHeader($retModTabs=false) |
|
304 | { |
||
305 | 2 | global $theme; |
|
306 | 2 | global $max_tabs; |
|
307 | 2 | global $app_strings; |
|
308 | 2 | global $current_user; |
|
309 | 2 | global $sugar_config; |
|
310 | 2 | global $app_list_strings; |
|
311 | 2 | global $mod_strings; |
|
312 | 2 | global $current_language; |
|
313 | |||
314 | 2 | $GLOBALS['app']->headerDisplayed = true; |
|
315 | |||
316 | 2 | $themeObject = SugarThemeRegistry::current(); |
|
317 | 2 | $theme = $themeObject->__toString(); |
|
318 | |||
319 | 2 | $ss = new Sugar_Smarty(); |
|
320 | 2 | $ss->assign("APP", $app_strings); |
|
321 | 2 | $ss->assign("THEME", $theme); |
|
322 | 2 | $ss->assign("THEME_CONFIG", $themeObject->getConfig()); |
|
323 | 2 | $ss->assign("THEME_IE6COMPAT", $themeObject->ie6compat ? 'true':'false'); |
|
0 ignored issues
–
show
The property
ie6compat does not exist on object<SugarTheme> . Since you implemented __get , maybe consider adding a @property annotation.
Since your code implements the magic getter <?php
/**
* @property int $x
* @property int $y
* @property string $text
*/
class MyLabel
{
private $properties;
private $allowedProperties = array('x', 'y', 'text');
public function __get($name)
{
if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
return $properties[$name];
} else {
return null;
}
}
public function __set($name, $value)
{
if (in_array($name, $this->allowedProperties)) {
$properties[$name] = $value;
} else {
throw new \LogicException("Property $name is not defined.");
}
}
}
If the property has read access only, you can use the @property-read annotation instead. Of course, you may also just have mistyped another name, in which case you should fix the error. See also the PhpDoc documentation for @property. ![]() |
|||
324 | 2 | $ss->assign("MODULE_NAME", $this->module); |
|
325 | 2 | $ss->assign("langHeader", get_language_header()); |
|
326 | |||
327 | // set ab testing if exists |
||
328 | 2 | $testing = (isset($_REQUEST["testing"]) ? $_REQUEST['testing'] : "a"); |
|
329 | 2 | $ss->assign("ABTESTING", $testing); |
|
330 | |||
331 | // get browser title |
||
332 | 2 | $ss->assign("SYSTEM_NAME", $this->getBrowserTitle()); |
|
333 | |||
334 | // get css |
||
335 | 2 | $css = $themeObject->getCSS(); |
|
336 | 2 | if ($this->_getOption('view_print')) { |
|
337 | $css .= '<link rel="stylesheet" type="text/css" href="'.$themeObject->getCSSURL('print.css').'" media="all" />'; |
||
338 | } |
||
339 | 2 | $ss->assign("SUGAR_CSS",$css); |
|
340 | |||
341 | // get javascript |
||
342 | 2 | ob_start(); |
|
343 | 2 | $this->renderJavascript(); |
|
344 | |||
345 | 2 | $ss->assign("SUGAR_JS",ob_get_contents().$themeObject->getJS()); |
|
346 | 2 | ob_end_clean(); |
|
347 | |||
348 | // get favicon |
||
349 | 2 | if(isset($GLOBALS['sugar_config']['default_module_favicon'])) |
|
350 | $module_favicon = $GLOBALS['sugar_config']['default_module_favicon']; |
||
351 | else |
||
352 | 2 | $module_favicon = false; |
|
353 | |||
354 | 2 | $favicon = $this->getFavicon(); |
|
355 | 2 | $ss->assign('FAVICON_URL', $favicon['url']); |
|
356 | |||
357 | // build the shortcut menu |
||
358 | 2 | $shortcut_menu = array(); |
|
359 | 2 | foreach ( $this->getMenu() as $key => $menu_item ) |
|
360 | 2 | $shortcut_menu[$key] = array( |
|
361 | 2 | "URL" => $menu_item[0], |
|
362 | 2 | "LABEL" => $menu_item[1], |
|
363 | 2 | "MODULE_NAME" => $menu_item[2], |
|
364 | "IMAGE" => $themeObject |
||
365 | 2 | ->getImage($menu_item[2],"border='0' align='absmiddle'",null,null,'.gif',$menu_item[1]), |
|
366 | ); |
||
367 | 2 | $ss->assign("SHORTCUT_MENU",$shortcut_menu); |
|
368 | |||
369 | // handle rtl text direction |
||
370 | 2 | if(isset($_REQUEST['RTL']) && $_REQUEST['RTL'] == 'RTL'){ |
|
371 | $_SESSION['RTL'] = true; |
||
372 | } |
||
373 | 2 | if(isset($_REQUEST['LTR']) && $_REQUEST['LTR'] == 'LTR'){ |
|
374 | unset($_SESSION['RTL']); |
||
375 | } |
||
376 | 2 | if(isset($_SESSION['RTL']) && $_SESSION['RTL']){ |
|
377 | $ss->assign("DIR", 'dir="RTL"'); |
||
378 | } |
||
379 | |||
380 | // handle resizing of the company logo correctly on the fly |
||
381 | 2 | $companyLogoURL = $themeObject->getImageURL('company_logo.png'); |
|
382 | 2 | $companyLogoURL_arr = explode('?', $companyLogoURL); |
|
383 | 2 | $companyLogoURL = $companyLogoURL_arr[0]; |
|
384 | |||
385 | 2 | $company_logo_attributes = sugar_cache_retrieve('company_logo_attributes'); |
|
386 | 2 | if(!empty($company_logo_attributes)) { |
|
387 | 1 | $ss->assign("COMPANY_LOGO_MD5", $company_logo_attributes[0]); |
|
388 | 1 | $ss->assign("COMPANY_LOGO_WIDTH", $company_logo_attributes[1]); |
|
389 | 1 | $ss->assign("COMPANY_LOGO_HEIGHT", $company_logo_attributes[2]); |
|
390 | } |
||
391 | else { |
||
392 | // Always need to md5 the file |
||
393 | 1 | $ss->assign("COMPANY_LOGO_MD5", md5_file($companyLogoURL)); |
|
394 | |||
395 | 1 | list($width,$height) = getimagesize($companyLogoURL); |
|
396 | 1 | if ( $width > 212 || $height > 40 ) { |
|
397 | 1 | $resizePctWidth = ($width - 212)/212; |
|
398 | 1 | $resizePctHeight = ($height - 40)/40; |
|
399 | 1 | if ( $resizePctWidth > $resizePctHeight ) |
|
400 | $resizeAmount = $width / 212; |
||
401 | else |
||
402 | 1 | $resizeAmount = $height / 40; |
|
403 | 1 | $ss->assign("COMPANY_LOGO_WIDTH", round($width * (1/$resizeAmount))); |
|
404 | 1 | $ss->assign("COMPANY_LOGO_HEIGHT", round($height * (1/$resizeAmount))); |
|
405 | } |
||
406 | else { |
||
407 | $ss->assign("COMPANY_LOGO_WIDTH", $width); |
||
408 | $ss->assign("COMPANY_LOGO_HEIGHT", $height); |
||
409 | } |
||
410 | |||
411 | // Let's cache the results |
||
412 | 1 | sugar_cache_put('company_logo_attributes', |
|
413 | array( |
||
414 | 1 | $ss->get_template_vars("COMPANY_LOGO_MD5"), |
|
415 | 1 | $ss->get_template_vars("COMPANY_LOGO_WIDTH"), |
|
416 | 1 | $ss->get_template_vars("COMPANY_LOGO_HEIGHT") |
|
417 | ) |
||
418 | ); |
||
419 | } |
||
420 | 2 | $ss->assign("COMPANY_LOGO_URL",getJSPath($companyLogoURL)."&logo_md5=".$ss->get_template_vars("COMPANY_LOGO_MD5")); |
|
421 | |||
422 | // get the global links |
||
423 | 2 | $gcls = array(); |
|
424 | 2 | $global_control_links = array(); |
|
425 | 2 | require("include/globalControlLinks.php"); |
|
426 | |||
427 | 2 | foreach($global_control_links as $key => $value) { |
|
428 | 2 | if ($key == 'users') { //represents logout link. |
|
429 | 2 | $ss->assign("LOGOUT_LINK", $value['linkinfo'][key($value['linkinfo'])]); |
|
430 | 2 | $ss->assign("LOGOUT_LABEL", key($value['linkinfo']));//key value for first element. |
|
431 | 2 | continue; |
|
432 | } |
||
433 | |||
434 | 2 | foreach ($value as $linkattribute => $attributevalue) { |
|
435 | // get the main link info |
||
436 | 2 | if ( $linkattribute == 'linkinfo' ) { |
|
437 | 2 | $gcls[$key] = array( |
|
438 | 2 | "LABEL" => key($attributevalue), |
|
439 | 2 | "URL" => current($attributevalue), |
|
440 | "SUBMENU" => array(), |
||
441 | ); |
||
442 | 2 | if(substr($gcls[$key]["URL"], 0, 11) == "javascript:") { |
|
443 | 2 | $gcls[$key]["ONCLICK"] = substr($gcls[$key]["URL"],11); |
|
444 | 2 | $gcls[$key]["URL"] = "javascript:void(0)"; |
|
445 | } |
||
446 | } |
||
447 | // and now the sublinks |
||
448 | 2 | if ( $linkattribute == 'submenu' && is_array($attributevalue) ) { |
|
449 | foreach ($attributevalue as $submenulinkkey => $submenulinkinfo) |
||
450 | $gcls[$key]['SUBMENU'][$submenulinkkey] = array( |
||
451 | "LABEL" => key($submenulinkinfo), |
||
452 | "URL" => current($submenulinkinfo), |
||
453 | ); |
||
454 | if(substr($gcls[$key]['SUBMENU'][$submenulinkkey]["URL"], 0, 11) == "javascript:") { |
||
455 | $gcls[$key]['SUBMENU'][$submenulinkkey]["ONCLICK"] = substr($gcls[$key]['SUBMENU'][$submenulinkkey]["URL"],11); |
||
0 ignored issues
–
show
The variable
$submenulinkkey seems to be defined by a foreach iteration on line 449 . Are you sure the iterator is never empty, otherwise this variable is not defined?
It seems like you are relying on a variable being defined by an iteration: foreach ($a as $b) {
}
// $b is defined here only if $a has elements, for example if $a is array()
// then $b would not be defined here. To avoid that, we recommend to set a
// default value for $b.
// Better
$b = 0; // or whatever default makes sense in your context
foreach ($a as $b) {
}
// $b is now guaranteed to be defined here.
![]() |
|||
456 | 2 | $gcls[$key]['SUBMENU'][$submenulinkkey]["URL"] = "javascript:void(0)"; |
|
457 | } |
||
458 | } |
||
459 | } |
||
460 | } |
||
461 | 2 | $ss->assign("GCLS",$gcls); |
|
462 | |||
463 | 2 | $ss->assign("SEARCH", isset($_REQUEST['query_string']) ? $_REQUEST['query_string'] : ''); |
|
464 | |||
465 | 2 | if ($this->action == "EditView" || $this->action == "Login") |
|
466 | $ss->assign("ONLOAD", 'onload="set_focus()"'); |
||
467 | |||
468 | 2 | $ss->assign("AUTHENTICATED",isset($_SESSION["authenticated_user_id"])); |
|
469 | |||
470 | // get other things needed for page style popup |
||
471 | 2 | if (isset($_SESSION["authenticated_user_id"])) { |
|
472 | // get the current user name and id |
||
473 | $ss->assign("CURRENT_USER", $current_user->full_name == '' || !showFullName() |
||
474 | ? $current_user->user_name : $current_user->full_name ); |
||
475 | $ss->assign("CURRENT_USER_ID", $current_user->id); |
||
476 | |||
477 | // get the last viewed records |
||
478 | require_once("modules/Favorites/Favorites.php"); |
||
479 | $favorites = new Favorites(); |
||
480 | $favorite_records = $favorites->getCurrentUserSidebarFavorites(); |
||
481 | $ss->assign("favoriteRecords",$favorite_records); |
||
482 | |||
483 | $tracker = new Tracker(); |
||
484 | $history = $tracker->get_recently_viewed($current_user->id); |
||
485 | $ss->assign("recentRecords",$this->processRecentRecords($history)); |
||
486 | } |
||
487 | |||
488 | 2 | $bakModStrings = $mod_strings; |
|
489 | 2 | if (isset($_SESSION["authenticated_user_id"]) ) { |
|
490 | // get the module list |
||
491 | $moduleTopMenu = array(); |
||
492 | |||
493 | $max_tabs = $current_user->getPreference('max_tabs'); |
||
494 | // Attempt to correct if max tabs count is extremely high. |
||
495 | if ( !isset($max_tabs) || $max_tabs <= 0 || $max_tabs > 10 ) { |
||
496 | $max_tabs = $GLOBALS['sugar_config']['default_max_tabs']; |
||
497 | $current_user->setPreference('max_tabs', $max_tabs, 0, 'global'); |
||
498 | } |
||
499 | |||
500 | $moduleTab = $this->_getModuleTab(); |
||
501 | $ss->assign('MODULE_TAB',$moduleTab); |
||
502 | |||
503 | |||
504 | // See if they are using grouped tabs or not (removed in 6.0, returned in 6.1) |
||
505 | $user_navigation_paradigm = $current_user->getPreference('navigation_paradigm'); |
||
506 | if ( !isset($user_navigation_paradigm) ) { |
||
507 | $user_navigation_paradigm = $GLOBALS['sugar_config']['default_navigation_paradigm']; |
||
508 | } |
||
509 | |||
510 | |||
511 | // Get the full module list for later use |
||
512 | foreach ( query_module_access_list($current_user) as $module ) { |
||
513 | // Bug 25948 - Check for the module being in the moduleList |
||
514 | if ( isset($app_list_strings['moduleList'][$module]) ) { |
||
515 | $fullModuleList[$module] = $app_list_strings['moduleList'][$module]; |
||
516 | } |
||
517 | } |
||
518 | |||
519 | |||
520 | if(!should_hide_iframes()) { |
||
521 | $iFrame = new iFrame(); |
||
522 | $frames = $iFrame->lookup_frames('tab'); |
||
523 | foreach($frames as $key => $values){ |
||
524 | $fullModuleList[$key] = $values; |
||
525 | } |
||
526 | } |
||
527 | elseif (isset($fullModuleList['iFrames'])) { |
||
528 | unset($fullModuleList['iFrames']); |
||
529 | } |
||
530 | |||
531 | if ( $user_navigation_paradigm == 'gm' && isset($themeObject->group_tabs) && $themeObject->group_tabs) { |
||
532 | // We are using grouped tabs |
||
533 | require_once('include/GroupedTabs/GroupedTabStructure.php'); |
||
534 | $groupedTabsClass = new GroupedTabStructure(); |
||
535 | $modules = query_module_access_list($current_user); |
||
536 | //handle with submoremodules |
||
537 | $max_tabs = $current_user->getPreference('max_tabs'); |
||
538 | // If the max_tabs isn't set incorrectly, set it within the range, to the default max sub tabs size |
||
539 | if ( !isset($max_tabs) || $max_tabs <= 0 || $max_tabs > 10){ |
||
540 | // We have a default value. Use it |
||
541 | if(isset($GLOBALS['sugar_config']['default_max_tabs'])){ |
||
542 | $max_tabs = $GLOBALS['sugar_config']['default_max_tabs']; |
||
543 | } |
||
544 | else{ |
||
545 | $max_tabs = 8; |
||
546 | } |
||
547 | } |
||
548 | |||
549 | $subMoreModules = false; |
||
550 | $groupTabs = $groupedTabsClass->get_tab_structure(get_val_array($modules)); |
||
551 | // We need to put this here, so the "All" group is valid for the user's preference. |
||
552 | $groupTabs[$app_strings['LBL_TABGROUP_ALL']]['modules'] = $fullModuleList; |
||
553 | |||
554 | |||
555 | // Setup the default group tab. |
||
556 | $allGroup = $app_strings['LBL_TABGROUP_ALL']; |
||
557 | $ss->assign('currentGroupTab',$allGroup); |
||
558 | $currentGroupTab = $allGroup; |
||
559 | $usersGroup = $current_user->getPreference('theme_current_group'); |
||
560 | // Figure out which tab they currently have selected (stored as a user preference) |
||
561 | if ( !empty($usersGroup) && isset($groupTabs[$usersGroup]) ) { |
||
562 | $currentGroupTab = $usersGroup; |
||
563 | } else { |
||
564 | $current_user->setPreference('theme_current_group',$currentGroupTab); |
||
565 | } |
||
566 | |||
567 | $ss->assign('currentGroupTab',$currentGroupTab); |
||
568 | $usingGroupTabs = true; |
||
569 | |||
570 | } else { |
||
571 | // Setup the default group tab. |
||
572 | $ss->assign('currentGroupTab',$app_strings['LBL_TABGROUP_ALL']); |
||
573 | |||
574 | $usingGroupTabs = false; |
||
575 | |||
576 | $groupTabs[$app_strings['LBL_TABGROUP_ALL']]['modules'] = $fullModuleList; |
||
577 | |||
578 | } |
||
579 | |||
580 | |||
581 | $topTabList = array(); |
||
582 | |||
583 | // Now time to go through each of the tab sets and fix them up. |
||
584 | foreach ( $groupTabs as $tabIdx => $tabData ) { |
||
585 | $topTabs = $tabData['modules']; |
||
586 | if ( ! is_array($topTabs) ) { |
||
587 | $topTabs = array(); |
||
588 | } |
||
589 | $extraTabs = array(); |
||
590 | |||
591 | // Split it in to the tabs that go across the top, and the ones that are on the extra menu. |
||
592 | if ( count($topTabs) > $max_tabs ) { |
||
593 | $extraTabs = array_splice($topTabs,$max_tabs); |
||
594 | } |
||
595 | // Make sure the current module is accessable through one of the top tabs |
||
596 | if ( !isset($topTabs[$moduleTab]) ) { |
||
597 | // Nope, we need to add it. |
||
598 | // First, take it out of the extra menu, if it's there |
||
599 | if ( isset($extraTabs[$moduleTab]) ) { |
||
600 | unset($extraTabs[$moduleTab]); |
||
601 | } |
||
602 | if ( count($topTabs) >= $max_tabs - 1 ) { |
||
603 | // We already have the maximum number of tabs, so we need to shuffle the last one |
||
604 | // from the top to the first one of the extras |
||
605 | $lastElem = array_splice($topTabs,$max_tabs-1); |
||
606 | $extraTabs = $lastElem + $extraTabs; |
||
607 | } |
||
608 | if ( !empty($moduleTab) ) { |
||
609 | $topTabs[$moduleTab] = $app_list_strings['moduleList'][$moduleTab]; |
||
610 | } |
||
611 | } |
||
612 | |||
613 | |||
614 | /* |
||
615 | // This was removed, but I like the idea, so I left the code in here in case we decide to turn it back on |
||
616 | // If we are using group tabs, add all the "hidden" tabs to the end of the extra menu |
||
617 | if ( $usingGroupTabs ) { |
||
618 | foreach($fullModuleList as $moduleKey => $module ) { |
||
619 | if ( !isset($topTabs[$moduleKey]) && !isset($extraTabs[$moduleKey]) ) { |
||
620 | $extraTabs[$moduleKey] = $module; |
||
621 | } |
||
622 | } |
||
623 | } |
||
624 | */ |
||
625 | |||
626 | // Get a unique list of the top tabs so we can build the popup menus for them |
||
627 | foreach ( $topTabs as $moduleKey => $module ) { |
||
628 | $topTabList[$moduleKey] = $module; |
||
629 | } |
||
630 | |||
631 | $groupTabs[$tabIdx]['modules'] = $topTabs; |
||
632 | $groupTabs[$tabIdx]['extra'] = $extraTabs; |
||
633 | } |
||
634 | } |
||
635 | |||
636 | 2 | if ( isset($topTabList) && is_array($topTabList) ) { |
|
637 | // Adding shortcuts array to menu array for displaying shortcuts associated with each module |
||
638 | $shortcutTopMenu = array(); |
||
639 | foreach($topTabList as $module_key => $label) { |
||
640 | global $mod_strings; |
||
641 | $mod_strings = return_module_language($current_language, $module_key); |
||
642 | foreach ( $this->getMenu($module_key) as $key => $menu_item ) { |
||
643 | $shortcutTopMenu[$module_key][$key] = array( |
||
644 | "URL" => $menu_item[0], |
||
645 | "LABEL" => $menu_item[1], |
||
646 | "MODULE_NAME" => $menu_item[2], |
||
647 | "IMAGE" => $themeObject |
||
648 | ->getImage($menu_item[2],"border='0' align='absmiddle'",null,null,'.gif',$menu_item[1]), |
||
649 | "ID" => $menu_item[2]."_link", |
||
650 | ); |
||
651 | } |
||
652 | } |
||
653 | if(!empty($sugar_config['lock_homepage']) && $sugar_config['lock_homepage'] == true) $ss->assign('lock_homepage', true); |
||
654 | $ss->assign("groupTabs",$groupTabs); |
||
655 | $ss->assign("shortcutTopMenu",$shortcutTopMenu); |
||
656 | $ss->assign('USE_GROUP_TABS',$usingGroupTabs); |
||
657 | |||
658 | // This is here for backwards compatibility, someday, somewhere, it will be able to be removed |
||
659 | $ss->assign("moduleTopMenu",$groupTabs[$app_strings['LBL_TABGROUP_ALL']]['modules']); |
||
660 | $ss->assign("moduleExtraMenu",$groupTabs[$app_strings['LBL_TABGROUP_ALL']]['extra']); |
||
661 | |||
662 | |||
663 | } |
||
664 | |||
665 | 2 | if ( isset($extraTabs) && is_array($extraTabs) ) { |
|
666 | // Adding shortcuts array to extra menu array for displaying shortcuts associated with each module |
||
667 | $shortcutExtraMenu = array(); |
||
668 | foreach($extraTabs as $module_key => $label) { |
||
669 | global $mod_strings; |
||
670 | $mod_strings = return_module_language($current_language, $module_key); |
||
671 | foreach ( $this->getMenu($module_key) as $key => $menu_item ) { |
||
672 | $shortcutExtraMenu[$module_key][$key] = array( |
||
673 | "URL" => $menu_item[0], |
||
674 | "LABEL" => $menu_item[1], |
||
675 | "MODULE_NAME" => $menu_item[2], |
||
676 | "IMAGE" => $themeObject |
||
677 | ->getImage($menu_item[2],"border='0' align='absmiddle'",null,null,'.gif',$menu_item[1]), |
||
678 | "ID" => $menu_item[2]."_link", |
||
679 | ); |
||
680 | } |
||
681 | } |
||
682 | $ss->assign("shortcutExtraMenu",$shortcutExtraMenu); |
||
683 | } |
||
684 | |||
685 | 2 | if(!empty($current_user)){ |
|
686 | 2 | $ss->assign("max_tabs", $current_user->getPreference("max_tabs")); |
|
687 | } |
||
688 | |||
689 | |||
690 | 2 | $imageURL = SugarThemeRegistry::current()->getImageURL("dashboard.png"); |
|
691 | 2 | $homeImage = "<img src='$imageURL'>"; |
|
692 | 2 | $ss->assign("homeImage",$homeImage); |
|
693 | 2 | global $mod_strings; |
|
694 | 2 | $mod_strings = $bakModStrings; |
|
695 | 2 | $headerTpl = $themeObject->getTemplate('header.tpl'); |
|
696 | 2 | if (inDeveloperMode() ) |
|
697 | $ss->clear_compiled_tpl($headerTpl); |
||
698 | |||
699 | 2 | if ($retModTabs) |
|
700 | { |
||
701 | return $ss->fetch($themeObject->getTemplate('_headerModuleList.tpl')); |
||
702 | } else { |
||
703 | 2 | $ss->display($headerTpl); |
|
704 | |||
705 | 2 | $this->includeClassicFile('modules/Administration/DisplayWarnings.php'); |
|
706 | |||
707 | 2 | $errorMessages = SugarApplication::getErrorMessages(); |
|
708 | 2 | if ( !empty($errorMessages)) { |
|
709 | foreach ( $errorMessages as $error_message ) { |
||
710 | echo('<p class="error">' . $error_message.'</p>'); |
||
711 | } |
||
712 | } |
||
713 | } |
||
714 | |||
715 | 2 | } |
|
716 | |||
717 | 1 | function getModuleMenuHTML() |
|
718 | { |
||
719 | |||
720 | 1 | } |
|
721 | |||
722 | /** |
||
723 | * If the view is classic then this method will include the file and |
||
724 | * setup any global variables. |
||
725 | * |
||
726 | * @param string $file |
||
727 | */ |
||
728 | 4 | public function includeClassicFile( |
|
729 | $file |
||
730 | ) |
||
731 | { |
||
732 | 4 | global $sugar_config, $theme, $current_user, $sugar_version, $sugar_flavor, $mod_strings, $app_strings, $app_list_strings, $action; |
|
733 | 4 | global $gridline, $request_string, $modListHeader, $dashletData, $authController, $locale, $currentModule, $import_bean_map, $image_path, $license; |
|
734 | 4 | global $user_unique_key, $server_unique_key, $barChartColors, $modules_exempt_from_availability_check, $dictionary, $current_language, $beanList, $beanFiles, $sugar_build, $sugar_codename; |
|
735 | 4 | global $timedate, $login_error; // cn: bug 13855 - timedate not available to classic views. |
|
736 | 4 | if (!empty($this->module)) |
|
737 | 3 | $currentModule = $this->module; |
|
738 | 4 | require_once ($file); |
|
739 | 4 | } |
|
740 | |||
741 | protected function _displayLoginJS() |
||
742 | { |
||
743 | global $sugar_config, $timedate; |
||
744 | |||
745 | if(isset($this->bean->module_dir)){ |
||
746 | echo "<script>var module_sugar_grp1 = '{$this->bean->module_dir}';</script>"; |
||
747 | } |
||
748 | if(isset($_REQUEST['action'])){ |
||
749 | echo "<script>var action_sugar_grp1 = '{$_REQUEST['action']}';</script>"; |
||
750 | } |
||
751 | echo '<script>jscal_today = 1000*' . $timedate->asUserTs($timedate->getNow()) . '; if(typeof app_strings == "undefined") app_strings = new Array();</script>'; |
||
752 | if (!is_file(sugar_cached("include/javascript/sugar_grp1.js"))) { |
||
753 | $_REQUEST['root_directory'] = "."; |
||
754 | require_once("jssource/minify_utils.php"); |
||
755 | ConcatenateFiles("."); |
||
756 | } |
||
757 | echo getVersionedScript('cache/include/javascript/sugar_grp1_jquery.js'); |
||
758 | echo getVersionedScript('cache/include/javascript/sugar_grp1_yui.js'); |
||
759 | echo getVersionedScript('cache/include/javascript/sugar_grp1.js'); |
||
760 | echo getVersionedScript('include/javascript/calendar.js'); |
||
761 | echo <<<EOQ |
||
762 | <script> |
||
763 | if ( typeof(SUGAR) == 'undefined' ) {SUGAR = {}}; |
||
764 | if ( typeof(SUGAR.themes) == 'undefined' ) SUGAR.themes = {}; |
||
765 | </script> |
||
766 | EOQ; |
||
767 | if(isset( $sugar_config['disc_client']) && $sugar_config['disc_client']) |
||
768 | echo getVersionedScript('modules/Sync/headersync.js'); |
||
769 | } |
||
770 | |||
771 | /** |
||
772 | * Get JS validation code for views |
||
773 | */ |
||
774 | 4 | public static function getJavascriptValidation() |
|
775 | { |
||
776 | 4 | global $timedate; |
|
777 | 4 | $cal_date_format = $timedate->get_cal_date_format(); |
|
778 | 4 | $timereg = $timedate->get_regular_expression($timedate->get_time_format()); |
|
779 | 4 | $datereg = $timedate->get_regular_expression($timedate->get_date_format()); |
|
780 | 4 | $date_pos = ''; |
|
781 | 4 | foreach ($datereg['positions'] as $type => $pos) { |
|
782 | 4 | if (empty($date_pos)) { |
|
783 | 4 | $date_pos .= "'$type': $pos"; |
|
784 | } else { |
||
785 | 4 | $date_pos .= ",'$type': $pos"; |
|
786 | } |
||
787 | } |
||
788 | |||
789 | 4 | $time_separator = $timedate->timeSeparator(); |
|
790 | 4 | $hour_offset = $timedate->getUserUTCOffset() * 60; |
|
791 | |||
792 | // Add in the number formatting styles here as well, we have been handling this with individual modules. |
||
793 | 4 | require_once ('modules/Currencies/Currency.php'); |
|
794 | 4 | list ($num_grp_sep, $dec_sep) = get_number_seperators(); |
|
795 | |||
796 | $the_script = "<script type=\"text/javascript\">\n" . "\tvar time_reg_format = '" . |
||
797 | 4 | $timereg['format'] . "';\n" . "\tvar date_reg_format = '" . |
|
798 | 4 | $datereg['format'] . "';\n" . "\tvar date_reg_positions = { $date_pos };\n" . |
|
799 | 4 | "\tvar time_separator = '$time_separator';\n" . |
|
800 | 4 | "\tvar cal_date_format = '$cal_date_format';\n" . |
|
801 | 4 | "\tvar time_offset = $hour_offset;\n" . "\tvar num_grp_sep = '$num_grp_sep';\n" . |
|
802 | 4 | "\tvar dec_sep = '$dec_sep';\n" . "</script>"; |
|
803 | |||
804 | 4 | return $the_script; |
|
805 | } |
||
806 | |||
807 | /** |
||
808 | * Called from process(). This method will display the correct javascript. |
||
809 | */ |
||
810 | 3 | protected function _displayJavascript() |
|
811 | { |
||
812 | 3 | global $locale, $sugar_config, $timedate; |
|
813 | |||
814 | |||
815 | 3 | if ($this->_getOption('show_javascript')) { |
|
816 | 3 | if (!$this->_getOption('show_header')) { |
|
817 | $langHeader = get_language_header(); |
||
818 | |||
819 | echo <<<EOHTML |
||
820 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
||
821 | <html {$langHeader}> |
||
822 | <head> |
||
823 | EOHTML; |
||
824 | } |
||
825 | |||
826 | $js_vars = array( |
||
827 | 3 | "sugar_cache_dir" => "cache/", |
|
828 | ); |
||
829 | |||
830 | 3 | if(isset($this->bean->module_dir)){ |
|
831 | $js_vars['module_sugar_grp1'] = $this->bean->module_dir; |
||
832 | } |
||
833 | 3 | if(isset($_REQUEST['action'])){ |
|
834 | $js_vars['action_sugar_grp1'] = $_REQUEST['action']; |
||
835 | } |
||
836 | 3 | echo '<script>jscal_today = 1000*' . $timedate->asUserTs($timedate->getNow()) . '; if(typeof app_strings == "undefined") app_strings = new Array();</script>'; |
|
837 | 3 | if (!is_file(sugar_cached("include/javascript/sugar_grp1.js")) || !is_file(sugar_cached("include/javascript/sugar_grp1_yui.js")) || !is_file(sugar_cached("include/javascript/sugar_grp1_jquery.js"))) { |
|
838 | $_REQUEST['root_directory'] = "."; |
||
839 | require_once("jssource/minify_utils.php"); |
||
840 | ConcatenateFiles("."); |
||
841 | } |
||
842 | 3 | echo getVersionedScript('cache/include/javascript/sugar_grp1_jquery.js'); |
|
843 | 3 | echo getVersionedScript('cache/include/javascript/sugar_grp1_yui.js'); |
|
844 | 3 | echo getVersionedScript('cache/include/javascript/sugar_grp1.js'); |
|
845 | 3 | echo getVersionedScript('include/javascript/calendar.js'); |
|
846 | |||
847 | // output necessary config js in the top of the page |
||
848 | 3 | $config_js = $this->getSugarConfigJS(); |
|
849 | 3 | if(!empty($config_js)){ |
|
850 | 3 | echo "<script>\n".implode("\n", $config_js)."</script>\n"; |
|
851 | } |
||
852 | |||
853 | 3 | if ( isset($sugar_config['email_sugarclient_listviewmaxselect']) ) { |
|
854 | echo "<script>SUGAR.config.email_sugarclient_listviewmaxselect = {$GLOBALS['sugar_config']['email_sugarclient_listviewmaxselect']};</script>"; |
||
855 | } |
||
856 | |||
857 | 3 | $image_server = (defined('TEMPLATE_URL'))?TEMPLATE_URL . '/':''; |
|
858 | 3 | echo '<script type="text/javascript">SUGAR.themes.image_server="' . $image_server . '";</script>'; // cn: bug 12274 - create session-stored key to defend against CSRF |
|
859 | 3 | echo '<script type="text/javascript">var name_format = "' . $locale->getLocaleFormatMacro() . '";</script>'; |
|
860 | 3 | echo self::getJavascriptValidation(); |
|
861 | 3 | if (!is_file(sugar_cached('jsLanguage/') . $GLOBALS['current_language'] . '.js')) { |
|
862 | 1 | require_once ('include/language/jsLanguage.php'); |
|
863 | 1 | jsLanguage::createAppStringsCache($GLOBALS['current_language']); |
|
864 | } |
||
865 | 3 | echo getVersionedScript('cache/jsLanguage/'. $GLOBALS['current_language'] . '.js', $GLOBALS['sugar_config']['js_lang_version']); |
|
866 | |||
867 | 3 | echo $this->_getModLanguageJS(); |
|
868 | |||
869 | 3 | if(isset( $sugar_config['disc_client']) && $sugar_config['disc_client']) |
|
870 | echo getVersionedScript('modules/Sync/headersync.js'); |
||
871 | |||
872 | |||
873 | //echo out the $js_vars variables as javascript variables |
||
874 | 3 | echo "<script type='text/javascript'>\n"; |
|
875 | 3 | foreach($js_vars as $var=>$value) |
|
876 | { |
||
877 | 3 | echo "var {$var} = '{$value}';\n"; |
|
878 | } |
||
879 | 3 | echo "</script>\n"; |
|
880 | } |
||
881 | 3 | } |
|
882 | |||
883 | 3 | protected function _getModLanguageJS(){ |
|
884 | 3 | if (!is_file(sugar_cached('jsLanguage/') . $this->module . '/' . $GLOBALS['current_language'] . '.js')) { |
|
885 | 1 | require_once ('include/language/jsLanguage.php'); |
|
886 | 1 | jsLanguage::createModuleStringsCache($this->module, $GLOBALS['current_language']); |
|
887 | } |
||
888 | 3 | return getVersionedScript("cache/jsLanguage/{$this->module}/". $GLOBALS['current_language'] . '.js', $GLOBALS['sugar_config']['js_lang_version']); |
|
889 | } |
||
890 | |||
891 | /** |
||
892 | * Called from process(). This method will display the footer on the page. |
||
893 | */ |
||
894 | 2 | public function displayFooter() |
|
895 | { |
||
896 | 2 | if (empty($this->responseTime)) { |
|
897 | 2 | $this->_calculateFooterMetrics(); |
|
898 | } |
||
899 | 2 | global $sugar_config; |
|
900 | 2 | global $app_strings; |
|
901 | 2 | global $mod_strings; |
|
902 | 2 | $themeObject = SugarThemeRegistry::current(); |
|
903 | //decide whether or not to show themepicker, default is to show |
||
904 | 2 | $showThemePicker = true; |
|
905 | 2 | if (isset($sugar_config['showThemePicker'])) { |
|
906 | 2 | $showThemePicker = $sugar_config['showThemePicker']; |
|
907 | } |
||
908 | |||
909 | 2 | $ss = new Sugar_Smarty(); |
|
910 | 2 | $ss->assign("AUTHENTICATED",isset($_SESSION["authenticated_user_id"])); |
|
911 | 2 | $ss->assign('MOD',return_module_language($GLOBALS['current_language'], 'Users')); |
|
912 | |||
913 | 2 | $bottomLinkList = array(); |
|
914 | 2 | if (isset($this->action) && $this->action != "EditView") { |
|
915 | 2 | $bottomLinkList['print'] = array($app_strings['LNK_PRINT'] => getPrintLink()); |
|
916 | } |
||
917 | 2 | $bottomLinkList['backtotop'] = array($app_strings['LNK_BACKTOTOP'] => 'javascript:SUGAR.util.top();'); |
|
918 | |||
919 | 2 | $bottomLinksStr = ""; |
|
920 | 2 | foreach($bottomLinkList as $key => $value) { |
|
921 | 2 | foreach($value as $text => $link) { |
|
922 | 2 | $href = $link; |
|
923 | 2 | if(substr($link, 0, 11) == "javascript:") { |
|
924 | 2 | $onclick = " onclick=\"".substr($link,11)."\""; |
|
925 | 2 | $href = "javascript:void(0)"; |
|
926 | } else { |
||
927 | $onclick = ""; |
||
928 | } |
||
929 | 2 | $imageURL = SugarThemeRegistry::current()->getImageURL($key.'.gif'); |
|
930 | 2 | $bottomLinksStr .= "<a href=\"{$href}\""; |
|
931 | 2 | $bottomLinksStr .= (isset($onclick)) ? $onclick : ""; |
|
932 | 2 | $bottomLinksStr .= "><img src='{$imageURL}' alt=''>"; //keeping alt blank on purpose for 508 (text will be read instead) |
|
933 | 2 | $bottomLinksStr .= " ".$text."</a>"; |
|
934 | } |
||
935 | } |
||
936 | 2 | $ss->assign("BOTTOMLINKS",$bottomLinksStr); |
|
937 | 2 | if (SugarConfig::getInstance()->get('calculate_response_time', false)) |
|
938 | 2 | $ss->assign('STATISTICS',$this->_getStatistics()); |
|
939 | |||
940 | // Under the License referenced above, you are required to leave in all copyright statements in both |
||
941 | // the code and end-user application. |
||
942 | |||
943 | |||
944 | 2 | $copyright = '© 2004-2013 SugarCRM Inc. The Program is provided AS IS, without warranty. Licensed under <a href="LICENSE.txt" target="_blank" class="copyRightLink">AGPLv3</a>.<br>This program is free software; you can redistribute it and/or modify it under the terms of the <br><a href="LICENSE.txt" target="_blank" class="copyRightLink"> GNU Affero General Public License version 3</a> as published by the Free Software Foundation, including the additional permission set forth in the source code header.<br>'; |
|
945 | |||
946 | |||
947 | |||
948 | |||
949 | |||
950 | |||
951 | |||
952 | |||
953 | |||
954 | |||
955 | // The interactive user interfaces in modified source and object code |
||
956 | // versions of this program must display Appropriate Legal Notices, as |
||
957 | // required under Section 5 of the GNU General Public License version |
||
958 | // 3. In accordance with Section 7(b) of the GNU General Public License |
||
959 | // version 3, these Appropriate Legal Notices must retain the display |
||
960 | // of the "Powered by SugarCRM" logo. If the display of the logo is |
||
961 | // not reasonably feasible for technical reasons, the Appropriate |
||
962 | // Legal Notices must display the words "Powered by SugarCRM". |
||
963 | 2 | $attribLinkImg = "<img style='margin-top: 2px' border='0' width='120' height='34' src='include/images/poweredby_sugarcrm_65.png' alt='Powered By SugarCRM'>\n"; |
|
964 | |||
965 | |||
966 | // handle resizing of the company logo correctly on the fly |
||
967 | 2 | $companyLogoURL = $themeObject->getImageURL('company_logo.png'); |
|
968 | 2 | $companyLogoURL_arr = explode('?', $companyLogoURL); |
|
969 | 2 | $companyLogoURL = $companyLogoURL_arr[0]; |
|
970 | |||
971 | 2 | $company_logo_attributes = sugar_cache_retrieve('company_logo_attributes'); |
|
972 | 2 | if(!empty($company_logo_attributes)) { |
|
973 | 2 | $ss->assign("COMPANY_LOGO_MD5", $company_logo_attributes[0]); |
|
974 | 2 | $ss->assign("COMPANY_LOGO_WIDTH", $company_logo_attributes[1]); |
|
975 | 2 | $ss->assign("COMPANY_LOGO_HEIGHT", $company_logo_attributes[2]); |
|
976 | } |
||
977 | else { |
||
978 | // Always need to md5 the file |
||
979 | $ss->assign("COMPANY_LOGO_MD5", md5_file($companyLogoURL)); |
||
980 | |||
981 | list($width,$height) = getimagesize($companyLogoURL); |
||
982 | if ( $width > 212 || $height > 40 ) { |
||
983 | $resizePctWidth = ($width - 212)/212; |
||
984 | $resizePctHeight = ($height - 40)/40; |
||
985 | if ( $resizePctWidth > $resizePctHeight ) |
||
986 | $resizeAmount = $width / 212; |
||
987 | else |
||
988 | $resizeAmount = $height / 40; |
||
989 | $ss->assign("COMPANY_LOGO_WIDTH", round($width * (1/$resizeAmount))); |
||
990 | $ss->assign("COMPANY_LOGO_HEIGHT", round($height * (1/$resizeAmount))); |
||
991 | } |
||
992 | else { |
||
993 | $ss->assign("COMPANY_LOGO_WIDTH", $width); |
||
994 | $ss->assign("COMPANY_LOGO_HEIGHT", $height); |
||
995 | } |
||
996 | |||
997 | // Let's cache the results |
||
998 | sugar_cache_put('company_logo_attributes', |
||
999 | array( |
||
1000 | $ss->get_template_vars("COMPANY_LOGO_MD5"), |
||
1001 | $ss->get_template_vars("COMPANY_LOGO_WIDTH"), |
||
1002 | $ss->get_template_vars("COMPANY_LOGO_HEIGHT") |
||
1003 | ) |
||
1004 | ); |
||
1005 | } |
||
1006 | 2 | $ss->assign("COMPANY_LOGO_URL",getJSPath($companyLogoURL)."&logo_md5=".$ss->get_template_vars("COMPANY_LOGO_MD5")); |
|
1007 | |||
1008 | // Bug 38594 - Add in Trademark wording |
||
1009 | 2 | $copyright .= 'SugarCRM is a trademark of SugarCRM, Inc. All other company and product names may be trademarks of the respective companies with which they are associated.<br />'; |
|
1010 | |||
1011 | //rrs bug: 20923 - if this image does not exist as per the license, then the proper image will be displayed regardless, so no need |
||
1012 | //to display an empty image here. |
||
1013 | 2 | if(file_exists('include/images/poweredby_sugarcrm_65.png')){ |
|
1014 | 2 | $copyright .= $attribLinkImg; |
|
1015 | } |
||
1016 | // End Required Image |
||
1017 | 2 | $ss->assign('COPYRIGHT',$copyright); |
|
1018 | |||
1019 | // here we allocate the help link data |
||
1020 | 2 | $help_actions_blacklist = array('Login'); // we don't want to show a context help link here |
|
1021 | 2 | if (!in_array($this->action,$help_actions_blacklist)) { |
|
1022 | 2 | $url = 'javascript:void(window.open(\'index.php?module=Administration&action=SupportPortal&view=documentation&version='.$GLOBALS['sugar_version'].'&edition='.$GLOBALS['sugar_flavor'].'&lang='.$GLOBALS['current_language']. |
|
1023 | 2 | '&help_module='.$this->module.'&help_action='.$this->action.'&key='.$GLOBALS['server_unique_key'].'\'))'; |
|
1024 | 2 | $label = (isset($GLOBALS['app_list_strings']['moduleList'][$this->module]) ? |
|
1025 | 2 | $GLOBALS['app_list_strings']['moduleList'][$this->module] : $this->module). ' '.$app_strings['LNK_HELP']; |
|
1026 | 2 | $ss->assign('HELP_LINK',SugarThemeRegistry::current()->getLink($url, $label, "id='help_link_two'", |
|
1027 | 2 | 'help-dashlet.png', 'class="icon"',null,null,'','left')); |
|
1028 | } |
||
1029 | // end |
||
1030 | |||
1031 | |||
1032 | 2 | $ss->display(SugarThemeRegistry::current()->getTemplate('footer.tpl')); |
|
1033 | 2 | } |
|
1034 | |||
1035 | /** |
||
1036 | * Called from process(). This method will display subpanels. |
||
1037 | */ |
||
1038 | protected function _displaySubPanels() |
||
1039 | { |
||
1040 | if (isset($this->bean) && !empty($this->bean->id) && (file_exists('modules/' . $this->module . '/metadata/subpaneldefs.php') || file_exists('custom/modules/' . $this->module . '/metadata/subpaneldefs.php') || file_exists('custom/modules/' . $this->module . '/Ext/Layoutdefs/layoutdefs.ext.php'))) { |
||
1041 | $GLOBALS['focus'] = $this->bean; |
||
1042 | require_once ('include/SubPanel/SubPanelTiles.php'); |
||
1043 | $subpanel = new SubPanelTiles($this->bean, $this->module); |
||
1044 | echo $subpanel->display(); |
||
1045 | } |
||
1046 | } |
||
1047 | |||
1048 | 1 | protected function _buildModuleList() |
|
1049 | { |
||
1050 | 1 | if (!empty($GLOBALS['current_user']) && empty($GLOBALS['modListHeader'])) |
|
1051 | 1 | $GLOBALS['modListHeader'] = query_module_access_list($GLOBALS['current_user']); |
|
1052 | 1 | } |
|
1053 | |||
1054 | /** |
||
1055 | * private method used in process() to determine the value of a passed in option |
||
1056 | * |
||
1057 | * @param string option - the option that we want to know the valye of |
||
1058 | * @param bool default - what the default value should be if we do not find the option |
||
1059 | * |
||
1060 | * @return bool - the value of the option |
||
1061 | */ |
||
1062 | 3 | protected function _getOption( |
|
1063 | $option, |
||
1064 | $default = false |
||
1065 | ) |
||
1066 | { |
||
1067 | 3 | if (!empty($this->options) && isset($this->options['show_all'])) { |
|
1068 | return $this->options['show_all']; |
||
1069 | 3 | } elseif (!empty($this->options) && isset($this->options[$option])) { |
|
1070 | 3 | return $this->options[$option]; |
|
1071 | 1 | } else return $default; |
|
1072 | } |
||
1073 | |||
1074 | /** |
||
1075 | * track |
||
1076 | * Private function to track information about the view request |
||
1077 | */ |
||
1078 | 1 | private function _track() |
|
1079 | { |
||
1080 | 1 | if (empty($this->responseTime)) { |
|
1081 | $this->_calculateFooterMetrics(); |
||
1082 | } |
||
1083 | 1 | if (empty($GLOBALS['current_user']->id)) { |
|
1084 | 1 | return; |
|
1085 | } |
||
1086 | |||
1087 | |||
1088 | $trackerManager = TrackerManager::getInstance(); |
||
1089 | $trackerManager->save(); |
||
1090 | |||
1091 | } |
||
1092 | |||
1093 | /** |
||
1094 | * Checks to see if the module name passed is valid; dies if it is not |
||
1095 | */ |
||
1096 | 1 | protected function _checkModule() |
|
1097 | { |
||
1098 | 1 | if(!empty($this->module) && !file_exists('modules/'.$this->module)){ |
|
1099 | $error = str_replace("[module]", "$this->module", $GLOBALS['app_strings']['ERR_CANNOT_FIND_MODULE']); |
||
1100 | $GLOBALS['log']->fatal($error); |
||
1101 | echo $error; |
||
1102 | die(); |
||
1103 | } |
||
1104 | 1 | } |
|
1105 | |||
1106 | 3 | public function renderJavascript() |
|
1107 | { |
||
1108 | 3 | if ($this->action !== 'Login') |
|
1109 | 3 | $this->_displayJavascript(); |
|
1110 | else |
||
1111 | $this->_displayLoginJS(); |
||
1112 | 3 | } |
|
1113 | |||
1114 | 2 | private function _calculateFooterMetrics() |
|
1115 | { |
||
1116 | 2 | $endTime = microtime(true); |
|
1117 | 2 | $deltaTime = $endTime - $GLOBALS['startTime']; |
|
1118 | 2 | $this->responseTime = number_format(round($deltaTime, 2), 2); |
|
1119 | // Print out the resources used in constructing the page. |
||
1120 | 2 | $this->fileResources = count(get_included_files()); |
|
1121 | 2 | } |
|
1122 | |||
1123 | 2 | private function _getStatistics() |
|
1124 | { |
||
1125 | 2 | $endTime = microtime(true); |
|
1126 | 2 | $deltaTime = $endTime - $GLOBALS['startTime']; |
|
1127 | 2 | $response_time_string = $GLOBALS['app_strings']['LBL_SERVER_RESPONSE_TIME'] . ' ' . number_format(round($deltaTime, 2), 2) . ' ' . $GLOBALS['app_strings']['LBL_SERVER_RESPONSE_TIME_SECONDS']; |
|
1128 | 2 | $return = $response_time_string; |
|
1129 | // $return .= '<br />'; |
||
1130 | 2 | if (!empty($GLOBALS['sugar_config']['show_page_resources'])) { |
|
1131 | // Print out the resources used in constructing the page. |
||
1132 | $included_files = get_included_files(); |
||
1133 | |||
1134 | // take all of the included files and make a list that does not allow for duplicates based on case |
||
1135 | // I believe the full get_include_files result set appears to have one entry for each file in real |
||
1136 | // case, and one entry in all lower case. |
||
1137 | $list_of_files_case_insensitive = array(); |
||
1138 | foreach($included_files as $key => $name) { |
||
1139 | // preserve the first capitalization encountered. |
||
1140 | $list_of_files_case_insensitive[mb_strtolower($name) ] = $name; |
||
1141 | } |
||
1142 | $return .= $GLOBALS['app_strings']['LBL_SERVER_RESPONSE_RESOURCES'] . '(' . DBManager::getQueryCount() . ',' . sizeof($list_of_files_case_insensitive) . ')<br>'; |
||
1143 | // Display performance of the internal and external caches.... |
||
1144 | $cacheStats = SugarCache::instance()->getCacheStats(); |
||
1145 | $return .= "External cache (hits/total=ratio) local ({$cacheStats['localHits']}/{$cacheStats['requests']}=" . round($cacheStats['localHits']*100/$cacheStats['requests'], 0) . "%)"; |
||
1146 | $return .= " external ({$cacheStats['externalHits']}/{$cacheStats['requests']}=" . round($cacheStats['externalHits']*100/$cacheStats['requests'], 0) . "%)<br />"; |
||
1147 | $return .= " misses ({$cacheStats['misses']}/{$cacheStats['requests']}=" . round($cacheStats['misses']*100/$cacheStats['requests'], 0) . "%)<br />"; |
||
1148 | } |
||
1149 | |||
1150 | 2 | $return .= $this->logMemoryStatistics(); |
|
1151 | |||
1152 | 2 | return $return; |
|
1153 | } |
||
1154 | |||
1155 | /** |
||
1156 | * logMemoryStatistics |
||
1157 | * |
||
1158 | * This function returns a string message containing the memory statistics as well as writes to the memory_usage.log |
||
1159 | * file the memory statistics for the SugarView invocation. |
||
1160 | * |
||
1161 | * @param $newline String of newline character to use (defaults to </ br>) |
||
1162 | * @return $message String formatted message about memory statistics |
||
0 ignored issues
–
show
The doc-type
$message could not be parsed: Unknown type name "$message" at position 0. (view supported doc-types)
This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types. ![]() |
|||
1163 | */ |
||
1164 | 2 | protected function logMemoryStatistics($newline='<br>') |
|
1165 | { |
||
1166 | 2 | $log_message = ''; |
|
1167 | |||
1168 | 2 | if(!empty($GLOBALS['sugar_config']['log_memory_usage'])) |
|
1169 | { |
||
1170 | if(function_exists('memory_get_usage')) |
||
1171 | { |
||
1172 | $memory_usage = memory_get_usage(); |
||
1173 | $bytes = $GLOBALS['app_strings']['LBL_SERVER_MEMORY_BYTES']; |
||
1174 | $data = array($memory_usage, $bytes); |
||
1175 | $log_message = string_format($GLOBALS['app_strings']['LBL_SERVER_MEMORY_USAGE'], $data) . $newline; |
||
1176 | } |
||
1177 | |||
1178 | if(function_exists('memory_get_peak_usage')) |
||
1179 | { |
||
1180 | $memory_peak_usage = memory_get_peak_usage(); |
||
1181 | $bytes = $GLOBALS['app_strings']['LBL_SERVER_MEMORY_BYTES']; |
||
1182 | $data = array($memory_peak_usage, $bytes); |
||
1183 | $log_message .= string_format($GLOBALS['app_strings']['LBL_SERVER_PEAK_MEMORY_USAGE'], $data) . $newline; |
||
1184 | } |
||
1185 | |||
1186 | if(!empty($log_message)) |
||
1187 | { |
||
1188 | $data = array |
||
1189 | ( |
||
1190 | !empty($this->module) ? $this->module : $GLOBALS['app_strings']['LBL_LINK_NONE'], |
||
1191 | !empty($this->action) ? $this->action : $GLOBALS['app_strings']['LBL_LINK_NONE'], |
||
1192 | ); |
||
1193 | |||
1194 | $output = string_format($GLOBALS['app_strings']['LBL_SERVER_MEMORY_LOG_MESSAGE'], $data) . $newline; |
||
1195 | $output .= $log_message; |
||
1196 | $fp = fopen("memory_usage.log", "ab"); |
||
1197 | fwrite($fp, $output); |
||
1198 | fclose($fp); |
||
1199 | } |
||
1200 | } |
||
1201 | |||
1202 | 2 | return $log_message; |
|
1203 | } |
||
1204 | |||
1205 | |||
1206 | /** |
||
1207 | * Loads the module shortcuts menu |
||
1208 | * |
||
1209 | * @param $module string optional, can specify module to retrieve menu for if not the current one |
||
1210 | * @return array module menu |
||
1211 | */ |
||
1212 | 3 | public function getMenu( |
|
1213 | $module = null |
||
1214 | ) |
||
1215 | { |
||
1216 | 3 | global $current_language, $current_user, $mod_strings, $app_strings, $module_menu; |
|
1217 | |||
1218 | 3 | if ( empty($module) ) |
|
1219 | 2 | $module = $this->module; |
|
1220 | |||
1221 | //Need to make sure the mod_strings match the requested module or Menus may fail |
||
1222 | 3 | $curr_mod_strings = $mod_strings; |
|
1223 | 3 | $mod_strings = return_module_language ( $current_language, $module ) ; |
|
1224 | |||
1225 | 3 | $module_menu = array(); |
|
1226 | |||
1227 | 3 | if (file_exists('modules/' . $module . '/Menu.php')) { |
|
1228 | 3 | require('modules/' . $module . '/Menu.php'); |
|
1229 | } |
||
1230 | 3 | if (file_exists('custom/modules/' . $module . '/Ext/Menus/menu.ext.php')) { |
|
1231 | require('custom/modules/' . $module . '/Ext/Menus/menu.ext.php'); |
||
1232 | } |
||
1233 | 3 | if (!file_exists('modules/' . $module . '/Menu.php') |
|
1234 | 3 | && !file_exists('custom/modules/' . $module . '/Ext/Menus/menu.ext.php') |
|
1235 | 3 | && !empty($GLOBALS['mod_strings']['LNK_NEW_RECORD'])) { |
|
1236 | $module_menu[] = array("index.php?module=$module&action=EditView&return_module=$module&return_action=DetailView", |
||
1237 | $GLOBALS['mod_strings']['LNK_NEW_RECORD'],"{$GLOBALS['app_strings']['LBL_CREATE_BUTTON_LABEL']}$module" ,$module ); |
||
1238 | $module_menu[] = array("index.php?module=$module&action=index", $GLOBALS['mod_strings']['LNK_LIST'], |
||
1239 | $module, $module); |
||
1240 | if ( ($this->bean instanceOf SugarBean) && !empty($this->bean->importable) ) |
||
1241 | if ( !empty($mod_strings['LNK_IMPORT_'.strtoupper($module)]) ) |
||
1242 | $module_menu[] = array("index.php?module=Import&action=Step1&import_module=$module&return_module=$module&return_action=index", |
||
1243 | $mod_strings['LNK_IMPORT_'.strtoupper($module)], "Import", $module); |
||
1244 | else |
||
1245 | $module_menu[] = array("index.php?module=Import&action=Step1&import_module=$module&return_module=$module&return_action=index", |
||
1246 | $app_strings['LBL_IMPORT'], "Import", $module); |
||
1247 | } |
||
1248 | 3 | if (file_exists('custom/application/Ext/Menus/menu.ext.php')) { |
|
1249 | require('custom/application/Ext/Menus/menu.ext.php'); |
||
1250 | } |
||
1251 | |||
1252 | 3 | $mod_strings = $curr_mod_strings; |
|
1253 | 3 | $builtModuleMenu = $module_menu; |
|
1254 | 3 | unset($module_menu); |
|
1255 | |||
1256 | 3 | return $builtModuleMenu; |
|
1257 | } |
||
1258 | |||
1259 | /** |
||
1260 | * Returns the module name which should be highlighted in the module menu |
||
1261 | */ |
||
1262 | protected function _getModuleTab() |
||
1263 | { |
||
1264 | global $app_list_strings, $moduleTabMap, $current_user; |
||
1265 | |||
1266 | $userTabs = query_module_access_list($current_user); |
||
1267 | //If the home tab is in the user array use it as the default tab, otherwise use the first element in the tab array |
||
1268 | $defaultTab = (in_array("Home",$userTabs)) ? "Home" : key($userTabs); |
||
1269 | |||
1270 | // Need to figure out what tab this module belongs to, most modules have their own tabs, but there are exceptions. |
||
1271 | if ( !empty($_REQUEST['module_tab']) ) |
||
1272 | return $_REQUEST['module_tab']; |
||
1273 | elseif ( isset($moduleTabMap[$this->module]) ) |
||
1274 | return $moduleTabMap[$this->module]; |
||
1275 | // Special cases |
||
1276 | elseif ( $this->module == 'MergeRecords' ) |
||
1277 | return !empty($_REQUEST['merge_module']) ? $_REQUEST['merge_module'] : $_REQUEST['return_module']; |
||
1278 | elseif ( $this->module == 'Users' && $this->action == 'SetTimezone' ) |
||
1279 | return $defaultTab; |
||
1280 | // Default anonymous pages to be under Home |
||
1281 | elseif ( !isset($app_list_strings['moduleList'][$this->module]) ) |
||
1282 | return $defaultTab; |
||
1283 | elseif ( isset($_REQUEST['action']) && $_REQUEST['action'] == "ajaxui" ) |
||
1284 | return $defaultTab; |
||
1285 | else |
||
1286 | return $this->module; |
||
1287 | } |
||
1288 | |||
1289 | /** |
||
1290 | * Return the "breadcrumbs" to display at the top of the page |
||
1291 | * |
||
1292 | * @param bool $show_help optional, true if we show the help links |
||
1293 | * @return HTML string containing breadcrumb title |
||
1294 | */ |
||
1295 | 5 | public function getModuleTitle( |
|
1296 | $show_help = true |
||
1297 | ) |
||
1298 | { |
||
1299 | 5 | global $sugar_version, $sugar_flavor, $server_unique_key, $current_language, $action; |
|
1300 | |||
1301 | 5 | $theTitle = "<div class='moduleTitle'>\n"; |
|
1302 | |||
1303 | 5 | $module = preg_replace("/ /","",$this->module); |
|
1304 | |||
1305 | 5 | $params = $this->_getModuleTitleParams(); |
|
1306 | 5 | $index = 0; |
|
1307 | |||
1308 | 5 | if(SugarThemeRegistry::current()->directionality == "rtl") { |
|
1309 | $params = array_reverse($params); |
||
1310 | } |
||
1311 | 5 | if(count($params) > 1) { |
|
1312 | array_shift($params); |
||
1313 | } |
||
1314 | 5 | $count = count($params); |
|
1315 | 5 | $paramString = ''; |
|
1316 | 5 | foreach($params as $parm){ |
|
1317 | 5 | $index++; |
|
1318 | 5 | $paramString .= $parm; |
|
1319 | 5 | if($index < $count){ |
|
1320 | 5 | $paramString .= $this->getBreadCrumbSymbol(); |
|
1321 | } |
||
1322 | } |
||
1323 | |||
1324 | 5 | if(!empty($paramString)){ |
|
1325 | $theTitle .= "<h2> $paramString </h2>"; |
||
1326 | |||
1327 | if($this->type == "detail"){ |
||
1328 | $theTitle .= "<div class='favorite' record_id='" . $this->bean->id . "' module='" . $this->bean->module_dir . "'><div class='favorite_icon_outline'>" . SugarThemeRegistry::current()->getImage('favorite-star-outline','title="' . translate('LBL_DASHLET_EDIT', 'Home') . '" border="0" align="absmiddle"', null,null,'.gif',translate('LBL_DASHLET_EDIT', 'Home')) . "</div> |
||
1329 | <div class='favorite_icon_fill'>" . SugarThemeRegistry::current()->getImage('favorite-star','title="' . translate('LBL_DASHLET_EDIT', 'Home') . '" border="0" align="absmiddle"', null,null,'.gif',translate('LBL_DASHLET_EDIT', 'Home')) . "</div></div>"; |
||
1330 | } |
||
1331 | } |
||
1332 | |||
1333 | // bug 56131 - restore conditional so that link doesn't appear where it shouldn't |
||
1334 | 5 | if($show_help || $this->type == 'list') { |
|
1335 | 5 | $theTitle .= "<span class='utils'>"; |
|
1336 | 5 | $createImageURL = SugarThemeRegistry::current()->getImageURL('create-record.gif'); |
|
1337 | 5 | if($this->type == 'list') $theTitle .= '<a href="#" class="btn btn-success showsearch"><span class=" glyphicon glyphicon-search" aria-hidden="true"></span></a>';$url = ajaxLink("index.php?module=$module&action=EditView&return_module=$module&return_action=DetailView"); |
|
1338 | 5 | if($show_help) { |
|
1339 | $theTitle .= <<<EOHTML |
||
1340 | |
||
1341 | 5 | <a id="create_image" href="{$url}" class="utilsLink"> |
|
1342 | 5 | <img src='{$createImageURL}' alt='{$GLOBALS['app_strings']['LNK_CREATE']}'></a> |
|
1343 | 5 | <a id="create_link" href="{$url}" class="utilsLink"> |
|
1344 | 5 | {$GLOBALS['app_strings']['LNK_CREATE']} |
|
1345 | 5 | </a> |
|
1346 | EOHTML; |
||
1347 | } |
||
1348 | 5 | $theTitle .= "</span>"; |
|
1349 | } |
||
1350 | |||
1351 | 5 | $theTitle .= "<div class='clear'></div></div>\n"; |
|
1352 | 5 | return $theTitle; |
|
1353 | } |
||
1354 | |||
1355 | /** |
||
1356 | * Return the metadata file that will be used by this view. |
||
1357 | * |
||
1358 | * @return string File location of the metadata file. |
||
1359 | */ |
||
1360 | 7 | public function getMetaDataFile() |
|
1361 | { |
||
1362 | 7 | $metadataFile = null; |
|
1363 | 7 | $foundViewDefs = false; |
|
1364 | 7 | $viewDef = strtolower($this->type) . 'viewdefs'; |
|
1365 | 7 | $coreMetaPath = 'modules/'.$this->module.'/metadata/' . $viewDef . '.php'; |
|
1366 | 7 | if(file_exists('custom/' .$coreMetaPath )){ |
|
1367 | $metadataFile = 'custom/' . $coreMetaPath; |
||
1368 | $foundViewDefs = true; |
||
1369 | }else{ |
||
1370 | 7 | if(file_exists('custom/modules/'.$this->module.'/metadata/metafiles.php')){ |
|
1371 | require_once('custom/modules/'.$this->module.'/metadata/metafiles.php'); |
||
1372 | if(!empty($metafiles[$this->module][$viewDef])){ |
||
0 ignored issues
–
show
The variable
$metafiles seems to never exist, and therefore empty should always return true . Did you maybe rename this variable?
This check looks for calls to This is most likely caused by the renaming of a variable or the removal of a function/method parameter. ![]() |
|||
1373 | $metadataFile = $metafiles[$this->module][$viewDef]; |
||
1374 | $foundViewDefs = true; |
||
1375 | } |
||
1376 | 7 | }elseif(file_exists('modules/'.$this->module.'/metadata/metafiles.php')){ |
|
1377 | require_once('modules/'.$this->module.'/metadata/metafiles.php'); |
||
1378 | if(!empty($metafiles[$this->module][$viewDef])){ |
||
1379 | $metadataFile = $metafiles[$this->module][$viewDef]; |
||
1380 | $foundViewDefs = true; |
||
1381 | } |
||
1382 | } |
||
1383 | } |
||
1384 | |||
1385 | 7 | if(!$foundViewDefs && file_exists($coreMetaPath)){ |
|
1386 | 7 | $metadataFile = $coreMetaPath; |
|
1387 | } |
||
1388 | 7 | $GLOBALS['log']->debug("metadatafile=". $metadataFile); |
|
1389 | |||
1390 | 7 | return $metadataFile; |
|
1391 | } |
||
1392 | |||
1393 | |||
1394 | /** |
||
1395 | * Returns an array composing of the breadcrumbs to use for the module title |
||
1396 | * |
||
1397 | * @param bool $browserTitle true if the returned string is being used for the browser title, meaning |
||
1398 | * there should be no HTML in the string |
||
1399 | * @return array |
||
1400 | */ |
||
1401 | 8 | protected function _getModuleTitleParams($browserTitle = false) |
|
1402 | { |
||
1403 | 8 | $params = array($this->_getModuleTitleListParam($browserTitle)); |
|
1404 | //$params = array(); |
||
1405 | 8 | if (isset($this->action)){ |
|
1406 | 8 | switch ($this->action) { |
|
1407 | 8 | case 'EditView': |
|
1408 | if(!empty($this->bean->id) && (empty($_REQUEST['isDuplicate']) || $_REQUEST['isDuplicate'] === 'false')) { |
||
1409 | $params[] = "<a href='index.php?module={$this->module}&action=DetailView&record={$this->bean->id}'>".$this->bean->get_summary_text()."</a>"; |
||
1410 | $params[] = $GLOBALS['app_strings']['LBL_EDIT_BUTTON_LABEL']; |
||
1411 | } |
||
1412 | else |
||
1413 | $params[] = $GLOBALS['app_strings']['LBL_CREATE_BUTTON_LABEL']; |
||
1414 | break; |
||
1415 | 8 | case 'DetailView': |
|
1416 | $beanName = $this->bean->get_summary_text(); |
||
1417 | $params[] = $beanName; |
||
1418 | break; |
||
1419 | } |
||
1420 | } |
||
1421 | |||
1422 | 8 | return $params; |
|
1423 | } |
||
1424 | |||
1425 | /** |
||
1426 | * Returns the portion of the array that will represent the listview in the breadcrumb |
||
1427 | * |
||
1428 | * @param bool $browserTitle true if the returned string is being used for the browser title, meaning |
||
1429 | * there should be no HTML in the string |
||
1430 | * @return string |
||
1431 | */ |
||
1432 | 8 | protected function _getModuleTitleListParam( $browserTitle = false ) |
|
1433 | { |
||
1434 | 8 | global $current_user; |
|
1435 | 8 | global $app_strings; |
|
1436 | |||
1437 | 8 | if(!empty($GLOBALS['app_list_strings']['moduleList'][$this->module])) |
|
1438 | 3 | $firstParam = $GLOBALS['app_list_strings']['moduleList'][$this->module]; |
|
1439 | else |
||
1440 | 6 | $firstParam = $this->module; |
|
1441 | |||
1442 | 8 | $iconPath = $this->getModuleTitleIconPath($this->module); |
|
1443 | 8 | if($this->action == "ListView" || $this->action == "index") { |
|
1444 | if (!empty($iconPath) && !$browserTitle) { |
||
1445 | if (SugarThemeRegistry::current()->directionality == "ltr") { |
||
1446 | return $app_strings['LBL_SEARCH']." " |
||
1447 | . "$firstParam"; |
||
1448 | |||
1449 | } else { |
||
1450 | return "$firstParam" |
||
1451 | . " ".$app_strings['LBL_SEARCH']; |
||
1452 | } |
||
1453 | } else { |
||
1454 | return $firstParam; |
||
1455 | } |
||
1456 | } |
||
1457 | else { |
||
1458 | 8 | if (!empty($iconPath) && !$browserTitle) { |
|
0 ignored issues
–
show
This
if statement is empty and can be removed.
This check looks for the bodies of These if (rand(1, 6) > 3) {
//print "Check failed";
} else {
print "Check succeeded";
}
could be turned into if (rand(1, 6) <= 3) {
print "Check succeeded";
}
This is much more concise to read. ![]() |
|||
1459 | //return "<a href='index.php?module={$this->module}&action=index'>$this->module</a>"; |
||
1460 | } else { |
||
1461 | 8 | return $firstParam; |
|
1462 | } |
||
1463 | } |
||
1464 | 1 | } |
|
1465 | |||
1466 | 8 | protected function getModuleTitleIconPath($module) |
|
1467 | { |
||
1468 | 8 | $iconPath = ""; |
|
1469 | 8 | if(is_file(SugarThemeRegistry::current()->getImageURL('icon_'.$module.'_32.png',false))) { |
|
1470 | 3 | $iconPath = SugarThemeRegistry::current()->getImageURL('icon_'.$module.'_32.png'); |
|
1471 | } |
||
1472 | 6 | else if (is_file(SugarThemeRegistry::current()->getImageURL('icon_'.ucfirst($module).'_32.png',false))) { |
|
1473 | $iconPath = SugarThemeRegistry::current()->getImageURL('icon_'.ucfirst($module).'_32.png'); |
||
1474 | } |
||
1475 | 8 | return $iconPath; |
|
1476 | } |
||
1477 | |||
1478 | /** |
||
1479 | * Returns the string which will be shown in the browser's title; defaults to using the same breadcrumb |
||
1480 | * as in the module title |
||
1481 | * |
||
1482 | * @return string |
||
1483 | */ |
||
1484 | 3 | public function getBrowserTitle() |
|
1485 | { |
||
1486 | 3 | global $app_strings; |
|
1487 | |||
1488 | 3 | $browserTitle = $app_strings['LBL_BROWSER_TITLE']; |
|
1489 | 3 | if ( $this->module == 'Users' && ($this->action == 'SetTimezone' || $this->action == 'Login') ) |
|
1490 | return $browserTitle; |
||
1491 | 3 | $params = $this->_getModuleTitleParams(true); |
|
1492 | 3 | foreach ($params as $value ) |
|
1493 | 3 | $browserTitle = strip_tags($value) . ' » ' . $browserTitle; |
|
1494 | |||
1495 | 3 | return $browserTitle; |
|
1496 | } |
||
1497 | |||
1498 | /** |
||
1499 | * Returns the correct breadcrumb symbol according to theme's directionality setting |
||
1500 | * |
||
1501 | * @return string |
||
1502 | */ |
||
1503 | 2 | public function getBreadCrumbSymbol() |
|
1504 | { |
||
1505 | 2 | if(SugarThemeRegistry::current()->directionality == "ltr") { |
|
1506 | 2 | return "<span class='pointer'>»</span>"; |
|
1507 | } |
||
1508 | else { |
||
1509 | return "<span class='pointer'>«</span>"; |
||
1510 | } |
||
1511 | } |
||
1512 | |||
1513 | /** |
||
1514 | * Fetch config values to be put into an array for JavaScript |
||
1515 | * |
||
1516 | * @return array |
||
1517 | */ |
||
1518 | 3 | protected function getSugarConfigJS(){ |
|
1519 | 3 | global $sugar_config; |
|
1520 | |||
1521 | // Set all the config parameters in the JS config as necessary |
||
1522 | 3 | $config_js = array(); |
|
1523 | // AjaxUI stock banned modules |
||
1524 | 3 | $config_js[] = "SUGAR.config.stockAjaxBannedModules = ".json_encode(ajaxBannedModules()).";"; |
|
1525 | 3 | if ( isset($sugar_config['quicksearch_querydelay']) ) { |
|
1526 | $config_js[] = $this->prepareConfigVarForJs('quicksearch_querydelay', $sugar_config['quicksearch_querydelay']); |
||
1527 | } |
||
1528 | 3 | if ( empty($sugar_config['disableAjaxUI']) ) { |
|
1529 | 3 | $config_js[] = "SUGAR.config.disableAjaxUI = false;"; |
|
1530 | } |
||
1531 | else{ |
||
1532 | $config_js[] = "SUGAR.config.disableAjaxUI = true;"; |
||
1533 | } |
||
1534 | 3 | if ( !empty($sugar_config['addAjaxBannedModules']) ){ |
|
1535 | 3 | $config_js[] = $this->prepareConfigVarForJs('addAjaxBannedModules', $sugar_config['addAjaxBannedModules']); |
|
1536 | } |
||
1537 | 3 | if ( !empty($sugar_config['overrideAjaxBannedModules']) ){ |
|
1538 | $config_js[] = $this->prepareConfigVarForJs('overrideAjaxBannedModules', $sugar_config['overrideAjaxBannedModules']); |
||
1539 | } |
||
1540 | 3 | if (!empty($sugar_config['js_available']) && is_array ($sugar_config['js_available'])) |
|
1541 | { |
||
1542 | foreach ($sugar_config['js_available'] as $configKey) |
||
1543 | { |
||
1544 | if (isset($sugar_config[$configKey])) |
||
1545 | { |
||
1546 | $jsVariableStatement = $this->prepareConfigVarForJs($configKey, $sugar_config[$configKey]); |
||
1547 | if (!array_search($jsVariableStatement, $config_js)) |
||
1548 | { |
||
1549 | $config_js[] = $jsVariableStatement; |
||
1550 | } |
||
1551 | } |
||
1552 | } |
||
1553 | } |
||
1554 | |||
1555 | 3 | return $config_js; |
|
1556 | } |
||
1557 | |||
1558 | /** |
||
1559 | * Utility method to convert sugar_config values into a JS acceptable format. |
||
1560 | * |
||
1561 | * @param string $key Config Variable Name |
||
1562 | * @param string $value Config Variable Value |
||
1563 | * @return string |
||
1564 | */ |
||
1565 | 3 | protected function prepareConfigVarForJs($key, $value) |
|
1566 | { |
||
1567 | 3 | $value = json_encode($value); |
|
1568 | 3 | return "SUGAR.config.{$key} = {$value};"; |
|
1569 | } |
||
1570 | |||
1571 | /** |
||
1572 | * getHelpText |
||
1573 | * |
||
1574 | * This is a protected function that returns the help text portion. It is called from getModuleTitle. |
||
1575 | * |
||
1576 | * @param $module String the formatted module name |
||
1577 | * @return $theTitle String the HTML for the help text |
||
0 ignored issues
–
show
The doc-type
$theTitle could not be parsed: Unknown type name "$theTitle" at position 0. (view supported doc-types)
This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types. ![]() |
|||
1578 | */ |
||
1579 | protected function getHelpText($module) |
||
1580 | { |
||
1581 | $createImageURL = SugarThemeRegistry::current()->getImageURL('create-record.gif'); |
||
1582 | $url = ajaxLink("index.php?module=$module&action=EditView&return_module=$module&return_action=DetailView"); |
||
1583 | $theTitle = <<<EOHTML |
||
1584 | |
||
1585 | <img src='{$createImageURL}' alt='{$GLOBALS['app_strings']['LNK_CREATE']}'> |
||
1586 | <a href="{$url}" class="utilsLink"> |
||
1587 | {$GLOBALS['app_strings']['LNK_CREATE']} |
||
1588 | </a> |
||
1589 | EOHTML; |
||
1590 | return $theTitle; |
||
1591 | } |
||
1592 | |||
1593 | /** |
||
1594 | * Retrieves favicon corresponding to currently requested module |
||
1595 | * |
||
1596 | * @return array |
||
1597 | */ |
||
1598 | 2 | protected function getFavicon() |
|
1599 | { |
||
1600 | // get favicon |
||
1601 | 2 | if(isset($GLOBALS['sugar_config']['default_module_favicon'])) |
|
1602 | $module_favicon = $GLOBALS['sugar_config']['default_module_favicon']; |
||
1603 | else |
||
1604 | 2 | $module_favicon = false; |
|
1605 | |||
1606 | 2 | $themeObject = SugarThemeRegistry::current(); |
|
1607 | |||
1608 | 2 | $favicon = ''; |
|
1609 | 2 | if ( $module_favicon ) |
|
1610 | $favicon = $themeObject->getImageURL($this->module.'.gif',false); |
||
1611 | 2 | if ( !sugar_is_file($favicon) || !$module_favicon ) |
|
1612 | 2 | $favicon = $themeObject->getImageURL('sugar_icon.ico',false); |
|
1613 | |||
1614 | 2 | $extension = pathinfo($favicon, PATHINFO_EXTENSION); |
|
1615 | switch ($extension) |
||
1616 | { |
||
1617 | 2 | case 'png': |
|
1618 | $type = 'image/png'; |
||
1619 | break; |
||
1620 | 2 | case 'ico': |
|
1621 | // fall through |
||
1622 | default: |
||
1623 | 2 | $type = 'image/x-icon'; |
|
1624 | 2 | break; |
|
1625 | } |
||
1626 | |||
1627 | return array( |
||
1628 | 2 | 'url' => getJSPath($favicon), |
|
1629 | 2 | 'type' => $type, |
|
1630 | ); |
||
1631 | } |
||
1632 | |||
1633 | |||
1634 | /** |
||
1635 | * getCustomFilePathIfExists |
||
1636 | * |
||
1637 | * This function wraps a call to get_custom_file_if_exists from include/utils.php |
||
1638 | * |
||
1639 | * @param $file String of filename to check |
||
1640 | * @return $file String of filename including custom directory if found |
||
0 ignored issues
–
show
The doc-type
$file could not be parsed: Unknown type name "$file" at position 0. (view supported doc-types)
This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types. ![]() |
|||
1641 | */ |
||
1642 | 2 | protected function getCustomFilePathIfExists($file) |
|
1643 | { |
||
1644 | 2 | return get_custom_file_if_exists($file); |
|
1645 | } |
||
1646 | |||
1647 | |||
1648 | /** |
||
1649 | * fetchTemplate |
||
1650 | * |
||
1651 | * This function wraps the call to the fetch function of the Smarty variable for the view |
||
1652 | * |
||
1653 | * @param $file String path of the file to fetch |
||
1654 | * @return $content String content from resulting Smarty fetch operation on template |
||
0 ignored issues
–
show
The doc-type
$content could not be parsed: Unknown type name "$content" at position 0. (view supported doc-types)
This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types. ![]() |
|||
1655 | */ |
||
1656 | protected function fetchTemplate($file) |
||
1657 | { |
||
1658 | return $this->ss->fetch($file); |
||
1659 | } |
||
1660 | |||
1661 | /** |
||
1662 | * handles the tracker output, and adds a link and a shortened name. |
||
1663 | * given html safe input, it will preserve html safety |
||
1664 | * |
||
1665 | * @param array $history - returned from the tracker |
||
1666 | * @return array augmented history with image link and shortened name |
||
1667 | */ |
||
1668 | protected function processRecentRecords($history) { |
||
1669 | foreach ( $history as $key => $row ) { |
||
1670 | $history[$key]['item_summary_short'] = to_html(getTrackerSubstring($row['item_summary'])); //bug 56373 - need to re-HTML-encode |
||
1671 | $history[$key]['image'] = SugarThemeRegistry::current() |
||
1672 | ->getImage($row['module_name'],'border="0" align="absmiddle"',null,null,'.gif',$row['item_summary']); |
||
1673 | } |
||
1674 | return $history; |
||
1675 | } |
||
1676 | |||
1677 | /** |
||
1678 | * Determines whether the state of the post global array indicates there was an error uploading a |
||
1679 | * file that exceeds the post_max_size setting. Such an error can be detected if: |
||
1680 | * 1. The Server['REQUEST_METHOD'] will still point to POST |
||
1681 | * 2. POST and FILES global arrays will be returned empty despite the request method |
||
1682 | * This also results in a redirect to the home page (due to lack of module and action in POST) |
||
1683 | * |
||
1684 | * @return boolean indicating true or false |
||
1685 | */ |
||
1686 | 1 | public function checkPostMaxSizeError(){ |
|
1687 | //if the referrer is post, and the post array is empty, then an error has occurred, most likely |
||
1688 | //while uploading a file that exceeds the post_max_size. |
||
1689 | 1 | if(empty($_FILES) && empty($_POST) && isset($_SERVER['REQUEST_METHOD']) && strtolower($_SERVER['REQUEST_METHOD']) == 'post'){ |
|
1690 | $GLOBALS['log']->fatal($GLOBALS['app_strings']['UPLOAD_ERROR_HOME_TEXT']); |
||
1691 | return true; |
||
1692 | } |
||
1693 | 1 | return false; |
|
1694 | } |
||
1695 | |||
1696 | |||
1697 | } |
||
1698 |
Since your code implements the magic setter
_set
, this function will be called for any write access on an undefined variable. You can add the@property
annotation to your class or interface to document the existence of this variable.Since the property has write access only, you can use the @property-write annotation instead.
Of course, you may also just have mistyped another name, in which case you should fix the error.
See also the PhpDoc documentation for @property.