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

第一部分 - 新的菜单部分
向 Zabbix 前端添加空白模块
-
在Zabbix前端安装目录的modules文件夹下创建MyAddress目录(例如zabbix/ui/modules)。
-
创建包含基础模块元数据的manifest.json file(参见支持的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."
}
- 在Zabbix前端,进入管理 → 常规 → 模块部分,点击扫描目录按钮。

- 在列表中找到新模块My IP Address,点击"Disabled"超链接将模块状态从"Disabled"改为"Enabled"(如果模块未列出,请参阅安装章节)。

模块现已在前端注册。但由于尚未定义模块功能,当前仍不可见。 当您向模块目录添加内容后,刷新页面即可立即在Zabbix前端看到变更。
创建菜单部分
- 在MyAddress目录下创建Module.php file
该file实现了一个继承默认CModule类的新Module类 Module类将在主菜单中插入一个新的My Address菜单项
setAction()方法指定了点击菜单项时要执行的操作 开始时可以使用预定义操作userprofile.edit,这将打开User profile页面 在本教程的第三部分中,您将学习如何create自定义操作
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 file文件。
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 file文件。
此步骤将创建两个子项:
- 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。

第三部分 - 模块动作
一个动作通过两个文件实现 - actions/MyAddress.php 和 views/my.address.php. actions/MyAddress.php file 负责业务逻辑实现,而 views/my.address.php file 负责视图展示.
-
在 MyAddress 目录下创建 actions 子目录.
-
在 actions 目录中创建 MyAddress.php file.
动作逻辑将在 MyAddress 类中定义. 该动作类需实现四个函数: init(), checkInput(), checkPermissions() 和 doAction(). 当请求该动作时,Zabbix前端会调用 doAction() 函数. 此函数负责模块的业务逻辑.
数据必须组织为关联array. 该array可以是多维的,并可包含视图所需的任何数据.
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 file 并定义模块视图.
注意变量 $data 无需特别定义即可在视图中使用.
框架会自动将关联array传递给视图.
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 file 中注册. 打开 manifest.json 并添加新的object
actions,其中包含:
- 动作键名使用小写字母(a-z)书写,单词间用点号分隔(例如
my.address); - 动作类名(
MyAddress)作为my.addressobject 中class键的值; - 动作视图名(
my.address)作为my.addressobject 中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地址.
