Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/zabbix/zabbix.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'ui/widgets/clock/actions/WidgetView.php')
-rw-r--r--ui/widgets/clock/actions/WidgetView.php313
1 files changed, 313 insertions, 0 deletions
diff --git a/ui/widgets/clock/actions/WidgetView.php b/ui/widgets/clock/actions/WidgetView.php
new file mode 100644
index 00000000000..62ce9a2f435
--- /dev/null
+++ b/ui/widgets/clock/actions/WidgetView.php
@@ -0,0 +1,313 @@
+<?php declare(strict_types = 0);
+/*
+** Zabbix
+** Copyright (C) 2001-2022 Zabbix SIA
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** 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 General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+**/
+
+
+namespace Widgets\Clock\Actions;
+
+use API,
+ CControllerDashboardWidgetView,
+ CControllerResponseData,
+ CTimezoneHelper,
+ DateTime,
+ DateTimeZone,
+ Exception,
+ Manager;
+
+use Widgets\Clock\Widget;
+
+class WidgetView extends CControllerDashboardWidgetView {
+
+ protected function init(): void {
+ parent::init();
+
+ $this->addValidationRules([
+ 'dynamic_hostid' => 'db hosts.hostid'
+ ]);
+ }
+
+ protected function doAction(): void {
+ $config_defaults = [
+ 'name' => $this->widget->getDefaultName(),
+ 'type' => $this->fields_values['clock_type'],
+ 'time' => null,
+ 'time_zone_offset' => null,
+ 'date' => date(ZBX_DATE),
+ 'time_zone' => TIMEZONE_DEFAULT_LOCAL,
+ 'is_enabled' => true,
+ 'critical_error' => null
+ ];
+
+ switch ($this->fields_values['time_type']) {
+ case TIME_TYPE_HOST:
+ $clock_data = $this->configureHostTime() + $config_defaults;
+ break;
+
+ case TIME_TYPE_SERVER:
+ $clock_data = $this->configureFields() + $config_defaults;
+ $clock_data['name'] = _('Server');
+ break;
+
+ default:
+ $clock_data = $this->configureFields() + $config_defaults;
+ $clock_data['name'] = _('Local');
+ break;
+ }
+
+ // Pass clock configuration to browser script.
+ if ($this->fields_values['clock_type'] === Widget::TYPE_DIGITAL) {
+ $clock_data['show'] = $this->fields_values['show'];
+ $clock_data['bg_color'] = $this->fields_values['bg_color'];
+ $clock_data['time_format'] = $this->fields_values['time_format'];
+ $clock_data['seconds'] = ($this->fields_values['time_sec'] == 1);
+ $clock_data['tzone_format'] = $this->fields_values['tzone_format'];
+ }
+
+ $this->setResponse(new CControllerResponseData([
+ 'name' => $this->getInput('name', $clock_data['name']),
+ 'clock_data' => $clock_data,
+ 'styles' => $this->getFieldStyles(),
+ 'user' => [
+ 'debug_mode' => $this->getDebugMode()
+ ]
+ ]));
+ }
+
+ /**
+ * Makes time zone field value.
+ *
+ * @param string $time_zone Saved time zone name.
+ * @param int $format Use time zone name (from database) if short or time zone title (from list) if long.
+ *
+ * @return string Return time zone name from list or 'local' if time zone must be set via browser.
+ */
+ private function makeTimeZoneValue(string $time_zone, int $format = Widget::TIMEZONE_SHORT): string {
+ if ($time_zone === TIMEZONE_DEFAULT_LOCAL) {
+ return $time_zone;
+ }
+
+ $zone = $time_zone === ZBX_DEFAULT_TIMEZONE ? CTimezoneHelper::getSystemTimezone() : $time_zone;
+
+ if ($format === Widget::TIMEZONE_SHORT) {
+ if (($pos = strrpos($zone, '/')) !== false) {
+ $zone = substr($zone, $pos + 1);
+ }
+ }
+ else {
+ $zone = CTimezoneHelper::getTitle($zone);
+ }
+
+ return str_replace('_', ' ', $zone);
+ }
+
+ private function showDate(): bool {
+ return $this->fields_values['clock_type'] === Widget::TYPE_DIGITAL
+ && in_array(Widget::SHOW_DATE, $this->fields_values['show']);
+ }
+
+ private function showTime(): bool {
+ return $this->fields_values['clock_type'] === Widget::TYPE_ANALOG
+ || in_array(Widget::SHOW_TIME, $this->fields_values['show']);
+ }
+
+ private function showTimeZone(): bool {
+ return $this->fields_values['clock_type'] === Widget::TYPE_DIGITAL
+ && in_array(Widget::SHOW_TIMEZONE, $this->fields_values['show']);
+ }
+
+ /**
+ * @param DateTime $date
+ *
+ * @return array
+ */
+ private function makeTimeFromDateTime(DateTime $date): array {
+ $time = [];
+
+ $time['time'] = $date->getTimestamp();
+ $time['time_zone_offset'] = (int) $date->format('Z');
+
+ return $time;
+ }
+
+ /**
+ * Makes DateTime object from passed time_zone string.
+ *
+ * @param string $time_zone Time zone string.
+ *
+ * @return DateTime|null Returns created DateTime object or null if time zone is set by browser.
+ */
+ private function makeDateTimeFromTimeZone(string $time_zone): ?DateTime {
+ if ($time_zone === TIMEZONE_DEFAULT_LOCAL) {
+ return null;
+ }
+
+ $now = new DateTime();
+
+ if ($time_zone !== ZBX_DEFAULT_TIMEZONE) {
+ $now->setTimezone(new DateTimeZone($time_zone));
+ }
+
+ return $now;
+ }
+
+ private function configureHostTime(): array {
+ $items = [];
+ $clock = ['is_enabled' => true];
+
+ if ($this->hasInput('templateid')) {
+ if ($this->hasInput('dynamic_hostid')) {
+ $template_items = API::Item()->get([
+ 'output' => ['key_'],
+ 'itemids' => $this->fields_values['itemid'],
+ 'webitems' => true
+ ]);
+
+ if ($template_items) {
+ $items = API::Item()->get([
+ 'output' => ['itemid', 'value_type'],
+ 'selectHosts' => ['name'],
+ 'hostids' => [$this->getInput('dynamic_hostid')],
+ 'filter' => [
+ 'key_' => $template_items[0]['key_']
+ ],
+ 'webitems' => true
+ ]);
+ }
+ }
+ // Editing template dashboard?
+ else {
+ $clock['is_enabled'] = false;
+ }
+ }
+ else {
+ $items = API::Item()->get([
+ 'output' => ['itemid', 'value_type'],
+ 'selectHosts' => ['name'],
+ 'itemids' => $this->fields_values['itemid'],
+ 'webitems' => true
+ ]);
+ }
+
+ if (!$clock['is_enabled']) {
+ return $clock;
+ }
+
+ if ($items) {
+ $item = $items[0];
+ $clock['name'] = $item['hosts'][0]['name'];
+
+ $last_value = Manager::History()->getLastValues([$item]);
+
+ if ($last_value) {
+ $last_value = $last_value[$item['itemid']][0];
+
+ try {
+ $now = new DateTime($last_value['value']);
+
+ if ($this->showDate()) {
+ $clock['date'] = $now->format(ZBX_DATE);
+ }
+
+ $clock['time_zone_offset'] = (int) $now->format('Z');
+
+ $clock['time'] = time() - ($last_value['clock'] - $now->getTimestamp());
+
+ if ($this->showTimeZone()) {
+ $clock['time_zone'] = 'UTC'.$now->format('P');
+ }
+ }
+ catch (Exception $e) {
+ $clock['is_enabled'] = false;
+ }
+ }
+ else {
+ $clock['is_enabled'] = false;
+ }
+ }
+ else {
+ $clock['critical_error'] = _('No permissions to referred object or it does not exist!');
+ }
+
+ return $clock;
+ }
+
+ /**
+ * Create required clock field values both for analog and digital clock.
+ */
+ private function configureFields(): array {
+ $clock = [];
+
+ $date = $this->makeDateTimeFromTimeZone($this->fields_values['tzone_timezone']);
+
+ if ($date !== null) {
+ if ($this->showDate()) {
+ $clock['date'] = $date->format(ZBX_DATE);
+ }
+
+ if ($this->showTime()) {
+ $clock = array_merge($clock, $this->makeTimeFromDateTime($date));
+ }
+ }
+
+ if ($this->showTimeZone()) {
+ $clock['time_zone'] = $this->makeTimeZoneValue($this->fields_values['tzone_timezone'],
+ $this->fields_values['tzone_format']
+ );
+ }
+
+ return $clock;
+ }
+
+ /**
+ * Groups enabled field styles by field name (Date, Time, Time zone).
+ */
+ private function getFieldStyles(): array {
+ $cells = [];
+
+ if ($this->fields_values['clock_type'] === Widget::TYPE_DIGITAL) {
+ $show = $this->fields_values['show'];
+
+ if (in_array(Widget::SHOW_DATE, $show)) {
+ $cells['date'] = [
+ 'size' => $this->fields_values['date_size'],
+ 'bold' => ($this->fields_values['date_bold'] == 1),
+ 'color' => $this->fields_values['date_color']
+ ];
+ }
+
+ if (in_array(Widget::SHOW_TIME, $show)) {
+ $cells['time'] = [
+ 'size' => $this->fields_values['time_size'],
+ 'bold' => ($this->fields_values['time_bold'] == 1),
+ 'color' => $this->fields_values['time_color']
+ ];
+ }
+
+ if (in_array(Widget::SHOW_TIMEZONE, $show)) {
+ $cells['timezone'] = [
+ 'size' => $this->fields_values['tzone_size'],
+ 'bold' => ($this->fields_values['tzone_bold'] == 1),
+ 'color' => $this->fields_values['tzone_color']
+ ];
+ }
+ }
+
+ return $cells;
+ }
+}