[comment]: # translation:outdated

[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]: # ({9c416cbb-1d4de634})
##### Pievienojiet tukšu moduli Zabbix lietotāja saskarnei

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

2. Izveidojiet *manifest.json* failu ar moduļa pamata 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ē atveriet 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 norādīts 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 jums joprojām ir jādefinē moduļa funkcionalitāte.
Kad pievienosiet saturu moduļa direktorijam, pēc lapas atsvaidzināšanas izmaiņas nekavējoties būs redzamas Zabbix lietotāja saskarnē.

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

[comment]: # ({db062f15-d88b8114})
##### Izveidojiet 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 galvenajā izvēlnē ievietos jaunu *My Address* izvēlnes sadaļu.

Metode *setAction()* norāda darbību, kas tiks izpildīta, noklikšķinot uz izvēlnes sadaļas.
Sākumā varat izmantot iepriekš definēto darbību *userprofile.edit*, kas atvērs *Lietotāja profils* 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
Jūs varat aizstāt `'userprofile.edit'` ar citām darbībām, piemēram, `'charts.view'` (atver pielāgotus grafikus), `'problems.view'` (atver *Uzraudzība → Problēmas*), vai `'report.status'` (atver *Sistēmas informācija* atskaiti).
:::

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

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

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

::: noteimportant
Dati ir jāorganizē kā asociatīvs masīvs.
Masīvs var būt daudzdimensionāls un var saturēt jebkādus 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 tā 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 objekta `my.address` atslēgai `class`;
-   darbības skata nosaukumu (`my.address`) kā vērtību objekta `my.address` atslēgai `view`.

**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})
