Создание связей между объектами cmdb


#7

Спасибо за разъяснение.
Если я все верно понял, то мне надо:

  1. Сделать новый модуль (ну или в старый дописать, где уже есть добавление полей).

  2. В нем прописать






    130






    30






    50




для каждого класса. Верно?
Или же будет лучше скопировать содержимое datamodel.itop-enduser-devices и часть из datamodel.itop-config-mgmt (в части конечных устройств типа сервер и т.д.) в модуль и туда дописать вывод своих полей?


#8

В том же модуле, где ты добавляешь поля, делай их вывод. Одно без другого не имеет смысла.
По поводу копипаста всей модели данных, мне кажется не лучшая идея. Потом запутаешься, где твоё, а где родное. Я стараюсь в свои модули переносить минимум из первоначального кода и только тогда, когда действительно необходимо.


#10

Компьютер и принтер реальные классы.
Можно как-нибудь установить связь что конкретный принтер, с определенной моделью и серийным номером подключен к какому-то конкретному компьютеру.
В данном примере описан один абстрактный класс PhysicalDevice, от которого наследуются свойства к реальному классу Laptop.
Как сделать связь между двумя реальными классами?


#11

В базовых классах есть сервера и стойки.
Конкретный сервер можно поставить в конкретную стойку.
Как такую связь между двумя реальными классами реализовать?


#12

Реальность или абстрактность классов не влияет на создание связей. Разница лишь в том, что описав функционал для реального класса, использовать его будут только объекты этого класса. А если описать функционал в абстрактном классе, то им будут пользоваться все объекты дочерних классов.
Как сделать связь “один ко многим” описано несколькими сообщениями выше. Что конкретно не получается?


#13

Создал класс UPS.
В который хочу включить два дочерних класса батарейный модуль и силовой модуль.
Начал описывать данный класс, начиная дочерних модулей.
Описал два дочерних модуля, проверил в toolkit, без проблем установилось.
Захотел вставить батарейный модуль и силовой модуль в UPS.
Не получилось. Toolkit выдает ошибки.

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:340 Message:Opening and ending tag mismatch: sql line 337 and field

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:345 Message:Opening and ending tag mismatch: sql line 342 and field

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:346 Message:Opening and ending tag mismatch: sql line 342 and fields

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:485 Message:Opening and ending tag mismatch: field line 341 and class

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:486 Message:Opening and ending tag mismatch: sql line 337 and classes

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:533 Message:Opening and ending tag mismatch: field line 336 and itop_design

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:534 Message:Premature end of data in tag fields line 335

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:534 Message:Premature end of data in tag class line 310

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:534 Message:Premature end of data in tag classes line 5

File: /var/www/html/extensions/power-module/datamodel.power-module.xml Line:534 Message:Premature end of data in tag itop_design line 2

An error occured while processing the PHP files of the data model:

ERROR missing parameter 'on_target_delete' in AttributeExternalKey declaration for class UPS (/var/www/html/env-toolkit/power-module/model.power-module.php - 176)

Check the PHP files describing the data model before running the toolkit again !

Ниже мой модуль в XML

