iTop中同一类型对象使用不同的图标

iTop 中网络设备类没有细分为交换机路由器防火墙,而是通过一个 外建类型的属性 networkdevicetype_id 来确定网络设备类型。这样做大概是因为能够复用代码。但是会有一个问题,生成的影响图里,网络设备的图标是单一的,无法清晰的看出是交换机,路由器或者是防火墙设备。如图所示。

如果拆分 NetworkDevice 类,将其变为抽象类,然后细分交换机,路由器,防火墙,负载均衡.... 想想要为每个类写 presentation 也挺可怕的。所以还是要找简单点的方法。

DBObject 提供了 GetIcon 方法,通过此方法,可以实现自定义 Icon,代码如下:

<class id="NetworkDevice">
	<methods>
		<method id="GetIcon" _delta="define">
			<static>false</static>
			<access>public</access>
			<type>Overload-DBObject</type>
			<code><![CDATA[
				public function GetIcon($bImgTag = true)
				{
					$aDefaultConf = array("Router" => "images/router.png", "Switch" => "images/switch.png");
					$aConf = MetaModel::GetModuleSetting("opsitop-main","networkdevice_icon", $aDefaultConf);
					$sDeviceType = $this->Get("networkdevicetype_name");
					if(array_key_exists($sDeviceType, $aConf)) {
						$sEnv = MetaModel::GetEnvironment();
						$sIcon = '../env-' . $sEnv . '/opsitop-main/' . $aConf[$sDeviceType];
						if($bImgTag) {
							return '<img src="' . $sIcon . '">';
						} else {
							// 影响图里不需要 img tag
							return $sIcon;
						}
					} else {
						return parent::GetIcon($bImgTag);
					}
				}
			]]>
			</code>
		</method>
	</methods>
</class>

效果如图。

One thought on “iTop中同一类型对象使用不同的图标

  1. 支持上传图标的方法。
    ```
    public function GetIcon($bImgTag = true)
    {
    $iPeripheralType = $this->Get('peripheraltype_id');
    $oPeripheralType = MetaModel::GetObject("PeripheralType", $iPeripheralType, false, true);
    if(is_null($oPeripheralType)) {
    return parent::GetIcon($bImgTag);
    } else {
    $sIcon = $oPeripheralType->Get('icon')->GetDisplayURL('PeripheralType', $iPeripheralType, 'icon');
    if($bImgTag) {
    return '';
    } else {
    // 影响图里不需要 img tag
    return $sIcon;
    }
    }
    }

    ```

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注