1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
<?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 Zabbix\Widgets\Fields;
use CNumberParser,
CParser;
use Zabbix\Widgets\CWidgetField;
class CWidgetFieldThresholds extends CWidgetField {
public const DEFAULT_VIEW = \CWidgetFieldThresholdsView::class;
public const DEFAULT_VALUE = [];
private bool $is_binary_units;
/**
* Create widget field for Thresholds selection.
*/
public function __construct(string $name, ?string $label = null, bool $is_binary_units = false) {
parent::__construct($name, $label);
$this->is_binary_units = $is_binary_units;
$this
->setDefault(self::DEFAULT_VALUE)
->setValidationRules(['type' => API_OBJECTS, 'uniq' => [['threshold']], 'fields' => [
'color' => ['type' => API_COLOR, 'flags' => API_REQUIRED | API_NOT_EMPTY],
'threshold' => ['type' => API_NUMERIC, 'flags' => API_REQUIRED]
]]);
}
public function setValue($value): self {
$thresholds = [];
foreach ($value as $threshold) {
$threshold['threshold'] = trim($threshold['threshold']);
if ($threshold['threshold'] !== '') {
$thresholds[] = $threshold;
}
}
return parent::setValue($thresholds);
}
public function validate($strict = false): array {
if ($errors = parent::validate($strict)) {
return $errors;
}
$number_parser = new CNumberParser([
'with_size_suffix' => true,
'with_time_suffix' => true,
'is_binary_size' => $this->is_binary_units
]);
$thresholds = [];
foreach ($this->getValue() as $threshold) {
if ($number_parser->parse($threshold['threshold']) === CParser::PARSE_SUCCESS) {
$thresholds[] = $threshold + ['threshold_value' => $number_parser->calcValue()];
}
}
uasort($thresholds,
static function (array $threshold_1, array $threshold_2): int {
return $threshold_1['threshold_value'] <=> $threshold_2['threshold_value'];
}
);
foreach ($thresholds as &$threshold) {
unset($threshold['threshold_value']);
}
unset($threshold);
$thresholds = array_values($thresholds);
$this->setValue($thresholds);
return [];
}
public function toApi(array &$widget_fields = []): void {
foreach ($this->getValue() as $index => $value) {
$widget_fields[] = [
'type' => $this->save_type,
'name' => $this->name.'.'.$index.'.color',
'value' => $value['color']
];
$widget_fields[] = [
'type' => $this->save_type,
'name' => $this->name.'.'.$index.'.threshold',
'value' => $value['threshold']
];
}
}
}
|