这是一个分步教程,展示了如何创建一个简单的 Zabbix 前端模块。 您可以将此模块的所有文件下载为 ZIP 存档:MyAddress.zip。
在本教程中,您将首先构建一个前端模块,该模块添加一个新的 我的地址 菜单部分
然后将其转换为 更高级 前端模块,该模块向 https://api.seeip.org 发出 HTTP 请求
并在新建的 我的地址 菜单部分的新页面上显示响应 - 您计算机的 IP 地址。
完成的模块将如下所示:
在 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 前端看到更改。
此文件实现了一个新的 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'
(打开 系统信息 报告)。
在此部分中,您将把 我的地址 菜单部分移动到 监控 部分,然后向其添加嵌套菜单。 因此,用户将能够从 监控 → 我的地址 菜单部分访问两个子菜单页面。
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')
);
}
}
此步骤将创建两个子部分:
请注意,对于嵌套菜单,除了前面步骤中使用的类之外,您还需要使用 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')
])
)
);
}
}
操作在两个文件中实现 - 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();
actions
,其中包含: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"
}
}
}
MyAddressMyAddressMyAddressMyAddress