<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
  <constants>
  </constants>
  <classes>
	<class id="PowerModule" _delta="define">
	<parent>PhysicalDevice</parent>
	<properties>
		<category>bizmodel,searchable</category>
		<abstract>false</abstract>
		<key_type>autoincrement</key_type>
		<db_table>powermodule</db_table>
		<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/PowerModule.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
		</attributes>
		</reconciliation>
	</properties>
		<methods/>
		<presentation>
		<details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
		<search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
		<list>
		  <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
		</list>
		</presentation>
	</class>
	<class id="BatteryModule" _delta="define">
	<parent>PhysicalDevice</parent>
	<properties>
		<category>bizmodel,searchable</category>
		<abstract>false</abstract>
		<key_type>autoincrement</key_type>
		<db_table>batterymodule</db_table>
		<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/BatteryModule.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
		</attributes>
		</reconciliation>
	</properties>
		<methods/>
		<presentation>
		<details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
		<search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
		<list>
		  <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
		</list>
		</presentation>
	</class>
	<class id="UPS" _delta="define">
		<parent>PhysicalDevice</parent>
		<properties>
			<category>bizmodel,searchable</category>
			<abstract>false</abstract>
			<key_type>autoincrement</key_type>
			<db_table>ups</db_table>
			<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/ups.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
			</attributes>
			</reconciliation>			
		</properties>
		<fields>
			<field id="PowerModule" xsi:type="AttributeExternalKey" _delta="define">
			<sql>powermodule<sql>
			<default_value/>
			<is_null_allowed>true</is_null_allowed>
			</field>
			<field id="BatteryModule" xsi:type="AttributeExternalKey" _delta="define">
			<sql>batterymodule<sql>
			<default_value/>
			<is_null_allowed>true</is_null_allowed>
			</field>
		</fields>
		<methods/>
      <presentation>
        <details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="PowerModule">
              <rank>75</rank>
            </item>
			<item id="BatteryModule">
              <rank>80</rank>
            </item>
            <item id="serialnumber">
              <rank>85</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
        <search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="PowerModule">
              <rank>75</rank>
            </item>
			<item id="BatteryModule">
              <rank>80</rank>
            </item>
            <item id="serialnumber">
              <rank>85</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
        <list>
          <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
        </list>
      </presentation>
	</class>
  </classes>
  <menus>
    <menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="112" xsi:type="DashletBadge" _delta="define">
              <rank>11</rank>
              <class>PowerModule</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
	<menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="113" xsi:type="DashletBadge" _delta="define">
              <rank>12</rank>
              <class>BatteryModule</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
	<menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="114" xsi:type="DashletBadge" _delta="define">
              <rank>13</rank>
              <class>UPS</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
  </menus>
    <profiles>
    </profiles>
</itop_design>

Прошу помочь связать данные классы


#14

Opening and ending tag mismatch == Несоответствие открывающего и закрывающего тегов

В твоем случае <sql>.

Premature end of data in tag == Преждевременное окончание данных в теге

В твоем случает на правильное объявление поля AttributeExternalKey, не хватает обязательных полей. См. ман по полям: https://wiki.openitop.org/doku.php?id=2_2_0:customization:xml_reference#fields.

Дополнительно. Если делаем <class id="UPS" _delta="define">, то всё, что внутри этого класса тоже имеет _delta="define. То есть писать _delta="define в полях <field id="PowerModule" ... _delta="define"> не нужно.


#15

Добавил mandatory поля в AttributeExternalKey.
Модуль установился.
При попытке создания новой единицы в основном модуле нету связей с дочерними модулями.
Расскажите как сделать чтобы в модуле UPS можно было выбрать батарейный модуль и силовой модуль.
У меня создалось 3 отдельных модуля без связей между ними.
Ниже мой код, который у меня установился.

<img src="/uploads/default/56/d49db6ac108d0b4f.jpg" width="586" height="500"> <?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
  <constants>
  </constants>
  <classes>
	<class id="PowerModule" _delta="define">
	<parent>PhysicalDevice</parent>
	<properties>
		<category>bizmodel,searchable</category>
		<abstract>false</abstract>
		<key_type>autoincrement</key_type>
		<db_table>powermodule</db_table>
		<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/PowerModule.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
		</attributes>
		</reconciliation>
	</properties>
		<methods/>
		<presentation>
		<details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
		<search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
		<list>
		  <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
		</list>
		</presentation>
	</class>
	<class id="BatteryModule" _delta="define">
	<parent>PhysicalDevice</parent>
	<properties>
		<category>bizmodel,searchable</category>
		<abstract>false</abstract>
		<key_type>autoincrement</key_type>
		<db_table>batterymodule</db_table>
		<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/BatteryModule.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
		</attributes>
		</reconciliation>
	</properties>
		<methods/>
		<presentation>
		<details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
		<search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
		<list>
		  <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
		</list>
		</presentation>
	</class>
	<class id="UPS" _delta="define">
		<parent>PhysicalDevice</parent>
		<properties>
			<category>bizmodel,searchable</category>
			<abstract>false</abstract>
			<key_type>autoincrement</key_type>
			<db_table>ups</db_table>
			<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/ups.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
			</attributes>
			</reconciliation>			
		</properties>
		<fields>
			<field id="PowerModule" xsi:type="AttributeExternalKey">
			<sql>powermodule</sql>
			<default_value/>
			<is_null_allowed>true</is_null_allowed>
			<on_target_delete>DEL_AUTO</on_target_delete>
			</field>
			<field id="BatteryModule" xsi:type="AttributeExternalKey">
			<sql>batterymodule</sql>
			<default_value/>
			<is_null_allowed>true</is_null_allowed>
			<on_target_delete>DEL_AUTO</on_target_delete>
			</field>
		</fields>
		<methods/>
      <presentation>
        <details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="PowerModule">
              <rank>75</rank>
            </item>
			<item id="BatteryModule">
              <rank>80</rank>
            </item>
            <item id="serialnumber">
              <rank>85</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
        <search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="PowerModule">
              <rank>75</rank>
            </item>
			<item id="BatteryModule">
              <rank>80</rank>
            </item>
            <item id="serialnumber">
              <rank>85</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
        <list>
          <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
        </list>
      </presentation>
	</class>
  </classes>
  <menus>
    <menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="112" xsi:type="DashletBadge" _delta="define">
              <rank>11</rank>
              <class>PowerModule</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
	<menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="113" xsi:type="DashletBadge" _delta="define">
              <rank>12</rank>
              <class>BatteryModule</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
	<menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="114" xsi:type="DashletBadge" _delta="define">
              <rank>13</rank>
              <class>UPS</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
  </menus>
    <profiles>
    </profiles>
