创建模块(教程)

这是一个分步教程,展示了如何创建一个简单的 Zabbix 前端模块。 您可以将此模块的所有文件下载为 ZIP 存档:MyAddress.zip

您将构建的内容

在本教程中,您将首先构建一个前端模块,该模块添加一个新的 我的地址 菜单部分

然后将其转换为 更高级 前端模块,该模块向 https://api.seeip.org 发出 HTTP 请求

并在新建的 我的地址 菜单部分的新页面上显示响应 - 您计算机的 IP 地址。

完成的模块将如下所示:

第一部分 - 新建菜单部分

将空白模块添加到Zabbix前端

  1. 在Zabbix前端安装的modules目录中创建一个MyAddress目录(例如,zabbix/ui/modules)。

  2. 创建一个包含基本模块元数据的manifest.json文件(参见支持的parameters描述)。

ui/modules/MyAddress/manifest.json

{
           "manifest_version": 2.0,
           "id": "my-address",
           "name": "My IP Address",
           "version": "1.0",
           "namespace": "MyAddress",
           "description": "My External IP Address."
       }
  1. 在Zabbix前端,导航至Administration → General → Modules部分,然后点击Scan directory按钮。

  1. 在列表中找到新模块My IP Address,点击“Disabled”超链接以将模块状态从“Disabled”更改为“Enabled”(如果未列出模块,请参阅troubleshooting部分)。

模块现在已在前端注册。但是,它仍然不可见,因为您还需要定义模块功能。 一旦您向模块目录添加内容,刷新页面后将立即在Zabbix前端看到更改。

创建菜单部分
  1. MyAddress 目录中创建一个 Module.php 文件。

此文件实现了一个新的 Module 类,该类扩展了默认的 CModule 类。

Module 类将在主菜单中插入一个新的 My Address 菜单部分。

setAction() 方法指定单击菜单部分时要执行的操作。

首先,您可以使用预定义操作 userprofile.edit,它将打开 User profile 页面。 在本教程的 第 III 部分 中,您将学习如何创建自定义操作。

ui/modules/MyAddress/Module.php

<?php
       
       namespace Modules\MyAddress;
       
       use Zabbix\Core\CModule,
       APP,
       CMenuItem;
       
       class Module extends CModule {
       
       public function init(): void {
       APP::Component()->get('menu.main')
       ->add((new CMenuItem(_('My Address')))
       ->setAction('userprofile.edit'));
       }
       }

您可以将 'userprofile.edit' 替换为其他操作,例如 'charts.view'(打开自定义图表)、'problems.view'(打开 监控 → 问题)或 'report.status'(打开 系统信息 报告)。

  1. 刷新 Zabbix 前端。现在 Zabbix 主菜单底部有一个新的 我的地址 部分。 单击 我的地址 打开 用户资料 页面。

第二部分 - 调整菜单位置

在此部分中,您将把 我的地址 菜单部分移动到 监控 部分,然后向其添加嵌套菜单。 因此,用户将能够从 监控 → 我的地址 菜单部分访问两个子菜单页面。

  1. 打开并编辑 Module.php 文件。

ui/modules/MyAddress/Module.php

<?php
       
       命名空间 Modules\MyAddress;
       
       使用 Zabbix\Core\CModule,
       APP,
       CMenuItem;
       
       class Module extends CModule {
       
       public function init(): void {
       APP::Component()->get('menu.main')
       ->findOrAdd(_('Monitoring'))
       ->getSubmenu()
       ->insertAfter(_('Discovery'),
       (new CMenuItem(_('My Address')))->setAction('userprofile.edit')
       );
       }
       }
  1. 刷新 Zabbix 前端。展开 Monitoring 菜单部分,并观察 My address 部分现在位于 Discovery 部分下方。

  1. 要将嵌套页面添加到 我的地址 菜单部分,请再次打开并编辑 Module.php 文件。

