创建模块(教程)

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

您将构建的内容

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

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

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

完成的模块将如下所示:

第一部分 - 新建菜单部分

向 Zabbix 前端添加一个空白模块
  1. 在 Zabbix 前端安装的 modules 目录中创建一个目录 MyAddress(例如,zabbix/ui/modules)。

  2. 创建一个包含基本模块元数据的 manifest.json 文件(请参阅支持的 参数 的说明)。

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. 在列表中找到新模块 我的 IP 地址,然后单击“已禁用”超链接,将模块的状态从“已禁用”更改为“已启用”。

模块现已在前端注册。但是,它尚未显示,因为您仍需要定义模块功能。 将内容添加到模块目录后,刷新页面后,您将立即在 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