本帖最后由 adminlily 于 2020-12-14 16:33 编辑
语法添加XML代码
该教程将说明如何扩展其他教程中提供的XML以使其与iTop XML树结构.
为了使其可读,我们使用了一个真实的示例,该示例修改了用户门户在创建新请求时显示可用服务和服务子类别的方式。默认情况下,iTop将它们显示在列表中,并且我们将变更将其默认显示为树结构。
简化的语法
为了提高教程的可读性并突出显示需要更改的XML节点,将在简化路径语法中提供周围的XML结构。
- 每个级别由
- itop_design是唯一可能的顶级标签,有时在语法样例中可能会省略它,但在XML文件中不要忽略它。
- 末尾带有s的标签通常是集合
- 在集合下,您通常检索不带s且具有ID以区分节点的相同标签
- brick @ toto表示<brick id =“ toto”>
这是此示例的最短语法,其中仅需要修改一个节点:
[ ttps://www.itophub.io/wiki/page?do=export_code&id=2_7_0%3Acustomization%3Ainsert-xml&codeblock=0]itop_design / module_designs / module_design@itop-portal / bricks / brick@services / browse_modes[/url] <default _delta="redefine">tree</default>
无需打开XML标记的每个级别然后一个接一个地关闭它们,我们只需提供一个表示树结构的单个字符串,并将其放在代码块的标题中即可。
通常,它将减少压缩以提高可读性:
[ ttps://www.itophub.io/wiki/page?do=export_code&id=2_7_0%3Acustomization%3Ainsert-xml&codeblock=1]itop_design / module_designs / module_design@itop-portal / bricks[/url] <brick id="services">
<browse_modes>
<default _delta="redefine">tree</default>
</browse_modes>
</brick>
完整的XML结构
现在,这就是您需要将上述块扩展为iTop所需的完整XML结构的方式
[ ttps://www.itophub.io/wiki/page?do=export_code&id=2_7_0%3Acustomization%3Ainsert-xml&codeblock=2]itop_design / module_designs / module_design@itop-portal / bricks / brick@services / browse_modes[/url] <!-- block content -->
应该翻译成:
<?xml version="1.0" encoding="UTF-8"?>
<itop_design version="1.6">
<module_designs>
<module_design id="itop-portal">
<bricks>
<brick id="services">
<browse_modes>
<!-- Insert here the block content -->
</browse_modes>
</brick>
</bricks>
</module_design>
</module_designs>
</itop_design>
同样不是简化的语法的一部分,这2行必须记录在顶部
<?xml version="1.0" encoding="UTF-8"?><itop_design version="1.6">
版本=“ 1.6”对应于您的扩展程序所需的最小iTop XML版本。
通过将iTop版本的第一个数字删除1,可以从iTop版本猜到XML版本,直到iTop 2.6为止。
- 示例:所有iTop 2.6.x版本都使用1.6的XML版本
- 如果您使用XML标签,例如在iTop 2.5中添加的XML。那么不要将XML版本放在1.5以下
如果使用_delta =“ define”,则在树结构上方的某个位置设置_delta =“ must_exist”更安全。
测试它
将简化的XML扩展为完整的所需结构后,将其复制到扩展名的文件datamodel.my-extension.xml(my-extension是您的真实扩展名)中,然后运行安装程序或工具包以查看结果。
添加PHP代码
对于插入方法,只能在类或模块中的2个位置进行。
- 对于类,我们将仅在框标题中提供需要在其中声明方法的类:class:UserRequest
- 对于模块,不存在特定的语法。
现有类的方法
本部分说明如何在类上定义和覆盖PHP方法。
- 多个教程将告诉您在类上编写PHP方法,以在iTop中实现新行为。
- 他们甚至可以为您提供确切的PHP代码,
- 但是他们不会解释如何将PHP代码插入iTop XML结构中。
- 这项技术与方法本身无关,正是我们将要解释的内容
- 为了使它不那么抽象,我们使用一个真实的示例:
所使用的示例摘自[ ttps://www.itophub.io/wiki/page?id=2_7_0%3Acustomization%3Aadd-counter]复杂的用例[/url],这里我们只看一下用XML声明PHP方法
简化的语法
在标题框中,您将找到需要在其中声明方法的类。例如。 class:UserRequest
[ ttps://www.itophub.io/wiki/page?do=export_code&id=2_7_0%3Acustomization%3Ainsert-xml&codeblock=5]class:UserRequest[/url]
public function IncrementCounter($sAttCode, $iIncrement=1)
{
// Defensive programming, ensure that the field code is valid on current class
if (MetaModel::IsValidAttCode(($this), $sAttCode))
{
$iNew = $this->Get($sAttCode) + $iIncrement;
$this->Set($sAttCode, $iNew);
}
return true;
}
在粘贴到文件datamodel.my-extension.xml中之前,必须先扩展PHP代码。
完整的XML代码
这是必须如何消耗的:
<?xml version="1.0" encoding="UTF-8"?>
<itop_design version="1.3">
<classes>
<!-- the class name is found in the title of the simplified syntax box -->
<class id="UserRequest" _delta="must_exist">
<methods>
<!-- any 'id' could work, but easier to remember if equal to function name
-->
<method id="IncrementCounter" _delta="define">
<static>false</static>
<access>public</access>
<!-- comment is optional -->
<comment><![CDATA[
/**
* $sAttCode should be a valid field code of the UserRequest class of type Integer
or Decimal
* $iIncrement must be an integer
*/
]]></comment>
<code><![CDATA[
public function IncrementCounter($sAttCode, $iIncrement=1)
{
// Defensive programming, ensure that the field code is valid on current class
if (MetaModel::IsValidAttCode(get_class($this), $sAttCode))
{
$iNew = $this->Get($sAttCode) + $iIncrement;
$this->Set($sAttCode, $iNew);
}
return true;
}
]]></ code> <!-- remove the blank between </ and code (wiki limitation)
-->
</method>
</methods>
</class>
</classes>
</itop_design>
有关如何解码的一些详细信息:
资源 | 应该翻译成… | 公众职能增量计算器() | <access>public</access> | 受保护的职能… | <access>protected</access> | 公众职能… | <static>false</static> | 公众静态职能… | <static>true</static> | 公众职能增量计数器 | <method id=“IncrementCounter”> |
风险性
定义DBObject可重写方法之一时,请注意,它可能已在标准iTop数据模型中完成。如果是这种情况,在setup/toolkit编译时,当您使用_delta =“ define”添加该方法时,如果该方法已经存在,则将失败。在这种情况下,您可以执行“重新定义”,但是镜像现有代码,否则将破坏iTop的当前行为。
特定于ITSM设计器
如果满足以下条件,则必须使用arguments标签:
- 您的扩展程序将被加载到ITSM Designer中
- AND方法必须由转换上的功能调用
[ ttps://www.itophub.io/wiki/page?do=export_code&id=2_7_0%3Acustomization%3Ainsert-xml&codeblock=7]itop_design / classes / class@UserRequest / methods[/url]
<method id="IncrementCounter" _delta="define">
< ... >
<arguments>
<argument id="1">
<mandatory>true</mandatory>
<type>attcode</type>
</argument>
<argument id="2">
<mandatory>false</mandatory>
<type>int</type>
</argument>
</arguments>
</method>
在新的PHP类中
最简单的方法是将此代码放入扩展的文件main.my-extension.php中。
但是也可以将其放在XML结构中:
[ ttps://www.itophub.io/wiki/page?do=export_code&id=2_7_0%3Acustomization%3Ainsert-xml&codeblock=8]itop_design / snippets[/url]
<snippet id="ScheduledStart" _delta="define"> <placement>module</placement>
<module>itop-request-mgmt</module>
<rank>200</rank>
<content><![CDATA[
/* enter here the code with class definition and methods */
]]></content>
</snippet>
|