Este é um tutorial passo a passo que mostra como criar um módulo simples de frontend do Zabbix. Você pode baixar todos os arquivos deste módulo como um arquivo ZIP: MyAddress.zip.
Durante este tutorial, você irá primeiro construir um módulo de frontend que adiciona uma nova seção de menu Meu Endereço e depois convertê-lo em um módulo de frontend mais avançado que faz uma requisição HTTP para https://api.seeip.org e exibe a resposta - o endereço IP do seu computador - em uma nova página na seção de menu Meu Endereço recém-criada. Veja como o módulo finalizado ficará:

Crie um diretório MyAddress no diretório modules da sua instalação do frontend do Zabbix (por exemplo, zabbix/ui/modules).
Crie um arquivo manifest.json com os metadados básicos do módulo (consulte a descrição dos parâmetros suportados).
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."
}

O módulo agora está registrado no frontend. No entanto, ainda não está visível, pois você ainda precisa definir a funcionalidade do módulo. Assim que você adicionar conteúdo ao diretório do módulo, verá imediatamente as alterações no frontend do Zabbix ao atualizar a página.
Este arquivo implementa uma nova classe Module que estende a classe padrão CModule. A classe Module irá inserir uma nova seção de menu Meu Endereço no menu principal.
O método setAction() especifica uma ação a ser executada ao clicar na seção do menu. Para começar, você pode usar a ação predefinida userprofile.edit, que abrirá a página Perfil do usuário. Na parte III deste tutorial, você aprenderá como criar uma ação 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(_('Meu Endereço')))
->setAction('userprofile.edit'));
}
}Você pode substituir 'userprofile.edit' por outras ações, por exemplo, 'charts.view' (abre gráficos personalizados), 'problems.view' (abre Monitoramento → Problemas) ou 'report.status' (abre o relatório Informações do sistema).

Nesta parte, você moverá a seção de menu Meu endereço para a seção Monitoramento e, em seguida, adicionará um menu aninhado a ela. Como resultado, os usuários poderão acessar duas páginas de submenus a partir da seção de menu Monitoramento → Meu endereço.
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')
);
}
}
Esta etapa cria duas subseções:
Observe que, para o menu aninhado, você precisa usar a classe CMenu além das classes usadas nas etapas 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(_('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')
])
)
);
}
}
Uma ação é implementada em dois arquivos - actions/MyAddress.php e views/my.address.php. O arquivo actions/MyAddress.php cuida da implementação da lógica de negócio, enquanto o arquivo views/my.address.php é responsável pela visualização.
Crie um diretório actions no diretório MyAddress.
Crie um arquivo MyAddress.php no diretório actions.
A lógica da ação será definida na classe MyAddress. Esta classe de ação implementará quatro funções: init(), checkInput(), checkPermissions() e doAction(). O frontend do Zabbix chama a função doAction() quando a ação é solicitada. Esta função é responsável pela lógica de negócio do módulo.
Os dados devem ser organizados como um array associativo. O array pode ser multidimensional e pode conter quaisquer dados esperados pela visualização.
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);
}
}Crie um novo diretório views no diretório MyAddress.
Crie um arquivo my.address.php no diretório views e defina a visualização do módulo.
Observe que a variável $data está disponível na visualização sem ser definida especificamente. O framework passa automaticamente o array associativo para a visualização.
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 que contém:my.address);MyAddress) como valor para a chave class do objeto my.address;my.address) como valor para a chave view do objeto 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"
}
}
}