Как можно отредактировать системные КЕ?

Да, Павел, Вы правы. Я немного запутался.

Владимир, спасибо!
С подключением вкладок разобрался + -.

Может кому в будущем полезен будет мой пример вывода КЕ VLAN во вкладку КЕ Server:

 <fields>
     <field id="VLAN Settings" xsi:type="AttributeLinkedSet" _delta="define">
     	<linked_class>VLAN</linked_class>
     	<ext_key_to_me>org_id</ext_key_to_me>
     	<edit_mode>in_place</edit_mode>
     	<tracking_level>all</tracking_level>
     	<count_min>0</count_min>
     	<count_max>0</count_max>
     </field>
 </fields>

плюс вывод на экран:

<items>
  <item id="VLAN Settings" _delta="define">
        		<rank>5</rank>
  </item>
</items>

Плохая идея задавать такие id.

Обрати внимание, как называются системные вкладки. Красивое название нужно добавлять в файлах локализации.

Спасибо. По поводу id-шника с пробелом вчера уже понял, что это корректно не работает. Вкладка появляется, но сама кнопка добавления VLAN не появляется.
Убрал пробел и все заработало (но только на кастомном модуле).

А вот при попытке добавить вкладку VLAN в КЕ Server обнаружил такой момент, что после добавления VLAN во вкладке и сохранения записи КЕ Server возникает ошибка:

Не удается сохранить объект : No result for the single row query: 'SELECT DISTINCT Organization_organization.id AS Organizationid, Organization_organization.name AS Organizationname, Organization_organization.code AS Organizationcode, Organization_organization.status AS Organizationstatus, Organization_organization.parent_id AS Organizationparent_id, Organization_parent_id_organization.name AS Organizationparent_name, Organization_organization.deliverymodel_id AS Organizationdeliverymodel_id, DeliveryModel_deliverymodel_id_deliverymodel.name AS Organizationdeliverymodel_name, CAST(CONCAT(COALESCE(Organization_organization.name, ‘’)) AS CHAR) AS Organizationfriendlyname, COALESCE((Organization_organization.status = ‘inactive’), 0) AS Organizationobsolescence_flag, Organization_organization.obsolescence_date AS Organizationobsolescence_date, CAST(CONCAT(COALESCE(Organization_parent_id_organization.name, ‘’)) AS CHAR) AS Organizationparent_id_friendlyname, COALESCE((Organization_parent_id_organization.status = ‘inactive’), 0) AS Organizationparent_id_obsolescence_flag, CAST(CONCAT(COALESCE(DeliveryModel_deliverymodel_id_deliverymodel.name, ‘’)) AS CHAR) AS Organizationdeliverymodel_id_friendlyname FROM organization AS Organization_organizationLEFT JOIN organization AS Organization_parent_id_organization ON Organization_organization.parent_id = Organization_parent_id_organization.idLEFT JOIN deliverymodel AS DeliveryModel_deliverymodel_id_deliverymodel ON Organization_organization.deliverymodel_id = DeliveryModel_deliverymodel_id_deliverymodel.id WHERE (Organization_organization.id = 3) ’

Обнаружил, что в самой КЕ VLAN при добавлении записи присутствуют 3 поля:
Тег VLAN
Организация
Описание

А во вкладке VLAN, которую я добавил в КЕ Server отображаются только 2 поля:
Тег VLAN
Описание
А поле “Организация” отсутствует.

Видимо, я опять что-то с классами путаю.

Тут должно быть поле, в котором лежит id текущего объекта (в котором вкладка добавляется).
Пример: Person ссылается на Location через поле Person.location_id. При добавлении вкладки с персонами Location.persons_list внутри <ext_key_to_me> будет указано location_id.

Владимир, спасибо за наводку!
Методом тыка нашел решение.
Исходя из Вашего примера пришел к пониманию, что прямой связи между Server и VLAN нет. А между Person и Location она есть.

Увидел в xml /path/to/itop/datamodels/2.x/itop-config-mgmt/datamodel.itop-config-mgmt.xml пример как записывается Внешний ключ и временно там же по аналогии прописал его для КЕ VLAN, чтобы связать КЕ VLAN с КЕ Server:

<field id="vlan2_id" xsi:type="AttributeExternalKey">
      <sql>vlan2_id</sql>
      <target_class>VLAN</target_class>
      <is_null_allowed>true</is_null_allowed>
      <on_target_delete>DEL_MANUAL</on_target_delete>
      <allow_target_creation>false</allow_target_creation>
 </field>

А для КЕ Server прописал:

   <field id="vlan_list" xsi:type="AttributeLinkedSet" _delta="define">
     	<linked_class>VLAN</linked_class>
     	<ext_key_to_me>vlan2_id</ext_key_to_me>
     	<tracking_level>all</tracking_level>
        <edit_mode>in_place</edit_mode>
   </field>

