这是一个分步教程,展示了如何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"
               }
           }
       }