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 113 114 115 116 117 118 119 120 121 122 123
|
<?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 Zabbix\Widgets\CWidgetField;
class CWidgetFieldNavTree extends CWidgetField {
public const DEFAULT_VALUE = [];
public function __construct(string $name, ?string $label = null) {
parent::__construct($name, $label);
$this
->setDefault(self::DEFAULT_VALUE)
->setValidationRules(['type' => API_OBJECTS, 'flags' => API_PRESERVE_KEYS, 'fields' => [
'name' => ['type' => API_STRING_UTF8, 'flags' => API_REQUIRED | API_NOT_EMPTY, 'length' => 255],
'order' => ['type' => API_INT32, 'in' => '1:'.ZBX_MAX_INT32, 'default' => 1],
'parent' => ['type' => API_INT32, 'in' => '0:'.ZBX_MAX_INT32, 'default' => 0],
'sysmapid' => ['type' => API_ID, 'default' => '0']
]]);
}
public function setValue($value): self {
$this->value = (array) $value;
return $this;
}
public function validate(bool $strict = false): array {
if ($errors = parent::validate($strict)) {
return $errors;
}
$field_value = $this->getValue();
if ($field_value === self::DEFAULT_VALUE) {
return [];
}
// Check and fix the tree of the maps.
foreach ($field_value as $fieldid => &$navtree_item) {
if ($navtree_item['parent'] != 0 && !array_key_exists($navtree_item['parent'], $field_value)) {
$errors[] = _s('Incorrect value for field "%1$s": %2$s.',
'navtree['.$fieldid.'][parent]', _('reference to a non-existent tree element')
);
$navtree_item['parent'] = 0;
}
}
unset($navtree_item);
// Find and fix circular dependencies.
foreach ($field_value as $navtree_item) {
$parentid = $navtree_item['parent'];
$parentids = [$parentid => true];
while ($parentid != 0) {
if (array_key_exists($field_value[$parentid]['parent'], $parentids)) {
$errors[] = _s('Incorrect value for field "%1$s": %2$s.',
'navtree['.$parentid.'][parent]', _('circular dependency is not allowed')
);
$field_value[$parentid]['parent'] = 0;
}
$parentid = $field_value[$parentid]['parent'];
}
}
$this->setValue($field_value);
return $errors;
}
public function toApi(array &$widget_fields = []): void {
foreach ($this->getValue() as $index => $value) {
$widget_fields[] = [
'type' => $this->save_type,
'name' => $this->name.'.'.$index.'.name',
'value' => $value['name']
];
$value += ['order' => 1, 'parent' => 0, 'sysmapid' => 0];
if ($value['order'] != 1) {
$widget_fields[] = [
'type' => ZBX_WIDGET_FIELD_TYPE_INT32,
'name' => $this->name.'.'.$index.'.order',
'value' => $value['order']
];
}
if ($value['parent'] != 0) {
$widget_fields[] = [
'type' => ZBX_WIDGET_FIELD_TYPE_INT32,
'name' => $this->name.'.'.$index.'.parent',
'value' => $value['parent']
];
}
if ($value['sysmapid'] != 0) {
$widget_fields[] = [
'type' => ZBX_WIDGET_FIELD_TYPE_MAP,
'name' => $this->name.'.'.$index.'.sysmapid',
'value' => $value['sysmapid']
];
}
}
}
}
|