<?php declare(strict_types = 0); /* ** Copyright (C) 2001-2025 Zabbix SIA ** ** This program is free software: you can redistribute it and/or modify it under the terms of ** the GNU Affero General Public License as published by the Free Software Foundation, version 3. ** ** This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; ** without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** See the GNU Affero General Public License for more details. ** ** You should have received a copy of the GNU Affero General Public License along with this program. ** If not, see <https://www.gnu.org/licenses/>. **/ namespace Widgets\TopTriggers\Actions; use API, CArrayHelper, CControllerDashboardWidgetView, CControllerResponseData; class WidgetView extends CControllerDashboardWidgetView { protected function init(): void { parent::init(); $this->addValidationRules([ 'has_custom_time_period' => 'in 1' ]); } protected function doAction(): void { $data = [ 'name' => $this->getInput('name', $this->widget->getDefaultName()), 'info' => $this->makeWidgetInfo(), 'user' => [ 'debug_mode' => $this->getDebugMode() ] ]; // Editing template dashboard? if ($this->isTemplateDashboard() && !$this->fields_values['override_hostid']) { $data['error'] = _('No data.'); } else { $data['triggers'] = $this->getTriggers(); $data['error'] = null; } $this->setResponse(new CControllerResponseData($data)); } private function getTriggers(): array { $groupids = !$this->isTemplateDashboard() && $this->fields_values['groupids'] ? getSubGroups($this->fields_values['groupids']) : null; if ($this->isTemplateDashboard()) { $hostids = $this->fields_values['override_hostid']; } else { $hostids = $this->fields_values['hostids'] ?: null; } $db_problems = API::Event()->get([ 'countOutput' => true, 'groupBy' => ['objectid'], 'groupids' => $groupids, 'hostids' => $hostids, 'source' => EVENT_SOURCE_TRIGGERS, 'object' => EVENT_OBJECT_TRIGGER, 'value' => TRIGGER_VALUE_TRUE, 'time_from' => $this->fields_values['time_period']['from_ts'], 'time_till' => $this->fields_values['time_period']['to_ts'], 'search' => [ 'name' => $this->fields_values['problem'] !== '' ? $this->fields_values['problem'] : null ], 'trigger_severities' => $this->fields_values['severities'] ?: null, 'evaltype' => $this->fields_values['evaltype'], 'tags' => $this->fields_values['tags'] ?: null, 'sortfield' => ['rowscount'], 'sortorder' => ZBX_SORT_DOWN, 'limit' => ZBX_MAX_WIDGET_LINES ]); if (!$db_problems) { return []; } $db_problems = array_column($db_problems, null, 'objectid'); $db_triggers = API::Trigger()->get([ 'output' => ['description', 'priority'], 'selectHosts' => ['hostid', 'name', 'status'], 'expandDescription' => true, 'triggerids' => array_keys($db_problems), 'preservekeys' => true ]); foreach ($db_triggers as $triggerid => &$trigger) { $trigger['problem_count'] = $db_problems[$triggerid]['rowscount']; } unset($trigger); CArrayHelper::sort($db_triggers, [ ['field' => 'problem_count', 'order' => ZBX_SORT_DOWN], ['field' => 'priority', 'order' => ZBX_SORT_DOWN], 'description' ]); $db_triggers = array_slice($db_triggers, 0, $this->fields_values['show_lines'], true); return $db_triggers; } /** * Make widget specific info to show in widget's header. */ private function makeWidgetInfo(): array { $info = []; if ($this->hasInput('has_custom_time_period')) { $info[] = [ 'icon' => ZBX_ICON_TIME_PERIOD, 'hint' => relativeDateToText($this->fields_values['time_period']['from'], $this->fields_values['time_period']['to'] ) ]; } return $info; } }