Эта пошаговая инструкция показывает, как создать простой модуль веб-интерфейса Zabbix. Вы можете скачать все файлы этого модуля в виде ZIP-архива: MyAddress.zip.
С помощью этой пошаговой инструкции вы сначала создадите модуль веб-интерфейса, который добавляет новый раздел меню Мой адрес, а затем преобразуете его в более продвинутый модуль веб-интерфейса, который отправляет HTTP-запрос на https://api.seeip.org и отображает ответ — IP-адрес вашего компьютера — на новой странице во вновь созданном разделе меню Мой адрес. Вот как будет выглядеть готовый модуль:
Создайте каталог 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 после обновления страницы.
Этот файл реализует новый класс Module, который расширяет класс CModule по умолчанию. Класс Module вставит новый раздел меню Мой адрес в главное меню.
Метод setAction() определяет действие, которое будет выполнено при нажатии на раздел меню. Для начала вы можете использовать предопределенное действие userprofile.edit, которое откроет страницу Профиль пользователя. В части 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
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')
);
}
}
Действие реализовано в двух файлах - 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();
actions
, который содержит: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"
}
}
}
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('my.address')
);
}
}