Создание модуля (руководство)
Эта пошаговая инструкция показывает, как создать простой модуль веб-интерфейса Zabbix. Вы можете скачать все файлы этого модуля в виде ZIP-архива: MyAddress.zip.
Что вы создадите
В ходе этого руководства вы сначала создадите модуль веб-интерфейса, который добавляет новый раздел меню My Address, а затем преобразуете его в более продвинутый модуль веб-интерфейса, который выполняет HTTP-запрос к https://api.seeip.org и отображает ответ — IP-адрес вашего компьютера — на новой странице в новом разделе меню My Address.
Вот как будет выглядеть готовый модуль:

Часть I - Новый раздел меню
Добавление пустого модуля в веб-интерфейс Zabbix
-
Создайте каталог MyAddress в каталоге modules установленного веб-интерфейса Zabbix (например, 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 перейдите в раздел Администрирование > Общие > Модули и нажмите кнопку Сканировать каталог.

- Найдите новый модуль My IP Address в списке и нажмите ссылку «Отключен», чтобы изменить статус модуля с «Отключен» на «Включен» (если модуль отсутствует в списке, см. раздел устранение неполадок).

Теперь модуль зарегистрирован в веб-интерфейсе. Однако он пока не отображается, поскольку необходимо определить функциональность модуля. После добавления содержимого в каталог модуля изменения сразу отобразятся в веб-интерфейсе Zabbix после обновления страницы.
Создание раздела меню
- Создайте файл Module.php в каталоге MyAddress.
Этот файл реализует новый класс 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' (открывает отчёт Сведения о системе).
- Обновите веб-интерфейс Zabbix. В нижней части главного меню Zabbix появился новый раздел My Address. Нажмите My Address, чтобы открыть страницу User profile.

Часть II — изменение расположения раздела меню
В этой части вы переместите раздел меню My Address в раздел Monitoring, а затем добавите в него вложенное меню. В результате пользователи смогут открывать две страницы подменю из раздела меню Monitoring > My Address.
- Откройте и отредактируйте файл Module.php.
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.
На этом шаге создаются два подраздела:
- 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.

Часть III — Действие модуля
Действие реализуется в двух файлах: actions/MyAddress.php и views/my.address.php. Файл actions/MyAddress.php отвечает за реализацию бизнес-логики, а файл views/my.address.php — за представление.
-
Создайте каталог actions в каталоге MyAddress.
-
Создайте файл MyAddress.php в каталоге actions.
Логика действия определяется в классе 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);
}
}
-
Создайте новый каталог views в каталоге MyAddress.
-
Создайте файл my.address.php в каталоге views и определите представление модуля.
Обратите внимание, что переменная $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();
- Действие модуля необходимо зарегистрировать в файле manifest.json.
Откройте manifest.json и добавьте новый объект
actions, содержащий:
- ключ действия с именем действия, записанным строчными буквами (a-z), а слова разделенными точками (например,
my.address); - имя класса действия (
MyAddress) в качестве значения ключаclassобъектаmy.address; - имя представления действия (
my.address) в качестве значения ключаviewобъектаmy.address.
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-адрес вашего компьютера.
