/**
* Update IconMap.
* @param array $iconMaps
* @return array
*/
public function update(array $iconMaps)
{
if (USER_TYPE_SUPER_ADMIN != self::$userData['type']) {
self::exception(ZBX_API_ERROR_PERMISSIONS, _('Only Super Admins can update icon maps.'));
}
$iconMaps = zbx_toArray($iconMaps);
$iconMapids = zbx_objectValues($iconMaps, 'iconmapid');
$updates = [];
$duplicates = [];
foreach ($iconMaps as $iconMap) {
if (!check_db_fields(['iconmapid' => null], $iconMap)) {
self::exception(ZBX_API_ERROR_PARAMETERS, _s('Incorrect parameters for icon map update method "%s".', $iconMap['name']));
}
if (isset($iconMap['name'])) {
if (zbx_empty($iconMap['name'])) {
self::exception(ZBX_API_ERROR_PARAMETERS, _s('Icon map name cannot be empty.'));
} elseif (isset($duplicates[$iconMap['name']])) {
self::exception(ZBX_API_ERROR_PARAMETERS, _s('Cannot create icon maps with identical name "%s".', $iconMap['name']));
} else {
$duplicates[$iconMap['name']] = $iconMap['name'];
}
}
}
$this->validateMappings($iconMaps, false);
$iconMapsUpd = API::IconMap()->get(['iconmapids' => $iconMapids, 'output' => API_OUTPUT_EXTEND, 'preservekeys' => true, 'selectMappings' => API_OUTPUT_EXTEND]);
$oldIconMappings = [];
$newIconMappings = [];
foreach ($iconMaps as $iconMap) {
if (!isset($iconMapsUpd[$iconMap['iconmapid']])) {
self::exception(ZBX_API_ERROR_PARAMETERS, _s('Icon map with iconmapid "%s" does not exist.', $iconMap['iconmapid']));
}
// Existence
if (isset($iconMap['name'])) {
$iconMapExists = $this->get(['filter' => ['name' => $iconMap['name']], 'output' => ['iconmapid'], 'editable' => true, 'nopermissions' => true, 'preservekeys' => true]);
if (($iconMapExists = reset($iconMapExists)) && bccomp($iconMapExists['iconmapid'], $iconMap['iconmapid']) != 0) {
self::exception(ZBX_API_ERROR_PARAMETERS, _s('Icon map "%s" already exists.', $iconMap['name']));
}
}
if (isset($iconMap['mappings'])) {
$mappingsDb = $iconMapsUpd[$iconMap['iconmapid']]['mappings'];
foreach ($mappingsDb as $mapping) {
$oldIconMappings[] = $mapping;
}
foreach ($iconMap['mappings'] as $mapping) {
$mapping['iconmapid'] = $iconMap['iconmapid'];
$newIconMappings[] = $mapping;
}
}
$iconMapid = $iconMap['iconmapid'];
unset($iconMap['iconmapid']);
if (!empty($iconMap)) {
$updates[] = ['values' => $iconMap, 'where' => ['iconmapid' => $iconMapid]];
}
}
DB::save('icon_map', $iconMaps);
DB::replace('icon_mapping', $oldIconMappings, $newIconMappings);
return ['iconmapids' => $iconMapids];
}