[comment]: # translation:outdated

[comment]: # aside:1

[comment]: # ({b311df1e-8fe7205c})
# Utwórz moduł (samouczek)

[comment]: # ({/b311df1e-8fe7205c})

[comment]: # ({98067368-5fb5b83a})
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](../../../../assets/en/devel/modules/examples/MyAddress.zip).

[comment]: # ({/98067368-5fb5b83a})

[comment]: # ({b971a521-5ce71b9d})
### 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](#part-iii--module-action) 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ł:

![](../../../../assets/en/devel/modules/tutorials/module/my_address_finished.png){width="600"}

[comment]: # ({/b971a521-5ce71b9d})

[comment]: # ({a5c86d2c-8c2bcd9e})
### Część I - Podstawowy moduł

[comment]: # ({/a5c86d2c-8c2bcd9e})

[comment]: # ({9c416cbb-1d4de634})

##### Dodaj pusty moduł do frontendu Zabbix
1. Utwórz katalog *MyAddress* w katalogu *modules* instalacji frontendu Zabbix (na przykład *zabbix/ui/modules*).
2. Utwórz plik *manifest.json* z podstawowymi metadanymi modułu (zobacz opis obsługiwanych [parametrów](../file_structure/manifest)).

**ui/modules/MyAddress/manifest.json**
```json
{
"manifest_version": 2.0,
"id": "my-address",
"name": "My IP Address",
"version": "1.0",
"namespace": "MyAddress",
"description": "My External IP Address."
}
```

3. W interfejsie użytkownika Zabbix przejdź do sekcji *Administracja → Ogólne → Moduły* i kliknij przycisk *Skanuj katalog*.

![](../../../../assets/en/devel/modules/tutorials/widget/scan_dir.png)

4. Znajdź nowy moduł *My IP Address* na liście i kliknij hiperłącze „Wyłączony”, aby zmienić status modułu z „Wyłączony” na „Włączony” (jeśli nie widzisz swojego modułu na liście, sprawdź [uprawnienia](/devel/modules/troubleshooting#module-is-not-detected)).

![](../../../../assets/en/devel/modules/tutorials/module/module_register.png){width="600"}

Moduł jest teraz zarejestrowany w frontendzie. Jednak nie jest jeszcze widoczny, ponieważ nadal musisz zdefiniować funkcjonalność modułu.
 Po dodaniu zawartości do katalogu modułu, natychmiast zobaczysz zmiany w frontendzie Zabbix po odświeżeniu strony.

[comment]: # ({/9c416cbb-1d4de634})

[comment]: # ({db062f15-d88b8114})
##### Utwórz sekcję 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* wstawi nową sekcję menu *My Address* do menu głównego.

Metoda *setAction()* określa akcję, która ma zostać 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](#part-iii--module-action) tego samouczka dowiesz się, jak utworzyć własną akcję.

**ui/modules/MyAddress/Module.php**

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

:::noteclassic
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*).
:::

3. Odśwież frontend Zabbix. Na dole menu głównego Zabbix znajduje się teraz nowa sekcja *My Address*.
Kliknij *My Address*, aby otworzyć stronę *Profil użytkownika*.

![](../../../../assets/en/devel/modules/tutorials/module/my_address_top_menu.png){width="600"}

[comment]: # ({/db062f15-d88b8114})

[comment]: # ({89dbfda8-5c3fc480})
### Część II - Zmiana lokalizacji sekcji menu

W tej części przeniesiesz sekcję menu *My address* do sekcji *Monitorowanie*, a następnie dodasz do niej zagnieżdżone menu.
W rezultacie użytkownicy będą mogli uzyskać dostęp do dwóch stron podmenu z sekcji menu *Monitorowanie → My address*.

1. Otwórz i edytuj plik *Module.php*.

**ui/modules/MyAddress/Module.php**

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

2. Odśwież interfejs użytkownika Zabbix. Rozwiń sekcję menu *Monitoring* i zauważ, że sekcja *My address* znajduje się teraz poniżej sekcji *Odkrywanie*.

![](../../../../assets/en/devel/modules/tutorials/module/my_address_monitoring.png){width="600"}

3. Aby dodać zagnieżdżone strony do sekcji menu *Mój adres*, otwórz i edytuj ponownie plik *Module.php*.

Ten krok tworzy dwie podsekcje:

- *Zewnętrzny adres IP*, który wykonuje nową akcję 'my.address', która zostanie zdefiniowana w kolejnych krokach;
- *Profil użytkownika*, który wykonuje wstępnie zdefiniowaną akcję 'userprofile.edit', aby otworzyć stronę *Profil użytkownika*.

Należy pamiętać, że w przypadku zagnieżdżonego menu należy użyć klasy *CMenu* oprócz klas użytych w poprzednich krokach.

**ui/modules/MyAddress/Module.php**

```php
<?php

namespace Modules\MyAddress;

użyj 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(_('Mój adres')))->setSubMenu(
new CMenu([
(new CMenuItem(_('Zewnętrzny adres IP')))->setAction('my.address'),
(new CMenuItem(_('Profil użytkownika')))->setAction('userprofile.edit')
])
)
);
}
}
```

4. Odśwież frontend Zabbix. Zauważ, że sekcja menu *Mój adres* zawiera teraz menu trzeciego poziomu z dwiema stronami - *Zewnętrzny adres IP* i *Profil użytkownika*.

![](../../../../assets/en/devel/modules/tutorials/module/my_address_nested.png){width="600"}

[comment]: # ({/89dbfda8-5c3fc480})

[comment]: # ({6061bdad-8798eff6})
### Część III - Akcja modułu

Akcja jest implementowana w dwóch plikach - *actions/MyAddress.php* i *views/my.address.php*.
Plik ***actions/MyAddress.php*** zajmuje się implementacją logiki biznesowej, podczas gdy 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 akcji zostanie zdefiniowana w klasie *MyAddress*.
Ta klasa akcji zaimplementuje cztery funkcje: *init()*, *checkInput()*, *checkPermissions()* i *doAction()*.
Frontend Zabbix wywołuje funkcję *doAction()*, gdy żądana jest akcja.
Ta funkcja odpowiada za logikę biznesową modułu.

::: noteimportant
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
<?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);
}
}
```

3. Utwórz nowy katalog *views* w katalogu *MyAddress*.

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

Należy zauważyć, że zmienna `$data` jest dostępna w widoku bez jej konkretnego definiowania.
Framework automatycznie przekazuje tablicę asocjacyjną do widoku.

**ui/modules/MyAddress/views/my.address.php**

```php
<?php

(new CHtmlPage())
->setTitle(_('Tytuł HTML strony My Address'))
->addItem(new CDiv($data['my-ip']))
->show();
```

5. Akcja modułu musi zostać zarejestrowana w pliku *manifest.json*. Otwórz *manifest.json* i dodaj nowy obiekt `actions`, który zawiera:

- klucz akcji z nazwą akcji zapisaną małymi literami (a-z) i słowami oddzielonymi kropkami (na przykład `my.address`);
- nazwę klasy akcji (`MyAddress`) jako wartość klucza `class` obiektu `my.address`;
- nazwę widoku akcji (`my.address`) jako wartość klucza `view` obiektu `my.address`.

**ui/modules/MyAddress/manifest.json**

```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"
}
}
}
```

6. Odśwież interfejs użytkownika Zabbix. Kliknij *Mój adres → Zewnętrzny adres IP*, aby zobaczyć adres IP swojego komputera.

![](../../../../assets/en/devel/modules/tutorials/module/my_address_finished.png){width="600"}

[comment]: # ({/6061bdad-8798eff6})
