Це покрокова інструкція, яка показує, як створити простий модуль фронтенду Zabbix. Ви можете завантажити всі файли цього модуля у вигляді ZIP-архіву: MyAddress.zip.
У цьому уроці ви спочатку створите модуль інтерфейсу, який додає новий розділ меню Моя адреса, а потім перетворите його на [більш просунутий] (#part-iii---module-action) модуль інтерфейсу, який робить HTTP-запит до https://api.seeip.org і відображає відповідь - IP-адресу вашого комп'ютера - на новій сторінці в новоствореному розділі меню Моя адреса. Ось як виглядатиме готовий модуль:
Створіть каталог MyAddress у каталозі modules вашої інсталяції web-інтерфейсу 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": "Моя зовнішня IP-адреса"
}
Тепер модуль зареєстровано у фронтенді. Однак його ще не видно, тому що вам ще потрібно визначити функціональність модуля. Після того, як ви додасте контент до каталогу модулів, ви одразу побачите зміни у фронтенді Zabbix при оновленні сторінки.
Цей файл реалізує новий клас Module, який розширює стандартний клас CModule. Клас Module вставить новий розділ меню My Address в головне меню.
Метод 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((новий 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(), коли викликається дія. Ця функція відповідає за бізнес-логіку модуля.
Дані повинні бути організовані як асоціативний масив. Масив може бути багатовимірним і може містити будь-які дані, які очікує view.
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
доступна у view без її спеціального визначення. Фреймворк автоматично передає асоціативний масив у view.
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();
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')
);
}
}