</itop_design>

#16

Я не использовал атрибут

<field id="name" xsi:type="AttributeExternalField">

Наверное как-то через это связываются классы.


#17

Добавил AttributeExternalField в свой код.
Связь между типами создать не получилось.

<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
  <constants>
  </constants>
  <classes>
	<class id="PowerModule" _delta="define">
	<parent>PhysicalDevice</parent>
	<properties>
		<category>bizmodel,searchable</category>
		<abstract>false</abstract>
		<key_type>autoincrement</key_type>
		<db_table>powermodule</db_table>
		<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/PowerModule.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
		</attributes>
		</reconciliation>
	</properties>
		<methods/>
		<presentation>
		<details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
		<search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
		<list>
		  <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
		</list>
		</presentation>
	</class>
	<class id="BatteryModule" _delta="define">
	<parent>PhysicalDevice</parent>
	<properties>
		<category>bizmodel,searchable</category>
		<abstract>false</abstract>
		<key_type>autoincrement</key_type>
		<db_table>batterymodule</db_table>
		<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/BatteryModule.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
		</attributes>
		</reconciliation>
	</properties>
		<methods/>
		<presentation>
		<details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
		<search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="serialnumber">
              <rank>80</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
		<list>
		  <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
		</list>
		</presentation>
	</class>
	<class id="UPS" _delta="define">
		<parent>PhysicalDevice</parent>
		<properties>
			<category>bizmodel,searchable</category>
			<abstract>false</abstract>
			<key_type>autoincrement</key_type>
			<db_table>ups</db_table>
			<db_key_field>id</db_key_field>
			<db_final_class_field/>
			<naming>
			<format>%1$s</format>
			<attributes>
				<attribute id="name"/>
			</attributes>
			</naming>
			<display_template/>
			<icon>images/ups.png</icon>
			<reconciliation>
			<attributes>
				<attribute id="name"/>
				<attribute id="org_id"/>
				<attribute id="organization_name"/>
			</attributes>
			</reconciliation>			
		</properties>
		<fields>
			<field id="PowerModule" xsi:type="AttributeExternalKey">
			<sql>powermodule</sql>
			<default_value/>
			<is_null_allowed>true</is_null_allowed>
			<on_target_delete>DEL_AUTO</on_target_delete>
			</field>
			<field id="PowerModule" xsi:type="AttributeExternalField">
				<extkey_attcode>PowerModule</extkey_attcode>
				<target_attcode>PowerModule</target_attcode>
			</field>
			<field id="BatteryModule" xsi:type="AttributeExternalKey">
			<sql>batterymodule</sql>
			<default_value/>
			<is_null_allowed>true</is_null_allowed>
			<on_target_delete>DEL_AUTO</on_target_delete>
			</field>
			<field id="BatteryModule" xsi:type="AttributeExternalField">
				<extkey_attcode>BatteryModule</extkey_attcode>
				<target_attcode>BatteryModule</target_attcode>
			</field>
		</fields>
		<methods/>
      <presentation>
        <details>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="PowerModule">
              <rank>75</rank>
            </item>
			<item id="BatteryModule">
              <rank>80</rank>
            </item>
            <item id="serialnumber">
              <rank>85</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
            <item id="description">
              <rank>130</rank>
            </item>
            <item id="contacts_list">
              <rank>140</rank>
            </item>
            <item id="documents_list">
              <rank>150</rank>
            </item>
            <item id="tickets_list">
              <rank>160</rank>
            </item>
            <item id="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
          </items>
        </details>
        <search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="brand_id">
              <rank>60</rank>
            </item>
            <item id="model_id">
              <rank>70</rank>
            </item>
            <item id="PowerModule">
              <rank>75</rank>
            </item>
			<item id="BatteryModule">
              <rank>80</rank>
            </item>
            <item id="serialnumber">
              <rank>85</rank>
            </item>
            <item id="asset_number">
              <rank>90</rank>
            </item>
            <item id="move2production">
              <rank>100</rank>
            </item>
            <item id="purchase_date">
              <rank>110</rank>
            </item>
            <item id="end_of_warranty">
              <rank>120</rank>
            </item>
          </items>
        </search>
        <list>
          <items>
            <item id="org_id">
              <rank>10</rank>
            </item>
            <item id="status">
              <rank>20</rank>
            </item>
            <item id="business_criticity">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="brand_id">
              <rank>50</rank>
            </item>
            <item id="model_id">
              <rank>60</rank>
            </item>
            <item id="serialnumber">
              <rank>70</rank>
            </item>
          </items>
        </list>
      </presentation>
	</class>
  </classes>
  <menus>
    <menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="112" xsi:type="DashletBadge" _delta="define">
              <rank>11</rank>
              <class>PowerModule</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
	<menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="113" xsi:type="DashletBadge" _delta="define">
              <rank>12</rank>
              <class>BatteryModule</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
	<menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
	<definition>
      <cells>
        <cell id="0" _delta="must_exist">
          <dashlets>
            <dashlet id="114" xsi:type="DashletBadge" _delta="define">
              <rank>13</rank>
              <class>UPS</class>
            </dashlet>
          </dashlets>
        </cell>
      </cells>
    </definition>
	</menu>
  </menus>
    <profiles>
    </profiles>
