Utwórz moduł (samouczek)

To jest samouczek krok po kroku, który pokazuje, jak utworzyć prosty moduł front-endu Zabbix. Możesz pobrać wszystkie pliki tego modułu jako archiwum ZIP: MyAddress.zip.

Co zbudujesz

Podczas tego samouczka najpierw zbudujesz moduł frontend, który doda nową sekcję menu My Address, a następnie przekształcisz go w bardziej zaawansowany moduł frontend, który wykonuje żądanie HTTP do https://api.seeip.org i wyświetla odpowiedź — adres IP twojego komputera — na nowej stronie w nowo utworzonej sekcji menu My Address. Oto jak będzie wyglądał gotowy moduł:

Część I - Podstawowy moduł

Dodawanie pustego modułu do frontend Zabbix
  1. Utwórz katalog MyAddress w katalogu modules instalacji frontend Zabbix (na przykład zabbix/ui/modules).

  2. Utwórz plik manifest.json z podstawowymi metadanymi modułu (zobacz opis obsługiwanych parametrów).

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."
}
  1. W frontend Zabbix przejdź do sekcji Administration > General > Modules i kliknij przycisk Scan directory.

  1. Znajdź nowy moduł My IP Address na liście i kliknij hiperłącze „Disabled”, aby zmienić status modułu z „Disabled” na „Enabled” (jeśli modułu nie ma na liście, zobacz sekcję rozwiązywanie problemów).

Moduł jest teraz zarejestrowany we frontendzie. Nie jest jednak jeszcze widoczny, ponieważ nadal trzeba zdefiniować jego funkcjonalność. Po dodaniu zawartości do katalogu modułu zmiany będą natychmiast widoczne w frontend Zabbix po odświeżeniu strony.

Tworzenie sekcji menu
  1. Utwórz plik Module.php w katalogu MyAddress.

Ten plik implementuje nową klasę Module, która rozszerza domyślną klasę CModule. Klasa Module doda nową sekcję menu Mój adres do menu głównego.

Metoda setAction() określa akcję, która zostanie wykonana po kliknięciu sekcji menu. Na początek możesz użyć predefiniowanej akcji userprofile.edit, która otworzy stronę Profil użytkownika. W części III tego samouczka dowiesz się, jak utworzyć niestandardową akcję.

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'));
    }
}

Możesz zastąpić 'userprofile.edit' innymi akcjami, na przykład 'charts.view' (otwiera wykresy niestandardowe), 'problems.view' (otwiera Monitorowanie > Problemy) lub 'report.status' (otwiera raport Informacje o systemie).

  1. Odśwież frontend Zabbix. Na dole głównego menu Zabbix znajduje się teraz nowa sekcja Mój adres. Kliknij Mój adres, aby otworzyć stronę Profil użytkownika.

Część II — Zmiana lokalizacji sekcji menu

W tej części przeniesiesz sekcję menu My Address do sekcji Monitoring, a następnie dodasz do niej zagnieżdżone menu. W rezultacie użytkownicy będą mogli uzyskać dostęp do dwóch podstron z sekcji menu Monitoring > My Address.

  1. Otwórz i edytuj plik 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')
            );
    }
}
  1. Odśwież frontend Zabbix. Rozwiń sekcję menu Monitoring i sprawdź, czy sekcja My address znajduje się teraz poniżej sekcji Discovery.

  1. Aby dodać zagnieżdżone strony do sekcji menu My Address, ponownie otwórz i edytuj plik Module.php.

Ten krok tworzy dwie podsekcje:

  • External IP, która wykonuje nową akcję „my.address”, zdefiniowaną w kolejnych krokach;
  • User profile, która wykonuje wstępnie zdefiniowaną akcję „userprofile.edit” w celu otwarcia strony User profile.

Pamiętaj, że w przypadku zagnieżdżonego menu musisz użyć klasy CMenu oprócz klas użytych w poprzednich krokach.

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')
                    ])
                )
            );
    }
}
  1. Odśwież frontend Zabbix. Sprawdź, czy sekcja menu My address zawiera teraz menu trzeciego poziomu z dwiema stronami — External IP i User profile.

Część III — Moduł action

Action jest zaimplementowany w dwóch plikach: actions/MyAddress.php i views/my.address.php. Plik actions/MyAddress.php odpowiada za implementację logiki biznesowej, natomiast plik views/my.address.php odpowiada za widok.

  1. Utwórz katalog actions w katalogu MyAddress.

  2. Utwórz plik MyAddress.php w katalogu actions.

Logika action zostanie zdefiniowana w klasie MyAddress. Ta klasa action zaimplementuje cztery funkcje: init(), checkInput(), checkPermissions() i doAction(). Frontend Zabbix wywołuje funkcję doAction(), gdy action zostanie zażądany. Ta funkcja odpowiada za logikę biznesową modułu.

Dane muszą być zorganizowane jako tablica asocjacyjna. Tablica może być wielowymiarowa i może zawierać dowolne dane oczekiwane przez widok.

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);
    }
}
  1. Utwórz nowy katalog views w katalogu MyAddress.

  2. Utwórz plik my.address.php w katalogu views i zdefiniuj widok modułu.

Zwróć uwagę, że zmienna $data jest dostępna w widoku bez konieczności jej jawnego definiowania. Framework automatycznie przekazuje tablicę asocjacyjną do widoku.

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();
  1. Action modułu musi zostać zarejestrowany w pliku manifest.json. Otwórz plik manifest.json i dodaj nowy obiekt actions, który zawiera:
  • klucz action z nazwą action zapisaną małymi literami (a-z) i ze słowami oddzielonymi kropkami (na przykład my.address);
  • nazwę klasy action (MyAddress) jako wartość klucza class obiektu my.address;
  • nazwę widoku action (my.address) jako wartość klucza view obiektu 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"
        }
    }
}
  1. Odśwież frontend Zabbix. Kliknij My address > External IP, aby wyświetlić adres IP swojego komputera.