创建一个模块(教程)
这是一个分步教程,演示如何create一个简单的Zabbix前端模块。
您可以将该模块的所有文件下载为ZIP压缩包:MyAddress.zip。
你将构建的内容
在本教程中,你将首先构建一个前端模块,添加新的 我的地址 菜单部分, 然后将其转换为一个更高级的前端模块,使其向 https://api.seeip.org 发出 HTTP 请求, 并在新创建的 我的地址 菜单部分中的新页面上显示响应内容,即你的计算机的 IP 地址。 完成后的模块如下所示:

第一部分 - 新的菜单部分
向 Zabbix 前端添加空白模块
-
在 Zabbix 前端安装目录的 modules 目录中创建一个名为 MyAddress 的目录(例如,zabbix/ui/modules)。
-
创建一个包含基本模块元数据的 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."
}
- 在 Zabbix 前端中,转到 Administration > General > Modules 部分,然后单击 Scan directory 按钮。

- 在列表中找到新模块 My IP Address,然后单击“Disabled”超链接,将模块状态从“Disabled”更改为“Enabled”(如果列表中未显示该模块,请参阅故障排除部分)。

该模块现已在前端中注册。 但是,它目前尚不可见,因为您仍需定义模块功能。 向模块目录添加内容后,刷新页面即可立即在 Zabbix 前端中看到更改。
创建菜单部分
- 在 MyAddress 目录中创建 Module.php 文件。
此文件实现一个新的 Module 类,该类扩展默认的 CModule 类。 Module 类会在主菜单中插入一个新的 My Address 菜单部分。
setAction() 方法指定单击菜单部分时要执行的操作。 首先,您可以使用预定义的操作 userprofile.edit,该操作将打开 User profile 页面。 在本教程的第三部分中,您将学习如何创建自定义操作。
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'(打开 Monitoring > Problems)或 'report.status'(打开 System information 报告)。
- 刷新 Zabbix 前端。 现在,Zabbix 主菜单底部会显示新的 My Address 部分。 单击 My Address,打开 User profile 页面。

第二部分 - 更改菜单部分位置
在本部分中,您将把 My Address 菜单部分移动到 Monitoring 部分,然后向其中添加嵌套菜单。 完成后,用户将能够从 Monitoring > My Address 菜单部分访问两个子菜单页面。
- 打开并编辑 Module.php 文件。
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')
->findOrAdd(_('Monitoring'))
->getSubmenu()
->insertAfter(_('Discovery'),
(new CMenuItem(_('My Address')))->setAction('userprofile.edit')
);
}
}
- 刷新 Zabbix 前端。 展开 Monitoring 菜单部分,您会看到 My address 部分现在位于 Discovery 部分下方。

- 要向 My Address 菜单部分添加嵌套页面,请再次打开并编辑 Module.php 文件。
此步骤将创建两个子部分:
- External IP,执行新的 'my.address' 操作,该操作将在后续步骤中定义;
- User profile,执行预定义的 'userprofile.edit' 操作以打开 User profile 页面。
请注意,对于嵌套菜单,除了前面步骤中使用的类之外,还需要使用 CMenu 类。
ui/modules/MyAddress/Module.php
<?php
namespace Modules\MyAddress;
use Zabbix\Core\CModule,
APP,
CMenu,
CMenuItem;
class Module extends 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')
])
)
);
}
}
- 刷新 Zabbix 前端。 您会看到 My address 菜单部分现在包含一个三级菜单,其中有两个页面 - External IP 和 User profile。

第 III 部分 - 模块操作
一个操作由两个文件实现:actions/MyAddress.php 和 views/my.address.php。 actions/MyAddress.php 文件负责实现业务逻辑,而 views/my.address.php 文件负责视图。
-
在 MyAddress 目录中创建 actions 目录。
-
在 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);
}
}
-
在 MyAddress 目录中创建新的 views 目录。
-
在 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();
- 必须在 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"
}
}
}
- 刷新 Zabbix 前端。 点击 My address > External IP,即可查看计算机的 IP 地址。
