[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]: # ({5fe8674d-5ce71b9d})
### Ko jūs izveidosiet

Šajā pamācībā vispirms izveidosiet lietotāja saskarne moduli, kas pievieno jaunu *My Address* izvēlnes sadaļu, un pēc tam pārveidosiet to par [uzlabotāku](#part-iii---module-action) lietotāja saskarne moduli, kas veic HTTP pieprasījumu uz *https://api.seeip.org* un jaunā lapā jaunizveidotajā *My Address* izvēlnes sadaļā parāda atbildi - jūsu datora IP adresi.

Lūk, kā izskatīsies gatavais modulis:

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

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

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

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

[comment]: # ({9c416cbb-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 moduļa direktorijā pievienosiet saturu, pēc lapas atsvaidzināšanas Zabbix lietotāja saskarnē nekavējoties redzēsiet izmaiņas.

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

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

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

Šis fails ievieš jaunu *Module* klasi, kas paplašina noklusējuma *CModule* klasi.
*Module* klase 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 *User profile* lapu.
Šī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 *My Address* sadaļa.
Noklikšķiniet uz *My Address*, lai atvērtu *User profile* lapu.

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

[comment]: # ({/64c4a481-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]: # ({6061bdad-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()*, kad darbība tiek pieprasīta.
Šī funkcija ir atbildīga par moduļa biznesa loģiku.

::: noteimportant
Datiem jābūt sakārtotiem kā asociatīvam masīvam.
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.
Sistēma 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 uz *My address → External IP*, lai redzētu sava datora IP adresi.

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

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