1<?php 2/* 3** Zabbix 4** Copyright (C) 2001-2021 Zabbix SIA 5** 6** This program is free software; you can redistribute it and/or modify 7** it under the terms of the GNU General Public License as published by 8** the Free Software Foundation; either version 2 of the License, or 9** (at your option) any later version. 10** 11** This program is distributed in the hope that it will be useful, 12** but WITHOUT ANY WARRANTY; without even the implied warranty of 13** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14** GNU General Public License for more details. 15** 16** You should have received a copy of the GNU General Public License 17** along with this program; if not, write to the Free Software 18** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 19**/ 20 21 22require_once dirname(__FILE__).'/events.inc.php'; 23require_once dirname(__FILE__).'/actions.inc.php'; 24require_once dirname(__FILE__).'/js.inc.php'; 25 26function screen_resources($resource = null) { 27 $resources = [ 28 SCREEN_RESOURCE_CLOCK => _('Clock'), 29 SCREEN_RESOURCE_DATA_OVERVIEW => _('Data overview'), 30 SCREEN_RESOURCE_GRAPH => _('Graph'), 31 SCREEN_RESOURCE_ACTIONS => _('Action log'), 32 SCREEN_RESOURCE_EVENTS => _('History of events'), 33 SCREEN_RESOURCE_HOSTS_INFO => _('Hosts info'), 34 SCREEN_RESOURCE_MAP => _('Map'), 35 SCREEN_RESOURCE_PLAIN_TEXT => _('Plain text'), 36 SCREEN_RESOURCE_SCREEN => _('Screen'), 37 SCREEN_RESOURCE_SERVER_INFO => _('Server info'), 38 SCREEN_RESOURCE_SIMPLE_GRAPH => _('Simple graph'), 39 SCREEN_RESOURCE_HOSTGROUP_TRIGGERS => _('Host group issues'), 40 SCREEN_RESOURCE_HOST_TRIGGERS => _('Host issues'), 41 SCREEN_RESOURCE_SYSTEM_STATUS => _('System status'), 42 SCREEN_RESOURCE_TRIGGERS_INFO => _('Triggers info'), 43 SCREEN_RESOURCE_TRIGGERS_OVERVIEW => _('Triggers overview'), 44 SCREEN_RESOURCE_URL => _('URL'), 45 SCREEN_RESOURCE_LLD_GRAPH => _('Graph prototype'), 46 SCREEN_RESOURCE_LLD_SIMPLE_GRAPH => _('Simple graph prototype') 47 ]; 48 49 if (is_null($resource)) { 50 natsort($resources); 51 return $resources; 52 } 53 elseif (isset($resources[$resource])) { 54 return $resources[$resource]; 55 } 56 else { 57 return _('Unknown'); 58 } 59} 60 61function check_screen_recursion($mother_screenid, $child_screenid) { 62 if (bccomp($mother_screenid , $child_screenid) == 0) { 63 return true; 64 } 65 66 $db_scr_items = DBselect( 67 'SELECT si.resourceid'. 68 ' FROM screens_items si'. 69 ' WHERE si.screenid='.zbx_dbstr($child_screenid). 70 ' AND si.resourcetype='.SCREEN_RESOURCE_SCREEN 71 ); 72 while ($scr_item = DBfetch($db_scr_items)) { 73 if (check_screen_recursion($mother_screenid, $scr_item['resourceid'])) { 74 return true; 75 } 76 } 77 78 return false; 79} 80 81/** 82 * Add screen row. 83 * 84 * @param array $screen 85 * @param int $row_num 86 */ 87function addScreenRow(array $screen, $row_num) { 88 foreach ($screen['screenitems'] as &$screen_item) { 89 if ($screen_item['y'] >= $row_num) { 90 $screen_item['y']++; 91 } 92 } 93 unset($screen_item); 94 95 DBstart(); 96 $options = [ 97 'screenid' => $screen['screenid'], 98 'vsize' => $screen['vsize'] + 1, 99 'screenitems' => $screen['screenitems'] 100 ]; 101 102 $result = ($screen['templateid'] != 0) 103 ? API::TemplateScreen()->update($options) 104 : API::Screen()->update($options); 105 106 if ($result) { 107 add_audit_details(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_SCREEN, $screen['screenid'], $screen['name'], 108 _('Row added') 109 ); 110 } 111 DBend($result); 112} 113 114/** 115 * Add screen column. 116 * 117 * @param array $screen 118 * @param int $col_num 119 */ 120function addScreenColumn(array $screen, $col_num) { 121 foreach ($screen['screenitems'] as &$screen_item) { 122 if ($screen_item['x'] >= $col_num) { 123 $screen_item['x']++; 124 } 125 } 126 unset($screen_item); 127 128 DBstart(); 129 $options = [ 130 'screenid' => $screen['screenid'], 131 'hsize' => $screen['hsize'] + 1, 132 'screenitems' => $screen['screenitems'] 133 ]; 134 135 $result = ($screen['templateid'] != 0) 136 ? API::TemplateScreen()->update($options) 137 : API::Screen()->update($options); 138 139 if ($result) { 140 add_audit_details(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_SCREEN, $screen['screenid'], $screen['name'], 141 _('Column added') 142 ); 143 } 144 DBend($result); 145} 146 147/** 148 * Remove screen row. 149 * 150 * @param array $screen 151 * @param int $row_num 152 */ 153function delScreenRow(array $screen, $row_num) { 154 foreach ($screen['screenitems'] as $key => &$screen_item) { 155 if ($screen_item['y'] == $row_num) { 156 unset($screen['screenitems'][$key]); 157 } 158 elseif ($screen_item['y'] > $row_num) { 159 $screen_item['y']--; 160 } 161 } 162 unset($screen_item); 163 164 DBstart(); 165 $options = [ 166 'screenid' => $screen['screenid'], 167 'vsize' => $screen['vsize'] - 1, 168 'screenitems' => $screen['screenitems'] 169 ]; 170 171 $result = ($screen['templateid'] != 0) 172 ? API::TemplateScreen()->update($options) 173 : API::Screen()->update($options); 174 175 if ($result) { 176 add_audit_details(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_SCREEN, $screen['screenid'], $screen['name'], 177 _('Row deleted') 178 ); 179 } 180 DBend($result); 181} 182 183/** 184 * Remove screen column. 185 * 186 * @param array $screen 187 * @param int $col_num 188 */ 189function delScreenColumn(array $screen, $col_num) { 190 foreach ($screen['screenitems'] as $key => &$screen_item) { 191 if ($screen_item['x'] == $col_num) { 192 unset($screen['screenitems'][$key]); 193 } 194 elseif ($screen_item['x'] > $col_num) { 195 $screen_item['x']--; 196 } 197 } 198 unset($screen_item); 199 200 DBstart(); 201 $options = [ 202 'screenid' => $screen['screenid'], 203 'hsize' => $screen['hsize'] - 1, 204 'screenitems' => $screen['screenitems'] 205 ]; 206 207 $result = ($screen['templateid'] != 0) 208 ? API::TemplateScreen()->update($options) 209 : API::Screen()->update($options); 210 211 if ($result) { 212 add_audit_details(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_SCREEN, $screen['screenid'], $screen['name'], 213 _('Column deleted') 214 ); 215 } 216 DBend($result); 217} 218 219function getSlideshowScreens($slideshowId, $step) { 220 $dbSlides = DBfetch(DBselect( 221 'SELECT MIN(s.step) AS min_step,MAX(s.step) AS max_step'. 222 ' FROM slides s'. 223 ' WHERE s.slideshowid='.zbx_dbstr($slideshowId) 224 )); 225 226 if (!$dbSlides || $dbSlides['min_step'] === null) { 227 return false; 228 } 229 230 $step = $step % ($dbSlides['max_step'] + 1); 231 232 $currentStep = (!$step || $step < $dbSlides['min_step'] || $step > $dbSlides['max_step']) 233 ? $dbSlides['min_step'] : $step; 234 235 return DBfetch(DBselect( 236 'SELECT sl.*'. 237 ' FROM slides sl,slideshows ss'. 238 ' WHERE ss.slideshowid='.zbx_dbstr($slideshowId). 239 ' AND sl.slideshowid=ss.slideshowid'. 240 ' AND sl.step='.zbx_dbstr($currentStep) 241 )); 242} 243 244function slideshow_accessible($slideshowid, $perm) { 245 $result = false; 246 247 if (get_slideshow_by_slideshowid($slideshowid, PERM_READ)) { 248 $result = true; 249 250 $screenids = []; 251 $db_screens = DBselect( 252 'SELECT DISTINCT s.screenid'. 253 ' FROM slides s'. 254 ' WHERE s.slideshowid='.zbx_dbstr($slideshowid) 255 ); 256 while ($slide_data = DBfetch($db_screens)) { 257 $screenids[$slide_data['screenid']] = $slide_data['screenid']; 258 } 259 260 $options = [ 261 'output' => ['screenid'], 262 'screenids' => $screenids 263 ]; 264 if ($perm == PERM_READ_WRITE) { 265 $options['editable'] = true; 266 } 267 $screens = API::Screen()->get($options); 268 $screens = zbx_toHash($screens, 'screenid'); 269 270 foreach ($screenids as $screenid) { 271 if (!isset($screens[$screenid])) { 272 return false; 273 } 274 } 275 } 276 277 return $result; 278} 279 280function get_slideshow_by_slideshowid($slideshowid, $permission) { 281 $user_data = CWebUser::$data; 282 283 $condition = ''; 284 if ($user_data['type'] != USER_TYPE_SUPER_ADMIN && $user_data['type'] != USER_TYPE_ZABBIX_ADMIN) { 285 $public_slideshows = ''; 286 287 if ($permission == PERM_READ) { 288 $public_slideshows = ' OR s.private='.PUBLIC_SHARING; 289 } 290 291 $user_groups = getUserGroupsByUserId($user_data['userid']); 292 293 $condition = ' AND (EXISTS ('. 294 'SELECT NULL'. 295 ' FROM slideshow_user su'. 296 ' WHERE s.slideshowid=su.slideshowid'. 297 ' AND su.userid='.$user_data['userid']. 298 ' AND su.permission>='.$permission. 299 ')'. 300 ' OR EXISTS ('. 301 'SELECT NULL'. 302 ' FROM slideshow_usrgrp sg'. 303 ' WHERE s.slideshowid=sg.slideshowid'. 304 ' AND '.dbConditionInt('sg.usrgrpid', $user_groups). 305 ' AND sg.permission>='.$permission. 306 ')'. 307 ' OR s.userid='.$user_data['userid']. 308 $public_slideshows. 309 ')'; 310 } 311 312 return DBfetch(DBselect( 313 'SELECT s.* FROM slideshows s WHERE s.slideshowid='.zbx_dbstr($slideshowid).$condition 314 )); 315} 316 317function add_slideshow($data) { 318 $user_data = CWebUser::$data; 319 320 // Validate slides. 321 if (empty($data['slides'])) { 322 error(_('Slide show must contain slides.')); 323 324 return false; 325 } 326 327 // Validate screens. 328 $screenids = zbx_objectValues($data['slides'], 'screenid'); 329 330 $screens = API::Screen()->get([ 331 'output' => ['screenid'], 332 'screenids' => $screenids, 333 'preservekeys' => true 334 ]); 335 336 foreach ($screenids as $screenid) { 337 if (!array_key_exists($screenid, $screens)) { 338 error(_('Incorrect screen provided for slide show.')); 339 340 return false; 341 } 342 } 343 344 // Validate slide name. 345 $db_slideshow = DBfetch(DBselect( 346 'SELECT s.slideshowid FROM slideshows s WHERE s.name='.zbx_dbstr($data['name']) 347 )); 348 349 if ($db_slideshow) { 350 error(_s('Slide show "%s" already exists.', $data['name'])); 351 352 return false; 353 } 354 355 // Validate slide show owner. 356 if ($data['userid'] === null) { 357 error(_('Slide show owner cannot be empty.')); 358 359 return false; 360 } 361 elseif ($data['userid'] != $user_data['userid'] && $user_data['type'] != USER_TYPE_SUPER_ADMIN 362 && $user_data['type'] != USER_TYPE_ZABBIX_ADMIN) { 363 error(_('Only administrators can set slide show owner.')); 364 365 return false; 366 } 367 368 $slideshowid = get_dbid('slideshows', 'slideshowid'); 369 $result = DBexecute( 370 'INSERT INTO slideshows (slideshowid,name,delay,userid,private)'. 371 ' VALUES ('.zbx_dbstr($slideshowid).','.zbx_dbstr($data['name']).','.zbx_dbstr($data['delay']).','. 372 zbx_dbstr($data['userid']).','.zbx_dbstr($data['private']).')' 373 ); 374 375 376 // User shares. 377 $shared_users = []; 378 379 foreach ($data['users'] as $user) { 380 if ($data['private'] == PUBLIC_SHARING && $user['permission'] == PERM_READ) { 381 error(_s('Slide show "%1$s" is public and read-only sharing is disallowed.', $data['name'])); 382 383 return false; 384 } 385 386 $shared_users[] = [ 387 'slideshowid' => $slideshowid, 388 'userid' => $user['userid'], 389 'permission' => $user['permission'] 390 ]; 391 } 392 393 DB::insert('slideshow_user', $shared_users); 394 395 // User group shares. 396 $shared_user_groups = []; 397 398 foreach ($data['userGroups'] as $user_group) { 399 if ($data['private'] == PUBLIC_SHARING && $user_group['permission'] == PERM_READ) { 400 error(_s('Slide show "%1$s" is public and read-only sharing is disallowed.', $data['name'])); 401 402 return false; 403 } 404 405 $shared_user_groups[] = [ 406 'slideshowid' => $slideshowid, 407 'usrgrpid' => $user_group['usrgrpid'], 408 'permission' => $user_group['permission'] 409 ]; 410 } 411 412 DB::insert('slideshow_usrgrp', $shared_user_groups); 413 414 // create slides 415 $i = 0; 416 foreach ($data['slides'] as $slide) { 417 $slideid = get_dbid('slides', 'slideid'); 418 419 // set default delay 420 if (empty($slide['delay'])) { 421 $slide['delay'] = 0; 422 } 423 424 $result = DBexecute( 425 'INSERT INTO slides (slideid,slideshowid,screenid,step,delay)'. 426 ' VALUES ('.zbx_dbstr($slideid).','.zbx_dbstr($slideshowid).','.zbx_dbstr($slide['screenid']).','.($i++).','.zbx_dbstr($slide['delay']).')' 427 ); 428 429 if (!$result) { 430 return false; 431 } 432 } 433 434 return $slideshowid; 435} 436 437function update_slideshow($data) { 438 $user_data = CWebUser::$data; 439 440 // Validate slides. 441 if (empty($data['slides'])) { 442 error(_('Slide show must contain slides.')); 443 444 return false; 445 } 446 447 // validate screens. 448 $screenids = zbx_objectValues($data['slides'], 'screenid'); 449 450 $screens = API::Screen()->get([ 451 'output' => ['screenid'], 452 'screenids' => $screenids, 453 'preservekeys' => true 454 ]); 455 456 foreach ($screenids as $screenid) { 457 if (!array_key_exists($screenid, $screens)) { 458 error(_('Incorrect screen provided for slide show.')); 459 460 return false; 461 } 462 } 463 464 // Validate slide name. 465 $db_slideshow = DBfetch(DBselect( 466 'SELECT s.slideshowid'. 467 ' FROM slideshows s'. 468 ' WHERE s.name='.zbx_dbstr($data['name']). 469 ' AND s.slideshowid<>'.zbx_dbstr($data['slideshowid']) 470 )); 471 472 if ($db_slideshow) { 473 error(_s('Slide show "%1$s" already exists.', $data['name'])); 474 475 return false; 476 } 477 478 // Validate slide show owner. 479 if (array_key_exists('userid', $data)) { 480 if ($data['userid'] === null || $data['userid'] === '') { 481 error(_('Slide show owner cannot be empty.')); 482 483 return false; 484 } 485 elseif ($data['userid'] != $user_data['userid'] && $user_data['type'] != USER_TYPE_SUPER_ADMIN 486 && $user_data['type'] != USER_TYPE_ZABBIX_ADMIN) { 487 error(_('Only administrators can set slide show owner.')); 488 489 return false; 490 } 491 } 492 493 $to_update = $data; 494 unset($to_update['slideshowid'], $to_update['slides'], $to_update['users'], $to_update['userGroups']); 495 496 DB::update('slideshows', [ 497 'values' => $to_update, 498 'where' => ['slideshowid' => $data['slideshowid']] 499 ]); 500 501 // Read-only sharing validation. 502 foreach ($data['users'] as $user) { 503 if ($data['private'] == PUBLIC_SHARING && $user['permission'] == PERM_READ) { 504 error(_s('Slide show "%1$s" is public and read-only sharing is disallowed.', $data['name'])); 505 506 return false; 507 } 508 } 509 510 foreach ($data['userGroups'] as $user_group) { 511 if ($data['private'] == PUBLIC_SHARING && $user_group['permission'] == PERM_READ) { 512 error(_s('Slide show "%1$s" is public and read-only sharing is disallowed.', $data['name'])); 513 514 return false; 515 } 516 } 517 518 $shared_userids_to_delete = []; 519 $shared_users_to_update = []; 520 $shared_users_to_add = []; 521 $shared_user_groupids_to_delete = []; 522 $shared_user_groups_to_update = []; 523 $shared_user_groups_to_add = []; 524 525 // Slide show user shares. 526 $db_slideshow['users'] = DBfetchArray(DBselect( 527 'SELECT s.userid,s.permission,s.slideshowuserid'. 528 ' FROM slideshow_user s'. 529 ' WHERE s.slideshowid='.zbx_dbstr(getRequest('slideshowid')) 530 )); 531 532 $userids = []; 533 foreach ($db_slideshow['users'] as $user) { 534 $userids[] = $user['userid']; 535 } 536 537 $allowed_users = API::User()->get([ 538 'output' => ['userid'], 539 'userids' => $userids, 540 'preservekeys' => true 541 ]); 542 543 foreach ($db_slideshow['users'] as $key => $user) { 544 if (!array_key_exists($user['userid'], $allowed_users)) { 545 unset($db_slideshow['users'][$key]); 546 } 547 } 548 549 $user_shares_diff = zbx_array_diff($data['users'], $db_slideshow['users'], 'userid'); 550 551 foreach ($user_shares_diff['both'] as $update_user_share) { 552 $shared_users_to_update[] = [ 553 'values' => $update_user_share, 554 'where' => ['userid' => $update_user_share['userid'], 'slideshowid' => $data['slideshowid']] 555 ]; 556 } 557 558 foreach ($user_shares_diff['first'] as $new_shared_user) { 559 $new_shared_user['slideshowid'] = $data['slideshowid']; 560 $shared_users_to_add[] = $new_shared_user; 561 } 562 563 $shared_userids_to_delete = zbx_objectValues($user_shares_diff['second'], 'slideshowuserid'); 564 565 // Slide show user group shares. 566 $db_slideshow['userGroups'] = DBfetchArray(DBselect( 567 'SELECT s.usrgrpid,s.permission,s.slideshowusrgrpid'. 568 ' FROM slideshow_usrgrp s'. 569 ' WHERE s.slideshowid='.zbx_dbstr(getRequest('slideshowid')) 570 )); 571 572 $usrgrpids = []; 573 foreach ($db_slideshow['userGroups'] as $user_group) { 574 $usrgrpids[] = $user_group['usrgrpid']; 575 } 576 577 $allowed_user_groups = API::UserGroup()->get([ 578 'output' => ['usrgrpid'], 579 'usrgrpids' => $usrgrpids, 580 'preservekeys' => true 581 ]); 582 583 foreach ($db_slideshow['userGroups'] as $key => $user_group) { 584 if (!array_key_exists($user_group['usrgrpid'], $allowed_user_groups)) { 585 unset($db_slideshow['userGroups'][$key]); 586 } 587 } 588 589 $user_group_shares_diff = zbx_array_diff($data['userGroups'], $db_slideshow['userGroups'], 'usrgrpid'); 590 591 foreach ($user_group_shares_diff['both'] as $update_user_share) { 592 $shared_user_groups_to_update[] = [ 593 'values' => $update_user_share, 594 'where' => ['usrgrpid' => $update_user_share['usrgrpid'], 'slideshowid' => $data['slideshowid']] 595 ]; 596 } 597 598 foreach ($user_group_shares_diff['first'] as $new_shared_user_group) { 599 $new_shared_user_group['slideshowid'] = $data['slideshowid']; 600 $shared_user_groups_to_add[] = $new_shared_user_group; 601 } 602 603 $shared_user_groupids_to_delete = zbx_objectValues($user_group_shares_diff['second'], 'slideshowusrgrpid'); 604 605 // User shares. 606 DB::insert('slideshow_user', $shared_users_to_add); 607 DB::update('slideshow_user', $shared_users_to_update); 608 609 if ($shared_userids_to_delete) { 610 DB::delete('slideshow_user', ['slideshowuserid' => $shared_userids_to_delete]); 611 } 612 613 // User group shares. 614 DB::insert('slideshow_usrgrp', $shared_user_groups_to_add); 615 DB::update('slideshow_usrgrp', $shared_user_groups_to_update); 616 617 if ($shared_user_groupids_to_delete) { 618 DB::delete('slideshow_usrgrp', ['slideshowusrgrpid' => $shared_user_groupids_to_delete]); 619 } 620 621 // get slides 622 $db_slides = DBfetchArrayAssoc(DBselect('SELECT s.* FROM slides s WHERE s.slideshowid='.zbx_dbstr($data['slideshowid'])), 'slideid'); 623 624 $slidesToDel = zbx_objectValues($db_slides, 'slideid'); 625 $slidesToDel = zbx_toHash($slidesToDel); 626 $step = 0; 627 foreach ($data['slides'] as $slide) { 628 $slide['delay'] = $slide['delay'] ? $slide['delay'] : 0; 629 if (isset($db_slides[$slide['slideid']])) { 630 // update slide 631 if ($db_slides[$slide['slideid']]['delay'] != $slide['delay'] || $db_slides[$slide['slideid']]['step'] != $step) { 632 $result = DBexecute('UPDATE slides SET step='.zbx_dbstr($step).', delay='.zbx_dbstr($slide['delay']).' WHERE slideid='.zbx_dbstr($slide['slideid'])); 633 } 634 // do nothing with slide 635 else { 636 $result = true; 637 } 638 unset($slidesToDel[$slide['slideid']]); 639 } 640 // insert slide 641 else { 642 $slideid = get_dbid('slides', 'slideid'); 643 $result = DBexecute( 644 'INSERT INTO slides (slideid,slideshowid,screenid,step,delay)'. 645 ' VALUES ('.zbx_dbstr($slideid).','.zbx_dbstr($data['slideshowid']).','.zbx_dbstr($slide['screenid']).','.zbx_dbstr($step).','.zbx_dbstr($slide['delay']).')' 646 ); 647 } 648 $step ++; 649 if (!$result) { 650 return false; 651 } 652 } 653 654 // delete unnecessary slides 655 if (!empty($slidesToDel)) { 656 DBexecute('DELETE FROM slides WHERE slideid IN('.implode(',', $slidesToDel).')'); 657 } 658 659 return true; 660} 661 662function delete_slideshow($slideshowid) { 663 $result = false; 664 665 if (get_slideshow_by_slideshowid($slideshowid, PERM_READ_WRITE)) { 666 $result = DBexecute('DELETE FROM slideshows where slideshowid='.zbx_dbstr($slideshowid)); 667 $result &= DBexecute('DELETE FROM slides where slideshowid='.zbx_dbstr($slideshowid)); 668 $result &= DBexecute('DELETE FROM profiles WHERE idx=\'web.favorite.screenids\' AND source=\'slideshowid\' AND value_id='.zbx_dbstr($slideshowid)); 669 } 670 671 return (bool) $result; 672} 673 674// check whether there are dynamic items in the screen, if so return TRUE, else FALSE 675function check_dynamic_items($elid, $config = 0) { 676 if ($config == 0) { 677 $sql = 'SELECT si.screenitemid'. 678 ' FROM screens_items si'. 679 ' WHERE si.screenid='.zbx_dbstr($elid). 680 ' AND si.dynamic='.SCREEN_DYNAMIC_ITEM; 681 } 682 else { 683 $sql = 'SELECT si.screenitemid'. 684 ' FROM slides s,screens_items si'. 685 ' WHERE s.slideshowid='.zbx_dbstr($elid). 686 ' AND si.screenid=s.screenid'. 687 ' AND si.dynamic='.SCREEN_DYNAMIC_ITEM; 688 } 689 if (DBfetch(DBselect($sql, 1))) { 690 return true; 691 } 692 693 return false; 694} 695 696function getResourceNameByType($resourceType) { 697 switch ($resourceType) { 698 case SCREEN_RESOURCE_DATA_OVERVIEW: 699 case SCREEN_RESOURCE_TRIGGERS_OVERVIEW: 700 return _('Group'); 701 } 702 703 return null; 704} 705