这是一个分步教程,展示了如何create一个简单的Zabbix前端模块。 您可以下载该模块的所有文件作为ZIP存档: MyAddress.zip。
在本教程中,您将首先构建一个前端模块,用于添加新的我的地址菜单部分 然后将其转换为一个更高级的前端模块,该模块会向https://api.seeip.org发起HTTP请求 并将响应结果——您计算机的IP地址——显示在新创建的我的地址菜单部分的新页面上。 以下是完成后的模块效果:
在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前端看到变更。
该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报告)
在本部分中,您将把My Address菜单项移至Monitoring部分,然后为其添加嵌套菜单。 最终用户将能够通过Monitoring → My Address菜单项访问两个子菜单页面。
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')
);
}
}
此步骤将创建两个子项:
请注意,对于嵌套菜单,除了前面步骤使用的类外,还需要使用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')
])
)
);
}
}
一个动作通过两个文件实现 - 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();
actions
,其中包含:my.address
);MyAddress
)作为 my.address
object 中 class
键的值;my.address
)作为 my.address
object 中 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"
}
}
}