Este es un tutorial paso a paso que muestra cómo crear un módulo sencillo para la interfaz web de Zabbix. Puede descargar todos los archivos de este módulo como un archivo ZIP: MyAddress.zip.
Durante este tutorial, primero crearás un módulo de interfaz que añade una nueva sección de menú Mi Dirección y luego lo convertirás en un módulo de interfaz más avanzado que realiza una solicitud HTTP a https://api.seeip.org y muestra la respuesta - la dirección IP de tu equipo - en una nueva página en la sección de menú Mi Dirección recién creada. Así es como se verá el módulo terminado:
Cree un directorio MyAddress en el directorio modules de su instalación de la interfaz de Zabbix (por ejemplo, zabbix/ui/modules).
Cree un archivo manifest.json con los metadatos básicos del módulo (consulte la descripción de los parámetros soportados).
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."
}
El módulo ya está registrado en la interfaz. Sin embargo, aún no es visible, porque todavía necesita definir la funcionalidad del módulo. Una vez que agregue contenido al directorio del módulo, verá inmediatamente los cambios en la interfaz de Zabbix al actualizar la página.
Este archivo implementa una nueva clase Module que extiende la clase CModule por defecto. La clase Module insertará una nueva sección de menú Mi Dirección en el menú principal.
El método setAction() especifica una acción que se ejecutará al hacer clic en la sección del menú. Para empezar, puede utilizar la acción predefinida userprofile.edit, que abrirá la página de Perfil de usuario. En la parte III de este tutorial, aprenderá cómo crear una acción personalizada.
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(_('Mi Dirección')))
->setAction('userprofile.edit'));
}
}
Puede reemplazar 'userprofile.edit'
por otras acciones, por ejemplo, 'charts.view'
(abre gráficos personalizados), 'problems.view'
(abre Supervisión → Problemas) o 'report.status'
(abre el informe de Información del sistema).
En esta parte, moverá la sección del menú Mi dirección a la sección Supervisión y luego agregará un menú anidado a la misma. Como resultado, los usuarios podrán acceder a dos páginas de submenú desde la sección de menú Supervisión → Mi dirección.
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(_('Supervisión'))
->getSubmenu()
->insertAfter(_('Descubrimiento'),
(new CMenuItem(_('Mi dirección')))->setAction('userprofile.edit')
);
}
}
Este paso crea dos subsecciones:
Tenga en cuenta que para el menú anidado, debe usar la clase CMenu además de las clases utilizadas en los pasos anteriores.
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(_('Supervisión'))
->getSubmenu()
->insertAfter(_('Descubrimiento'),
(new CMenuItem(_('Mi dirección')))->setSubMenu(
new CMenu([
(new CMenuItem(_('IP externa')))->setAction('my.address'),
(new CMenuItem(_('Perfil de usuario')))->setAction('userprofile.edit')
])
)
);
}
}
Una acción se implementa en dos archivos: actions/MyAddress.php y views/my.address.php. El archivo actions/MyAddress.php se encarga de la implementación de la lógica de negocio, mientras que el archivo views/my.address.php es responsable de la vista.
Cree un directorio actions en el directorio MyAddress.
Cree un archivo MyAddress.php en el directorio actions.
La lógica de la acción se definirá en la clase MyAddress. Esta clase de acción implementará cuatro funciones: init(), checkInput(), checkPermissions() y doAction(). El frontend de Zabbix llama a la función doAction() cuando se solicita la acción. Esta función es responsable de la lógica de negocio del módulo.
Los datos deben organizarse como un array asociativo. El array puede ser multidimensional y puede contener cualquier dato que la vista espere.
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);
}
}
Cree un nuevo directorio views en el directorio MyAddress.
Cree un archivo my.address.php en el directorio views y defina la vista del módulo.
Tenga en cuenta que la variable $data
está disponible en la vista sin necesidad de definirla específicamente. El framework pasa automáticamente el array asociativo a la vista.
ui/modules/MyAddress/views/my.address.php
<?php
(new CHtmlPage())
->setTitle(_('El título HTML de la página Mi dirección'))
->addItem(new CDiv($data['my-ip']))
->show();
actions
que contenga:my.address
);MyAddress
) como valor para la clave class
del objeto my.address
;my.address
) como valor para la clave view
del objeto my.address
.ui/modules/MyAddress/manifest.json
{
"manifest_version": 2.0,
"id": "my-address",
"name": "Mi dirección IP",
"version": "1.0",
"namespace": "MyAddress",
"description": "Mi dirección IP externa.",
"actions": {
"my.address": {
"class": "MyAddress",
"view": "my.address"
}
}
}