В итоге получил работающий вариант вкладки VLAN в КЕ Server.

Коллеги, подскажите, в чем может быть проблема в нижеописанном случае.

Как я описал в этой теме ранее, я добавил вкладку VLAN в КЕ Server. Это все я делал на тестовом iTop (v.2.6.0-4294) и все заработало.
Сейчас решил эти настройки перенести на боевой iTop (той же версии, что и тест), но на бою с этим возникла проблема.

Когда в КЕ Server я добавляю запись во вкладке VLAN и пробую сохранить запись, то получаю сообщение об ошибке " Не удается сохранить объект : Unexpected value for attribute ‘vlan2_id’: Target object not found (VLAN::241) ".

Соответственно, запись сохранить не получается.
Перепроверил xml-ки модулей, через которые я добавляю вкладку VLAN в КЕ Server на тесте и на бою несколько раз - все один в один.

Подскажите, в чем может быть загвоздка?
Может ли это быть связано с разными версиями PHP и БД?
На тесте версии PHP 7.2.15-0ubuntu0.18.04.2, MySQL 5.7.25-0ubuntu0.18.04.2
На бою версии PHP 7.2.10-0ubuntu0.18.04.1, MySQL 5.7.23-0ubuntu0.18.04.1

Уточнение:
в теге edit_mode я заменил значение на add_remove, так как во вкладке VLAN мне нужно было выбирать уже заведенные в модуле VLAN элементы:

<field id="vlan_list" xsi:type="AttributeLinkedSet" _delta="define">
         	<linked_class>VLAN</linked_class>
         	<ext_key_to_me>vlan2_id</ext_key_to_me>
         	<edit_mode>add_remove</edit_mode>
         	<tracking_level>all</tracking_level>
</field>

Решено.
Добавил вкладку не через xsi:type=“AttributeLinkedSet”, а через xsi:type=“AttributeLinkedSetIndirect” по аналогии с системными вкладками, описанными в /path/to/itop/datamodels/2.x/itop-config-mgmt/datamodel.itop-config-mgmt.xml, создав дополнительный класс lnkServerToVLAN.

вобщем разобрался я что мне требовалось сделать, все как и говорил выше abb-user работает, вот только почему никто подробности не пишет, вот думаю стоит тут это все описывать иль нет

1 лайк

Ну конечно стоит! Форум именно так и работает :slight_smile:

Как тут выложить код как есть, форум его коверкает.

Выложить код либо скрином, либо с большими мучениями :slight_smile:
Тоже по 10 раз редактировать приходилось)

Не понимаю, какие у вас мучения. Копи-пастим код в редактор, выделяем, жмём кнопку </>!