此步骤将创建两个子部分:

  • 外部 IP 执行新的“my.address”操作,该操作将在后续步骤中定义;
  • 用户配置文件 执行预定义的“userprofile.edit”操作以打开 用户配置文件 页面。

请注意,对于嵌套菜单,除了前面步骤中使用的类之外,您还需要使用 CMenu 类。

ui/modules/MyAddress/Module.php

<?php
       
       命名空间 Modules\MyAddress;
       
       使用 Zabbix\Core\CModule,
       APP
       CMenu,
       CMenuItem;
       
       class Module 扩展 CModule {
       
       public function init(): void {
       APP::Component()->get('menu.main')
       ->findOrAdd(_('Monitoring'))
       ->getSubmenu()
       ->insertAfter(_('Discovery'),
       (new CMenuItem(_('My Address')))->setSubMenu(
       new CMenu([
       (new CMenuItem(_('External IP')))->setAction('my.address'),
       (new CMenuItem(_('User profile')))->setAction('userprofile.edit')
       ])
       )
       );
       }
       }
  1. 刷新 Zabbix 前端。请注意,我的地址菜单部分现在包含一个三级菜单,其中包含两个页面 - 外部 IP用户配置文件

第三部分 - 模块操作

操作在两个文件中实现 - actions/MyAddress.phpviews/my.address.phpactions/MyAddress.php 文件负责业务逻辑实现,而 views/my.address.php 文件负责视图。

  1. MyAddress 目录中创建一个目录 actions

  2. actions 目录中创建一个 MyAddress.php 文件。

操作逻辑将在 MyAddress 类中定义。 此操作类将实现四个函数:init()checkInput()checkPermissions()doAction()。 当请求操作时,Zabbix 前端会调用 doAction() 函数。 此函数负责模块的业务逻辑。

数据必须组织为关联数组。 该数组可以是多维的,并且可以包含视图所需的任何数据。

ui/modules/MyAddress/actions/MyAddress.php

<?php
       
       namespace Modules\MyAddress\Actions;
       
       use CController,
       CControllerResponseData;
       
       class MyAddress extends CController {
       
       public function init(): void {
       $this->disableCsrfValidation();
       }
       
       protected function checkInput(): bool {
       return true;
       }
       
       protected function checkPermissions(): bool {
       return true;
       }
       
       protected function doAction(): void {
       $data = ['my-ip' => file_get_contents("https://api.seeip.org")];
       $response = new CControllerResponseData($data);
       $this->setResponse($response);
       }
       }
  1. MyAddress 目录中创建一个新目录 views

  2. views 目录中创建一个 my.address.php 文件并定义模块视图。

请注意,变量 $data 可在视图中使用,无需特别定义。 框架会自动将关联数组传递给视图。

ui/modules/MyAddress/views/my.address.php

<?php
       
       (new CHtmlPage())
       ->setTitle(_('The HTML Title of My Address Page'))
       ->addItem(new CDiv($data['my-ip']))
       ->show();
  1. 模块操作必须在 manifest.json 文件中注册。打开 manifest.json 并添加一个新对象 actions,其中包含:
  • 操作键,操作名称以小写字母 (a-z) 书写,单词之间用点分隔(例如,my.address);
  • 操作类名称(MyAddress)作为my.address对象的class键的值;
  • 操作视图名称(my.address)作为my.address对象的view键的值。

ui/modules/MyAddress/manifest.json

{
       "manifest_version": 2.0,
       "id": "my-address",
       "name": "My IP Address",
       "version": "1.0",
       "namespace": "MyAddress",
       "description": "My External IP Address.",
       "actions": {
       "my.address": {
       "class": "MyAddress",
       "view": "my.address"
       }
       }
       }
  1. 刷新 Zabbix 前端。单击 我的地址 → 外部 IP 查看您计算机的 IP 地址。

MyAddressMyAddressMyAddressMyAddress