function drawMapLabels(&$im, &$map, &$map_info) { global $colors; if ($map['label_type'] == MAP_LABEL_TYPE_NOTHING) { return; } $selements = $map['selements']; $all_strings = ''; $label_lines = array(); $status_lines = array(); foreach ($selements as $selementid => $selement) { if (!isset($label_lines[$selementid])) { $label_lines[$selementid] = array(); } if (!isset($status_lines[$selementid])) { $status_lines[$selementid] = array(); } $msg = resolveMapLabelMacrosAll($selement); $all_strings .= $msg; $msgs = explode("\n", $msg); foreach ($msgs as $msg) { $label_lines[$selementid][] = array('msg' => $msg); } $el_info = $map_info[$selementid]; $el_msgs = array('problem', 'unack', 'maintenance', 'unknown', 'ok', 'status'); foreach ($el_msgs as $key => $caption) { if (!isset($el_info['info'][$caption]) || zbx_empty($el_info['info'][$caption]['msg'])) { continue; } $status_lines[$selementid][] = array('msg' => $el_info['info'][$caption]['msg'], 'color' => $el_info['info'][$caption]['color']); $all_strings .= $el_info['info'][$caption]['msg']; } } $allLabelsSize = imageTextSize(8, 0, str_replace("\r", '', str_replace("\n", '', $all_strings))); $labelFontHeight = $allLabelsSize['height']; $labelFontBaseline = $allLabelsSize['baseline']; foreach ($selements as $selementid => $selement) { if (empty($selement)) { continue; } $el_info = $map_info[$selementid]; $hl_color = null; $st_color = null; if (!isset($_REQUEST['noselements']) && $map['highlight'] % 2 == SYSMAP_HIGHLIGH_ON) { if ($el_info['icon_type'] == SYSMAP_ELEMENT_ICON_ON) { $hl_color = true; } if ($el_info['icon_type'] == SYSMAP_ELEMENT_ICON_UNKNOWN) { $hl_color = true; } if ($el_info['icon_type'] == SYSMAP_ELEMENT_ICON_MAINTENANCE) { $st_color = true; } if ($el_info['icon_type'] == SYSMAP_ELEMENT_ICON_DISABLED) { $st_color = true; } } if (in_array($selement['elementtype'], array(SYSMAP_ELEMENT_TYPE_HOST_GROUP, SYSMAP_ELEMENT_TYPE_MAP)) && !is_null($hl_color)) { $st_color = null; } else { if (!is_null($st_color)) { $hl_color = null; } } $label_location = is_null($selement['label_location']) || $selement['label_location'] < 0 ? $map['label_location'] : $selement['label_location']; $label = array(); if ($selement['elementtype'] == SYSMAP_ELEMENT_TYPE_HOST && $map['label_type'] == MAP_LABEL_TYPE_IP) { $host = get_host_by_hostid($selement['elementid']); $label[] = array('msg' => $host['ip']); $label = array_merge($label, $status_lines[$selementid]); } else { if ($map['label_type'] == MAP_LABEL_TYPE_STATUS) { $label = $status_lines[$selementid]; } else { if ($map['label_type'] == MAP_LABEL_TYPE_NAME) { $label[] = array('msg' => $el_info['name']); } else { $label = array_merge($label_lines[$selementid], $status_lines[$selementid]); } } } if (zbx_empty($label)) { continue; } $w = 0; foreach ($label as $str) { $dims = imageTextSize(8, 0, $str['msg']); $w = max($w, $dims['width']); } $h = count($label) * $labelFontHeight; $x = $selement['x']; $y = $selement['y']; $img = get_png_by_selement($selement, $el_info); $iconX = imagesx($img); $iconY = imagesy($img); if (!is_null($hl_color)) { $icon_hl = 14; } else { if (!is_null($st_color)) { $icon_hl = 6; } else { $icon_hl = 2; } } switch ($label_location) { case MAP_LABEL_LOC_TOP: $y_rec = $y - $icon_hl - $h - 6; $x_rec = $x + $iconX / 2 - $w / 2; break; case MAP_LABEL_LOC_LEFT: $y_rec = $y - $h / 2 + $iconY / 2; $x_rec = $x - $icon_hl - $w; break; case MAP_LABEL_LOC_RIGHT: $y_rec = $y - $h / 2 + $iconY / 2; $x_rec = $x + $iconX + $icon_hl; break; case MAP_LABEL_LOC_BOTTOM: default: $y_rec = $y + $iconY + $icon_hl; $x_rec = $x + $iconX / 2 - $w / 2; } // $y_rec += 30; // imagerectangle($im, $x_rec-2-1, $y_rec-3, $x_rec+$w+2+1, $y_rec+($oc*4)+$h+3, $label_color); // imagefilledrectangle($im, $x_rec-2, $y_rec-2, $x_rec+$w+2, $y_rec+($oc*4)+$h-2, $colors['White']); $increasey = 12; foreach ($label as $line) { if (zbx_empty($line['msg'])) { continue; } $str = str_replace("\r", '', $line['msg']); $color = isset($line['color']) ? $line['color'] : $colors['Black']; $dims = imageTextSize(8, 0, $str); // $dims['height'] = $labelFontHeight; //$str .= ' - '.$labelFontHeight.' - '.$dims['height']; //$str = $dims['width'].'x'.$dims['height']; if ($label_location == MAP_LABEL_LOC_TOP || $label_location == MAP_LABEL_LOC_BOTTOM) { $x_label = $x + ceil($iconX / 2) - ceil($dims['width'] / 2); } else { if ($label_location == MAP_LABEL_LOC_LEFT) { $x_label = $x_rec + $w - $dims['width']; } else { $x_label = $x_rec; } } imagefilledrectangle($im, $x_label - 1, $y_rec + $increasey - $labelFontHeight + $labelFontBaseline, $x_label + $dims['width'] + 1, $y_rec + $increasey + $labelFontBaseline, $colors['White']); imagetext($im, 8, 0, $x_label, $y_rec + $increasey, $color, $str); $increasey += $labelFontHeight + 1; } } }
function drawMapLabels(&$im, $map, $mapInfo, $resolveMacros = true) { global $colors; if ($map['label_type'] == MAP_LABEL_TYPE_NOTHING && $map['label_format'] == SYSMAP_LABEL_ADVANCED_OFF) { return; } $selements = $map['selements']; $allStrings = ''; $labelLines = array(); $statusLines = array(); foreach ($selements as $sid => $selement) { if (isset($selement['elementsubtype']) && $selement['elementsubtype'] == SYSMAP_ELEMENT_SUBTYPE_HOST_GROUP_ELEMENTS) { unset($selements[$sid]); } } // set label type and custom label text for all selements foreach ($selements as $selementId => $selement) { $selements[$selementId]['label_type'] = $map['label_type']; if ($map['label_format'] == SYSMAP_LABEL_ADVANCED_OFF) { continue; } switch ($selement['elementtype']) { case SYSMAP_ELEMENT_TYPE_HOST_GROUP: $selements[$selementId]['label_type'] = $map['label_type_hostgroup']; if ($map['label_type_hostgroup'] == MAP_LABEL_TYPE_CUSTOM) { $selements[$selementId]['label'] = $map['label_string_hostgroup']; } break; case SYSMAP_ELEMENT_TYPE_HOST: $selements[$selementId]['label_type'] = $map['label_type_host']; if ($map['label_type_host'] == MAP_LABEL_TYPE_CUSTOM) { $selements[$selementId]['label'] = $map['label_string_host']; } break; case SYSMAP_ELEMENT_TYPE_TRIGGER: $selements[$selementId]['label_type'] = $map['label_type_trigger']; if ($map['label_type_trigger'] == MAP_LABEL_TYPE_CUSTOM) { $selements[$selementId]['label'] = $map['label_string_trigger']; } break; case SYSMAP_ELEMENT_TYPE_MAP: $selements[$selementId]['label_type'] = $map['label_type_map']; if ($map['label_type_map'] == MAP_LABEL_TYPE_CUSTOM) { $selements[$selementId]['label'] = $map['label_string_map']; } break; case SYSMAP_ELEMENT_TYPE_IMAGE: $selements[$selementId]['label_type'] = $map['label_type_image']; if ($map['label_type_image'] == MAP_LABEL_TYPE_CUSTOM) { $selements[$selementId]['label'] = $map['label_string_image']; } break; } } foreach ($selements as $selementId => $selement) { if (!isset($labelLines[$selementId])) { $labelLines[$selementId] = array(); } if (!isset($statusLines[$selementId])) { $statusLines[$selementId] = array(); } $msg = $resolveMacros ? resolveMapLabelMacrosAll($selement) : $selement['label']; $allStrings .= $msg; $msgs = explode("\n", $msg); foreach ($msgs as $msg) { $labelLines[$selementId][] = array('msg' => $msg); } $elementInfo = $mapInfo[$selementId]; foreach (array('problem', 'unack', 'maintenance', 'ok', 'status') as $caption) { if (!isset($elementInfo['info'][$caption]) || zbx_empty($elementInfo['info'][$caption]['msg'])) { continue; } $statusLines[$selementId][] = array('msg' => $elementInfo['info'][$caption]['msg'], 'color' => $elementInfo['info'][$caption]['color']); $allStrings .= $elementInfo['info'][$caption]['msg']; } } $allLabelsSize = imageTextSize(8, 0, str_replace("\r", '', str_replace("\n", '', $allStrings))); $labelFontHeight = $allLabelsSize['height']; $labelFontBaseline = $allLabelsSize['baseline']; $elementsHostIds = array(); foreach ($selements as $selement) { if ($selement['label_type'] != MAP_LABEL_TYPE_IP) { continue; } if ($selement['elementtype'] == SYSMAP_ELEMENT_TYPE_HOST) { $elementsHostIds[] = $selement['elementid']; } } if (!empty($elementsHostIds)) { $mapHosts = API::Host()->get(array('hostids' => $elementsHostIds, 'output' => array('hostid'), 'selectInterfaces' => API_OUTPUT_EXTEND)); $mapHosts = zbx_toHash($mapHosts, 'hostid'); } // draw foreach ($selements as $selementId => $selement) { if (empty($selement) || $selement['label_type'] == MAP_LABEL_TYPE_NOTHING) { continue; } $elementInfo = $mapInfo[$selementId]; $hl_color = null; $st_color = null; if (!isset($_REQUEST['noselements']) && $map['highlight'] % 2 == SYSMAP_HIGHLIGHT_ON) { if ($elementInfo['icon_type'] == SYSMAP_ELEMENT_ICON_ON) { $hl_color = true; } if ($elementInfo['icon_type'] == SYSMAP_ELEMENT_ICON_MAINTENANCE) { $st_color = true; } if ($elementInfo['icon_type'] == SYSMAP_ELEMENT_ICON_DISABLED) { $st_color = true; } } if (in_array($selement['elementtype'], array(SYSMAP_ELEMENT_TYPE_HOST_GROUP, SYSMAP_ELEMENT_TYPE_MAP)) && !is_null($hl_color)) { $st_color = null; } elseif (!is_null($st_color)) { $hl_color = null; } $labelLocation = is_null($selement['label_location']) || $selement['label_location'] < 0 ? $map['label_location'] : $selement['label_location']; $label = array(); if ($selement['label_type'] == MAP_LABEL_TYPE_IP && $selement['elementtype'] == SYSMAP_ELEMENT_TYPE_HOST) { $interface = reset($mapHosts[$selement['elementid']]['interfaces']); $label[] = array('msg' => $interface['ip']); $label = array_merge($label, $statusLines[$selementId]); } elseif ($selement['label_type'] == MAP_LABEL_TYPE_STATUS) { $label = $statusLines[$selementId]; } elseif ($selement['label_type'] == MAP_LABEL_TYPE_NAME) { $label[] = array('msg' => $elementInfo['name']); $label = array_merge($label, $statusLines[$selementId]); } else { $label = array_merge($labelLines[$selementId], $statusLines[$selementId]); } if (empty($label)) { continue; } $w = 0; foreach ($label as $str) { $dims = imageTextSize(8, 0, $str['msg']); $w = max($w, $dims['width']); } $h = count($label) * $labelFontHeight; $x = $selement['x']; $y = $selement['y']; $image = get_png_by_selement($elementInfo); $iconX = imagesx($image); $iconY = imagesy($image); if (!is_null($hl_color)) { $icon_hl = 14; } elseif (!is_null($st_color)) { $icon_hl = 6; } else { $icon_hl = 2; } switch ($labelLocation) { case MAP_LABEL_LOC_TOP: $y_rec = $y - $icon_hl - $h - 6; $x_rec = $x + $iconX / 2 - $w / 2; break; case MAP_LABEL_LOC_LEFT: $y_rec = $y - $h / 2 + $iconY / 2; $x_rec = $x - $icon_hl - $w; break; case MAP_LABEL_LOC_RIGHT: $y_rec = $y - $h / 2 + $iconY / 2; $x_rec = $x + $iconX + $icon_hl; break; case MAP_LABEL_LOC_BOTTOM: default: $y_rec = $y + $iconY + $icon_hl; $x_rec = $x + $iconX / 2 - $w / 2; } $increasey = 12; foreach ($label as $line) { if (zbx_empty($line['msg'])) { continue; } $str = str_replace("\r", '', $line['msg']); $color = isset($line['color']) ? $line['color'] : $colors['Black']; $dims = imageTextSize(8, 0, $str); if ($labelLocation == MAP_LABEL_LOC_TOP || $labelLocation == MAP_LABEL_LOC_BOTTOM) { $x_label = $x + ceil($iconX / 2) - ceil($dims['width'] / 2); } elseif ($labelLocation == MAP_LABEL_LOC_LEFT) { $x_label = $x_rec + $w - $dims['width']; } else { $x_label = $x_rec; } imagefilledrectangle($im, $x_label - 1, $y_rec + $increasey - $labelFontHeight + $labelFontBaseline, $x_label + $dims['width'] + 1, $y_rec + $increasey + $labelFontBaseline, $colors['White']); imagetext($im, 8, 0, $x_label, $y_rec + $increasey, $color, $str); $increasey += $labelFontHeight + 1; } } }
if ('selements' == $_REQUEST['favobj']) { $sysmapid = get_request('sysmapid', 0); $cmapid = get_request('favid', 0); switch ($_REQUEST['action']) { case 'get_img': $selements = get_request('selements', '[]'); $selements = $json->decode($selements, true); if (empty($selements)) { print 'ZBX_SYSMAPS[' . $cmapid . '].map.info("' . S_GET_IMG_ELEMENT_DATA_NOT_FOUND . '"); '; break; } $selement = reset($selements); $selement['sysmapid'] = $sysmapid; // $selement['image'] = get_base64_icon($element); $selement['image'] = get_selement_iconid($selement); $selement['label_expanded'] = resolveMapLabelMacrosAll($selement); $action = ''; $action .= 'ZBX_SYSMAPS[' . $cmapid . '].map.add_selement(' . zbx_jsvalue($selement) . ',1);'; // $action.= 'ZBX_SYSMAPS['.$cmapid.'].map.updateMapImage();'; print $action; break; case 'new_selement': $default_icon = get_default_image(false); $selements = get_request('selements', '[]'); $selements = $json->decode($selements, true); if (!empty($selements)) { $selement = reset($selements); $selement['iconid_off'] = $default_icon['imageid']; // $selement['image'] = get_base64_icon($element); $selement['image'] = get_selement_iconid($selement); $action = '';