<class id="Organization" _delta="define">
  <parent>cmdbAbstractObject</parent>
  <properties>
    <comment><![CDATA[/**
 * Persistent classes for a CMDB
 *
 * @copyright   Copyright (C) 2010-2017 Combodo SARL
 * @license     http://opensource.org/licenses/AGPL-3.0
 */]]></comment>
    <category>bizmodel,searchable,structure</category>
    <abstract>false</abstract>
    <key_type>autoincrement</key_type>
    <db_table>organization</db_table>
    <db_key_field>id</db_key_field>
    <db_final_class_field/>
    <naming>
      <attributes>
        <attribute id="name"/>
      </attributes>
    </naming>
    <display_template/>
    <icon>images/building.png</icon>
    <reconciliation>
      <attributes>
        <attribute id="name"/>
        <attribute id="code"/>
      </attributes>
    </reconciliation>
    <obsolescence>
      <condition><![CDATA[status = 'inactive']]></condition>
    </obsolescence>
  </properties>
  <fields>
    <field id="name" xsi:type="AttributeString">
      <sql>name</sql>
      <default_value/>
      <is_null_allowed>false</is_null_allowed>
    </field>
    <field id="code" xsi:type="AttributeString">
      <sql>code</sql>
      <default_value/>
      <is_null_allowed>true</is_null_allowed>
    </field>
    <field id="status" xsi:type="AttributeEnum">
      <values>
        <value id="active">active</value>
        <value id="inactive">inactive</value>
      </values>
      <sql>status</sql>
      <default_value>active</default_value>
      <is_null_allowed>true</is_null_allowed>
      <display_style>list</display_style>
    </field>
    <field id="parent_id" xsi:type="AttributeHierarchicalKey">
      <sql>parent_id</sql>
      <is_null_allowed>true</is_null_allowed>
      <on_target_delete>DEL_MANUAL</on_target_delete>
    </field>
    <field id="parent_name" xsi:type="AttributeExternalField">
      <extkey_attcode>parent_id</extkey_attcode>
      <target_attcode>name</target_attcode>
    </field>
    <field id="overview" xsi:type="AttributeDashboard">
        <is_user_editable>true</is_user_editable>
        <definition>
          <layout>DashboardLayoutTwoCols</layout>
          <auto_reload>
            <enabled>false</enabled>
            <interval>300</interval>
          </auto_reload>
          <cells>
            <cell id="0">
              <rank>0</rank>
              <dashlets>
                <dashlet id="11" xsi:type="DashletHeaderDynamic">
                  <rank>0</rank>
                  <title>Organization:Overview:FunctionalCIs</title>
                  <icon>itop-config-mgmt/images/server.png</icon>
                  <subtitle>Organization:Overview:FunctionalCIs:subtitle</subtitle>
                  <query>SELECT FunctionalCI WHERE org_id=:this-&gt;id</query>
                  <group_by>finalclass</group_by>
                  <values>NetworkDevice,Server,ApplicationSolution</values>
                </dashlet>
              </dashlets>
            </cell>
            <cell id="2">
              <rank>20</rank>
              <dashlets>
                <dashlet id="12" xsi:type="DashletObjectList">
                  <rank>0</rank>
                  <title>Organization:Overview:Users</title>
                  <query>SELECT Person AS p JOIN User AS u ON u.contactid=p.id WHERE p.org_id=:this-&gt;id</query>
                  <menu>true</menu>
                </dashlet>
              </dashlets>
            </cell>
            <cell id="9000">
              <rank>5</rank>
              <dashlets>
                <dashlet id="0" xsi:type="DashletEmptyCell">
                  <rank>0</rank>
                </dashlet>
              </dashlets>
            </cell>
          </cells>
        </definition>
    </field>
  </fields>
  <methods/>
  <presentation>
    <details>
      <items>
        <item id="name">
          <rank>10</rank>
        </item>
        <item id="code">
          <rank>20</rank>
        </item>
        <item id="status">
          <rank>30</rank>
        </item>
        <item id="parent_id">
          <rank>40</rank>
        </item>
        <item id="overview">
          <rank>50</rank>
        </item>
      </items>
    </details>
    <default_search>
      <items>
        <item id="name">
          <rank>10</rank>
        </item>
      </items>
    </default_search>
    <search>
      <items>
        <item id="name">
          <rank>10</rank>
        </item>
        <item id="code">
          <rank>20</rank>
        </item>
        <item id="status">
          <rank>30</rank>
        </item>
        <item id="parent_id">
          <rank>40</rank>
        </item>
      </items>
    </search>
    <list>
      <items>
        <item id="code">
          <rank>10</rank>
        </item>
        <item id="status">
          <rank>20</rank>
        </item>
        <item id="parent_id">
          <rank>30</rank>
        </item>
      </items>
    </list>
  </presentation>
</class>

Как изменить по умолчанию сортировку любого столбца КЕ?
По умолчанию сортировка по Названию, можно ли сделать по другому атрибуту?

Отвечаю, вначале класса есть такое:

<naming>
  <attributes>
    <attribute id="name"/>
  </attributes>
</naming>

Вот именно <attribute id="name"/> и отвечает за то что будет отображаться в первом столбце и сортироваться, вместо name можно написать любой другой атрибут.

Ответ не принимается))
Для сортировки есть специальный параметр order, который в документации следует сразу за naming!

Как редактировать матрицу разрешений в профиле пользователей?

Создал новый класс а он в разрешениях профиля: Configuration Manager стоит на Изменить - Нет. Где вообще эти разрешения хранятся?

Нашел, и оказывается все разрешения хранятся в …\datamodels\2.x\itop-profiles-itil\datamodel.itop-profiles-itil.xml
В файле прописывается, на какие группы классов стоит чтение , пакетное чтение, запись, пакетная запись, удаление и соответствующие им профили пользователей.
Все же я надеялся, что матрица разрешений редактируется из веб интерфейса, было бы куда более удобно.

Здравствуйте! я тоже впервые начал работать с iTop, есть такой вопрос, хочу доавить новое устройство, со связью с ПК, взял за тело другое похожее устройство, в xml-файле есть тэги:

          <dashlet id="99" xsi:type="DashletBadge" _delta="define">
            <rank>8</rank>
            <class>headphone</class>
          </dashlet>

Вот откуда взять id и rank?

вот полный текст xml-ки:

