创建一个模块(教程)

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

你将构建的内容

在本教程中,您将首先构建一个前端模块,用于添加新的我的地址菜单部分 然后将其转换为一个更高级的前端模块,该模块会向https://api.seeip.org发起HTTP请求 并将响应结果——您计算机的IP地址——显示在新创建的我的地址菜单部分的新页面上。 以下是完成后的模块效果:

第一部分 - 新的菜单部分

向 Zabbix 前端添加空白模块
  1. 在Zabbix前端安装目录的modules文件夹下创建MyAddress目录(例如zabbix/ui/modules)。

  2. 创建包含基础模块元数据的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."
       }
  1. 在Zabbix前端,进入管理 → 常规 → 模块部分,点击扫描目录按钮。

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

模块现已在前端注册。但由于尚未定义模块功能,当前仍不可见。 当您向模块目录添加内容后,刷新页面即可立即在Zabbix前端看到变更。

创建菜单部分
  1. MyAddress目录下创建Module.php file

该file实现了一个继承默认CModule类的新ModuleModule类将在主菜单中插入一个新的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报告)

  1. 刷新Zabbix前端。现在Zabbix主菜单底部会出现新的My Address项 点击My Address打开User profile页面

第二部分 - 菜单部分位置更改

在本部分中,您将把My Address菜单项移至Monitoring部分,然后为其添加嵌套菜单。 最终用户将能够通过Monitoring → My Address菜单项访问两个子菜单页面。

  1. 打开并编辑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')
                   );
           }
       }
  1. 刷新Zabbix前端界面。展开Monitoring菜单项,可观察到My address项现在位于Discovery项下方。

  1. 要为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')
                           ])
                       )
                   );
           }
       }
  1. 刷新Zabbix前端界面。可观察到My address菜单项现在包含具有两个页面的三级菜单 - External IPUser profile

第三部分 - 模块动作

一个动作通过两个文件实现 - actions/MyAddress.phpviews/my.address.php. actions/MyAddress.php file 负责业务逻辑实现,而 views/my.address.php file 负责视图展示.

  1. MyAddress 目录下创建 actions 子目录.

  2. 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);
           }
       }
  1. MyAddress 目录下创建 views 子目录.

  2. 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();
  1. 模块动作需在 manifest.json file 中注册. 打开 manifest.json 并添加新的object actions,其中包含:
  • 动作键名使用小写字母(a-z)书写,单词间用点号分隔(例如 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"
               }
           }
       }
  1. 刷新Zabbix前端. 点击 My address → External IP 查看您计算机的IP地址.