</itop_design>

#18

Еще наверное мне нужно

<field id="name" xsi:type="AttributeLinkedSet">

Пытаюсь дописать дальше)


#19

Внимательно смотри на теги внутри AttributeExternalKey. Где target_class, где filter?

AttributeExternalField нужен для того, чтобы в объект, в котором он создан, протаскивать атрибуты объекта, на который ссылается соответствующий AttributeExternalKey. Например, в объект UPS можно вытащить модель батареи.

AtributeLinkedSet нужно использовать в батарее и силовом модули, чтобы отобразить вкладку с ссылающимися на них UPS.


#20
<target_class>name</target_class>

Класс объекта к которому ссылается внешний ключ.

<filter>SELECT Location AS L WHERE L.org_id = :this->org_id</filter>

OQL выборка определенных объектов к которым ссылается внешний ключ. Используйте: this -> name чтобы сослаться на значение в текущем объекте.
Не совсем понятно как сделать запрос в filter.
Попробую написать код. Выложу здесь


#21
    <target_class>PowerModule</target_class>
    <filter>SELECT PowerModule</filter>

Позволит выбирать любой объект PowerModule.


#22

Во время установки модуля появилась ошибка на 40%

Declaration of UPS: attempting to redeclare the inherited attribute ‘PowerModule’, originaly declared in UPS

Добавил в секцию ExternalKey ваш код

<target_class>PowerModule</target_class>
<filter>SELECT PowerModule</filter>

#23

Проблема не в моем коде, а в том, что у вас два поля объявляются с одним и тем же идентификатором PowerModule.


#24
        <item id="PowerModule">
          <rank>75</rank>
        </item>

вот тут похоже)


#25

Вот тут:

<field id="PowerModule" xsi:type="AttributeExternalKey">
  <sql>powermodule</sql>
  <default_value/>
  <is_null_allowed>true</is_null_allowed>
  <on_target_delete>DEL_AUTO</on_target_delete>
</field>
<field id="PowerModule" xsi:type="AttributeExternalField">
  <extkey_attcode>PowerModule</extkey_attcode>
  <target_attcode>PowerModule</target_attcode>
</field>
```

#26

Какие присутствуют связи между классом сервер и Network Interfaces.
У класса Server есть вкладка Network Interfaces (вероятно AttributeLinkedSet).

Я хочу добавить такую же вкладку к классу сервер, но только с физическими жесткими дисками.
AttributeExternalKey здесь не подходит.
Не могли бы вы подсказать с каким типом поле здесь необходимо использовать?


Кастомизация пользовательского портала
#27