<constants>
  </constants>
  <classes>
    <class id="headphone" _delta="define">
      <parent>PhysicalDevice</parent>
      <properties>
        <category>bizmodel,searchable</category>
        <abstract>false</abstract>
        <key_type>autoincrement</key_type>
        <db_table>headphone</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/headphone.png</icon>
        <reconciliation>
          <attributes>
            <attribute id="name"/>
            <attribute id="org_id"/>
            <attribute id="organization_name"/>
          </attributes>
        </reconciliation>
      </properties>
      <fields>
<!--СПИСОК ПК-->
	<field id="pc_list" xsi:type="AttributeLinkedSetIndirect" _delta="define">
		<linked_class>lnkHeadPhoneToConnectableCI</linked_class>
		<ext_key_to_me>HeadPhone_id</ext_key_to_me>
        	<count_min>0</count_min>
        	<count_max>0</count_max>
        	<ext_key_to_remote>connectibleci_id</ext_key_to_remote>
	</field>
<!--СПИСОК ПК-->
<!--ТИП Гарнитуры-->
		<field id="HeadPhoneType" xsi:type="AttributeEnum" _delta="define">
		<values>
		  <value>Wireless</value>
		  <value>Wire</value>
		</values>
		<sql>HeadPhoneType</sql>
		<default_value/>
		<is_null_allowed>False</is_null_allowed>
		<display_style>list</display_style>
		</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="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="providercontracts_list">
              <rank>170</rank>
            </item>
            <item id="services_list">
              <rank>180</rank>
            </item>
<!--ПУБЛИКУЕМ PC_LIST-->
            <item id="pc_list">
             <rank>190</rank>
            </item>
<!--ПУБЛИКУЕМ PC_LIST-->
          </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="Model">
      <fields>
        <field id="type" xsi:type="AttributeEnum">
          <values>
            <value id="headphone" _delta="define">headphone</value>
          </values>
        </field>
      </fields>
    </class>
<!--КЛАСС СВЯЗЬ HeadPhone С ПОДКЛЮЧАЕМЫМ КЕ-->
    <class id="lnkHeadPhoneToConnectableCI" _delta="define">
      <parent>cmdbAbstractObject</parent>
      <properties>
        <is_link>1</is_link>
        <category>bizmodel</category>
        <abstract>false</abstract>
        <key_type>autoincrement</key_type>
        <db_table>lnkHeadPhoneToConnectableCI</db_table>
        <db_key_field>id</db_key_field>
        <db_final_class_field/>
        <naming>
          <attributes>
            <attribute id="connectibleci_id"/>
            <attribute id="HeadPhone_id"/>
          </attributes>
        </naming>
        <display_template/>
        <icon/>
        <reconciliation>
          <attributes>
            <attribute id="connectibleci_id"/>
            <attribute id="HeadPhone_id"/>
          </attributes>
        </reconciliation>
      </properties>
      <fields>
        <field id="connectibleci_id" xsi:type="AttributeExternalKey">
          <sql>connectibleci_id</sql>
          <target_class>ConnectableCI</target_class>
          <is_null_allowed>false</is_null_allowed>
          <on_target_delete>DEL_AUTO</on_target_delete>
        </field>
        <field id="HeadPhone_id" xsi:type="AttributeExternalKey">
          <sql>HeadPhone_id</sql>
          <target_class>headphone</target_class>
          <is_null_allowed>false</is_null_allowed>
          <on_target_delete>DEL_AUTO</on_target_delete>
        </field>
        </fields>
      <methods/>
      <presentation>
        <details>
          <items>
            <item id="connectibleci_id">
              <rank>10</rank>
            </item>
            <item id="HeadPhone_id">
              <rank>20</rank>
            </item>
          </items>
        </details>
        <search>
          <items>
            <item id="connectibleci_id">
              <rank>10</rank>
            </item>
            <item id="HeadPhone_id">
              <rank>20</rank>
            </item>
          </items>
        </search>
        <list>
          <items>
            <item id="connectibleci_id">
              <rank>10</rank>
            </item>
            <item id="HeadPhone_id">
              <rank>20</rank>
            </item>
          </items>
        </list>
      </presentation>
    </class>
<!--КЛАСС СВЯЗЬ HeadPhone С ПОДКЛЮЧАЕМЫМ КЭ-->
  </classes>
  <menus>
    <menu id="ConfigManagementOverview" xsi:type="DashboardMenuNode" _delta="must_exist">
      <definition>
        <cells>
          <cell id="2" _delta="must_exist">
            <dashlets>
              <dashlet id="99" xsi:type="DashletBadge" _delta="define">
                <rank>8</rank>
                <class>headphone</class>
              </dashlet>
            </dashlets>
          </cell>
        </cells>
      </definition>
    </menu>
  </menus>
  <user_rights>
    <groups>
    </groups>
    <profiles>
    </profiles>
  </user_rights>
</itop_design>