[comment]: # translation:outdated

[comment]: # aside:1

[comment]: # ({b311df1e-8fe7205c})
# Crea un modulo (tutorial)

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

[comment]: # ({98067368-5fb5b83a})
Questo è un tutorial passo-passo che mostra come creare un semplice modulo frontend Zabbix.
Puoi scaricare tutti i file di questo modulo come archivio ZIP: [MyAddress.zip](../../../../assets/en/devel/modules/examples/MyAddress.zip).

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

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

Durante questo tutorial, creerai innanzitutto un modulo frontend che aggiunge una nuova sezione di menu *My Address*
e poi lo convertirai in un modulo frontend [più avanzato](#part-iii--module-action) che effettua una richiesta HTTP a *https://api.seeip.org*
e visualizza la risposta - l'indirizzo IP del tuo computer - in una nuova pagina nella sezione di menu *My Address* appena creata.
Ecco come apparirà il modulo completato:

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

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

[comment]: # ({a5c86d2c-8c2bcd9e})
### Parte I - Nuova sezione del menu

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

[comment]: # ({9c416cbb-1d4de634})
##### Aggiungere un modulo vuoto al frontend di Zabbix

1. Creare una directory *MyAddress* nella directory *modules* dell'installazione del frontend di Zabbix (ad esempio, *zabbix/ui/modules*).

2. Creare un file *manifest.json* con i metadati di base del modulo (vedere la descrizione dei [parametri](../file_structure/manifest) supportati).

**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. Nel frontend di Zabbix, andare alla sezione *Administration → General → Modules* e fare clic sul pulsante *Scan directory*.

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

4. Individuare il nuovo modulo *My IP Address* nell'elenco e fare clic sul collegamento ipertestuale "Disabled" per cambiare lo stato del modulo da "Disabled" a "Enabled" (se il modulo non è elencato, vedere la sezione [troubleshooting](/manual/extensions/frontendmodules#installation)).

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

Il modulo è ora registrato nel frontend. Tuttavia, non è ancora visibile, perché è ancora necessario definire la funzionalità del modulo.
Una volta aggiunto il contenuto alla directory del modulo, le modifiche saranno immediatamente visibili nel frontend di Zabbix aggiornando la pagina.

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

[comment]: # ({db062f15-d88b8114})
##### Creare una sezione di menu

1. Creare un file *Module.php* nella directory *MyAddress*.

Questo file implementa una nuova classe *Module* che estende la classe predefinita *CModule*.
La classe *Module* inserirà una nuova sezione di menu *My Address* nel menu principale.

Il metodo *setAction()* specifica un'azione da eseguire quando si fa clic sulla sezione di menu.
Per iniziare, è possibile utilizzare l'azione predefinita *userprofile.edit*, che aprirà la pagina *Profilo utente*.
Nella [parte III](#part-iii--module-action) di questo tutorial, imparerai come creare un'azione personalizzata.

**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
È possibile sostituire `'userprofile.edit'` con altre azioni, ad esempio `'charts.view'` (apre i grafici personalizzati), `'problems.view'` (apre *Monitoraggio → Problemi*) oppure `'report.status'` (apre il report *Informazioni di sistema*).
:::

3. Aggiornare il frontend di Zabbix. Ora è presente una nuova sezione *My Address* nella parte inferiore del menu principale di Zabbix.
Fare clic su *My Address* per aprire la pagina *Profilo utente*.

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

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

[comment]: # ({89dbfda8-5c3fc480})
### Parte II - Modifica della posizione della sezione di menu

In questa parte, sposterai la sezione di menu *My Address* nella sezione *Monitoring* e poi vi aggiungerai un menu nidificato.
Di conseguenza, gli utenti potranno accedere a due pagine di sottomenu dalla sezione di menu *Monitoring → My Address*.

1. Apri e modifica il file *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. Aggiorna il frontend di Zabbix. Espandi la sezione di menu *Monitoring* e osserva che la sezione *My address* ora si trova sotto la sezione *Discovery*.

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

3. Per aggiungere pagine nidificate alla sezione di menu *My Address*, apri e modifica di nuovo il file *Module.php*.

Questo passaggio crea due sottosezioni:

-   *External IP* che esegue una nuova azione 'my.address' che verrà definita nei passaggi successivi;
-   *User profile* che esegue l'azione predefinita 'userprofile.edit' per aprire la pagina *User profile*.

Nota che per il menu nidificato è necessario utilizzare la classe *CMenu* oltre alle classi usate nei passaggi precedenti.

**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. Aggiorna il frontend di Zabbix. Osserva che la sezione di menu *My address* ora contiene un menu di terzo livello con due pagine: *External IP* e *User profile*.

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

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

[comment]: # ({6061bdad-8798eff6})
### Parte III - Azione del modulo

Un'azione è implementata in due file: *actions/MyAddress.php* e *views/my.address.php*.
Il file ***actions/MyAddress.php*** si occupa dell'implementazione della logica di business, mentre il file ***views/my.address.php*** è responsabile della vista.

1. Creare una directory *actions* nella directory *MyAddress*.

2. Creare un file *MyAddress.php* nella directory *actions*.

La logica dell'azione sarà definita nella classe *MyAddress*.
Questa classe di azione implementerà quattro funzioni: *init()*, *checkInput()*, *checkPermissions()* e *doAction()*.
Zabbix frontend richiama la funzione *doAction()* quando l'azione viene richiesta.
Questa funzione è responsabile della logica di business del modulo.

::: noteimportant
I dati devono essere organizzati come un array associativo.
L'array può essere multidimensionale e può contenere qualsiasi dato previsto dalla vista.
:::

**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. Creare una nuova directory *views* nella directory *MyAddress*.

4. Creare un file *my.address.php* nella directory *views* e definire la vista del modulo.

Si noti che la variabile `$data` è disponibile nella vista senza doverla definire esplicitamente.
Il framework passa automaticamente l'array associativo alla vista.

**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. L'azione del modulo deve essere registrata nel file *manifest.json*. Aprire *manifest.json* e aggiungere un nuovo oggetto `actions` che contenga:

-   la chiave dell'azione con il nome dell'azione scritto in minuscolo (a-z) e con le parole separate da punti (ad esempio, `my.address`);
-   il nome della classe dell'azione (`MyAddress`) come valore della chiave `class` dell'oggetto `my.address`;
-   il nome della vista dell'azione (`my.address`) come valore della chiave `view` dell'oggetto `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. Aggiornare Zabbix frontend. Fare clic su *My address → External IP* per visualizzare l'indirizzo IP del proprio computer.

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

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