[comment]: # aside:1

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

# Create a module (tutorial)

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

[comment]: # ({98067368-5fb5b83a})
Šī ir soli pa solim apmācība, kurā parādīts, kā izveidot vienkāršu Zabbix lietotāja saskarnes moduli.
Jūs varat lejupielādēt visus šī moduļa failus kā ZIP arhīvu: [MyAddress.zip](../../../../assets/en/devel/modules/examples/MyAddress.zip).

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

[comment]: # ({b971a521-5ce71b9d})
### Ko jūs izveidosiet

Šīs pamācības laikā jūs vispirms izveidosiet lietotāja saskarnes moduli, kas pievieno jaunu *Mana adrese* izvēlnes sadaļu,
un pēc tam pārveidosiet to par [modernāku](#part-iii--module-action) lietotāja saskarnes moduli, kas veic HTTP pieprasījumu uz *https://api.seeip.org*
un jaunā lapā jaunizveidotajā *Mana adrese* izvēlnes sadaļā parāda atbildi — jūsu datora IP adresi.
Lūk, kā izskatīsies pabeigtais modulis:

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

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

[comment]: # ({a5c86d2c-8c2bcd9e})
### I daļa — Jauna izvēlnes sadaļa

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

[comment]: # ({a3380cc1-1d4de634})
##### Pievienot tukšu moduli Zabbix lietotāja saskarnei

1. Izveidojiet direktoriju *MyAddress* direktorijā *modules* savā Zabbix lietotāja saskarnes instalācijā (piemēram, *zabbix/ui/modules*).

2. Izveidojiet failu *manifest.json* ar pamata moduļa metadatiem (skatiet atbalstīto [parametru](../file_structure/manifest) aprakstu).

**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. Zabbix lietotāja saskarnē dodieties uz sadaļu *Administration → General → Modules* un noklikšķiniet uz pogas *Scan directory*.

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

4. Sarakstā atrodiet jauno moduli *My IP Address* un noklikšķiniet uz hipersaites "Disabled", lai mainītu moduļa statusu no "Disabled" uz "Enabled" (ja modulis nav sarakstā, skatiet sadaļu [troubleshooting](/manual/extensions/frontendmodules#installation)).

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

Modulis tagad ir reģistrēts lietotāja saskarnē. Tomēr tas vēl nav redzams, jo joprojām ir jādefinē moduļa funkcionalitāte.
Kad pievienosiet saturu moduļa direktorijai, pēc lapas atsvaidzināšanas izmaiņas Zabbix lietotāja saskarnē būs redzamas nekavējoties.

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

[comment]: # ({b344c600-d88b8114})
##### Izveidot izvēlnes sadaļu

1. Izveidojiet *Module.php* failu direktorijā *MyAddress*.

Šis fails ievieš jaunu *Module* klasi, kas paplašina noklusējuma *CModule* klasi.
Klase *Module* ievietos jaunu *My Address* izvēlnes sadaļu galvenajā izvēlnē.

Metode *setAction()* norāda darbību, kas jāizpilda, noklikšķinot uz izvēlnes sadaļas.
Sākumā varat izmantot iepriekš definēto darbību *userprofile.edit*, kas atvērs lapu *User profile*.
Šīs pamācības [III daļā](#part-iii--module-action) jūs uzzināsiet, kā izveidot pielāgotu darbību.

**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
Varat aizstāt `'userprofile.edit'` ar citām darbībām, piemēram, `'charts.view'` (atver pielāgotās diagrammas), `'problems.view'` (atver *Monitoring → Problems*) vai `'report.status'` (atver *System information* pārskatu).
:::

3. Atsvaidziniet Zabbix lietotāja saskarni. Tagad Zabbix galvenās izvēlnes apakšā ir jauna sadaļa *My Address*.
Noklikšķiniet uz *My Address*, lai atvērtu lapu *User profile*.

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

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

[comment]: # ({89dbfda8-5c3fc480})
### II daļa — izvēlnes sadaļas atrašanās vietas maiņa

Šajā daļā jūs pārvietosiet izvēlnes sadaļu *My Address* uz sadaļu *Monitoring* un pēc tam tai pievienosiet ligzdotu izvēlni.
Rezultātā lietotāji varēs piekļūt divām apakšizvēlnes lapām no izvēlnes sadaļas *Monitoring → My Address*.

1. Atveriet un rediģējiet failu *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. Atsvaidziniet Zabbix lietotāja saskarni. Izvērsiet izvēlnes sadaļu *Monitoring* un pārliecinieties, ka sadaļa *My address* tagad atrodas zem sadaļas *Discovery*.

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

3. Lai izvēlnes sadaļai *My Address* pievienotu ligzdotas lapas, vēlreiz atveriet un rediģējiet failu *Module.php*.

Šajā solī tiek izveidotas divas apakšsadaļas:

-   *External IP*, kas izpilda jaunu darbību 'my.address', kura tiks definēta nākamajos soļos;
-   *User profile*, kas izpilda iepriekš definēto darbību 'userprofile.edit', lai atvērtu lapu *User profile*.

Ņemiet vērā, ka ligzdotajai izvēlnei papildus iepriekšējos soļos izmantotajām klasēm ir jāizmanto arī klase *CMenu*.

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

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

4. Atsvaidziniet Zabbix lietotāja saskarni. Pārliecinieties, ka izvēlnes sadaļā *My address* tagad ir trešā līmeņa izvēlne ar divām lapām — *External IP* un *User profile*.

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

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

[comment]: # ({01445d91-8798eff6})
### III daļa - moduļa darbība

Darbība tiek ieviesta divos failos - *actions/MyAddress.php* un *views/my.address.php*.
Fails ***actions/MyAddress.php*** nodrošina biznesa loģikas ieviešanu, savukārt fails ***views/my.address.php*** ir atbildīgs par skatu.

1. Izveidojiet direktoriju *actions* direktorijā *MyAddress*.

2. Izveidojiet failu *MyAddress.php* direktorijā *actions*.

Darbības loģika tiks definēta klasē *MyAddress*.
Šī darbības klase ieviesīs četras funkcijas: *init()*, *checkInput()*, *checkPermissions()* un *doAction()*.
Zabbix lietotāja saskarne izsauc funkciju *doAction()* tad, kad tiek pieprasīta darbība.
Šī funkcija ir atbildīga par moduļa biznesa loģiku.

::: noteimportant
Datiem jābūt sakārtotiem asociatīvā masīvā.
Masīvs var būt daudzdimensionāls un var saturēt jebkurus datus, ko sagaida skats.
:::

**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. Izveidojiet jaunu direktoriju *views* direktorijā *MyAddress*.

4. Izveidojiet failu *my.address.php* direktorijā *views* un definējiet moduļa skatu.

Ņemiet vērā, ka mainīgais `$data` ir pieejams skatā bez īpašas definēšanas.
Ietvars automātiski nodod asociatīvo masīvu skatam.

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

```php
<?php

(new CHtmlPage())
    ->setTitle(_('The HTML Title of My Address Page'))
    ->addItem(new CDiv($data['my-ip']))
    ->show();
```

5. Moduļa darbība ir jāreģistrē failā *manifest.json*. Atveriet *manifest.json* un pievienojiet jaunu objektu `actions`, kas satur:

-   darbības atslēgu ar darbības nosaukumu, kas rakstīts ar mazajiem burtiem (a-z) un ar vārdiem, kas atdalīti ar punktiem (piemēram, `my.address`);
-   darbības klases nosaukumu (`MyAddress`) kā vērtību atslēgai `class` objektā `my.address`;
-   darbības skata nosaukumu (`my.address`) kā vērtību atslēgai `view` objektā `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. Atsvaidziniet Zabbix lietotāja saskarni. Noklikšķiniet *My address → External IP*, lai redzētu sava datora IP adresi.

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

[comment]: # ({/01445d91-8798eff6})
