[comment]: # translation:outdated

[comment]: # aside:1

[comment]: # ({b311df1e-8fe7205c})
# Erstellen eines Moduls (Tutorial)

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

[comment]: # ({98067368-5fb5b83a})
Dies ist ein Schritt-für-Schritt-Tutorial, das zeigt, wie man ein einfaches Zabbix-Frontend-Modul erstellt.
Sie können alle Dateien dieses Moduls als ZIP-Archiv herunterladen: [MyAddress.zip](../../../../assets/en/devel/modules/examples/MyAddress.zip).

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

[comment]: # ({b971a521-5ce71b9d})
### Was Sie erstellen werden

In diesem Tutorial erstellen Sie zunächst ein Frontend-Modul, das einen neuen Menüabschnitt *My Address* hinzufügt,
und wandeln es anschließend in ein [fortgeschritteneres](#part-iii--module-action) Frontend-Modul um, das eine HTTP-Anfrage an *https://api.seeip.org*
sendet und die Antwort – die IP-Adresse Ihres Computers – auf einer neuen Seite im neu erstellten Menüabschnitt *My Address* anzeigt.
So wird das fertige Modul aussehen:

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

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

[comment]: # ({a5c86d2c-8c2bcd9e})
### Teil I - Neuer Menübereich

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

[comment]: # ({9c416cbb-1d4de634})
##### Ein leeres Modul zum Zabbix Frontend hinzufügen

1. Erstellen Sie im Verzeichnis *modules* Ihrer Zabbix-Frontend-Installation ein Verzeichnis *MyAddress* (zum Beispiel *zabbix/ui/modules*).

2. Erstellen Sie eine Datei *manifest.json* mit grundlegenden Modul-Metadaten (siehe die Beschreibung der unterstützten [Parameter](../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. Gehen Sie im Zabbix Frontend zum Abschnitt *Administration → General → Modules* und klicken Sie auf die Schaltfläche *Scan directory*.

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

4. Suchen Sie das neue Modul *My IP Address* in der Liste und klicken Sie auf den Hyperlink „Disabled“, um den Status des Moduls von „Disabled“ auf „Enabled“ zu ändern (falls das Modul nicht aufgeführt ist, siehe den Abschnitt [Fehlerbehebung](/manual/extensions/frontendmodules#installation)).

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

Das Modul ist jetzt im Frontend registriert. Es ist jedoch noch nicht sichtbar, da Sie die Funktionalität des Moduls noch definieren müssen.
Sobald Sie dem Modulverzeichnis Inhalte hinzufügen, sehen Sie die Änderungen im Zabbix Frontend sofort nach dem Aktualisieren der Seite.

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

[comment]: # ({db062f15-d88b8114})
##### Einen Menüabschnitt erstellen

1. Erstellen Sie eine Datei *Module.php* im Verzeichnis *MyAddress*.

Diese Datei implementiert eine neue Klasse *Module*, die die Standardklasse *CModule* erweitert.
Die Klasse *Module* fügt dem Hauptmenü einen neuen Menüabschnitt *My Address* hinzu.

Die Methode *setAction()* gibt eine Aktion an, die beim Klicken auf den Menüabschnitt ausgeführt wird.
Für den Anfang können Sie die vordefinierte Aktion *userprofile.edit* verwenden, die die Seite *Benutzerprofil* öffnet.
In [Teil III](#part-iii--module-action) dieses Tutorials erfahren Sie, wie Sie eine benutzerdefinierte Aktion erstellen.

**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
Sie können `'userprofile.edit'` durch andere Aktionen ersetzen, zum Beispiel `'charts.view'` (öffnet benutzerdefinierte Diagramme), `'problems.view'` (öffnet *Monitoring → Probleme*) oder `'report.status'` (öffnet den Bericht *Systeminformationen*).
:::

3. Aktualisieren Sie das Zabbix Frontend. Unten im Zabbix-Hauptmenü gibt es jetzt einen neuen Abschnitt *My Address*.
Klicken Sie auf *My Address*, um die Seite *Benutzerprofil* zu öffnen.

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

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

[comment]: # ({89dbfda8-5c3fc480})
### Teil II – Änderung der Position des Menüabschnitts

In diesem Teil verschieben Sie den Menüabschnitt *Meine Adresse* in den Abschnitt *Überwachung* und fügen ihm dann ein verschachteltes Menü hinzu.
Dadurch können Benutzer vom Menüabschnitt *Überwachung → Meine Adresse* auf zwei Untermenüseiten zugreifen.

1. Öffnen und bearbeiten Sie die Datei *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. Aktualisieren Sie das Zabbix-Frontend. Erweitern Sie den Menüabschnitt *Monitoring* und beachten Sie, dass sich der Abschnitt *My address* jetzt unter dem Abschnitt *Discovery* befindet.

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

3. Um verschachtelte Seiten zum Menüabschnitt *My Address* hinzuzufügen, öffnen und bearbeiten Sie die Datei *Module.php* erneut.

Dieser Schritt erstellt zwei Unterabschnitte:

- *Externe IP*, die eine neue „my.address“-Aktion ausführt, die in den nächsten Schritten definiert wird;
- *Benutzerprofil*, das die vordefinierte „userprofile.edit“-Aktion ausführt, um die Seite „Benutzerprofil*“ zu öffnen.

Beachten Sie, dass Sie für das verschachtelte Menü zusätzlich zu den in den vorherigen Schritten verwendeten Klassen, die Klasse *CMenu* verwenden müssen.

**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. Aktualisieren Sie das Zabbix-Frontend. Beachten Sie, dass der Menüabschnitt *My address* jetzt ein Menü der dritten Ebene mit zwei Seiten enthält - *External IP* und *User profile*.

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

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

[comment]: # ({6061bdad-8798eff6})
### Teil III – Modulaktion

Eine Aktion wird in zwei Dateien implementiert – *actions/MyAddress.php* und *views/my.address.php*.
Die Datei ***actions/MyAddress.php*** kümmert sich um die Implementierung der Geschäftslogik, während die Datei ***views/my.address.php*** für die Ansicht zuständig ist.

1. Erstellen Sie ein Verzeichnis *actions* im Verzeichnis *MyAddress*.

2. Erstellen Sie die Datei *MyAddress.php* im Verzeichnis *actions*.

Die Aktionslogik wird in der Klasse *MyAddress* definiert.

Diese Aktionsklasse implementiert vier Funktionen: *init()*, *checkInput()*, *checkPermissions()* und *doAction()*.
Das Zabbix-Frontend ruft die Funktion *doAction()* auf, wenn die Aktion angefordert wird.

Diese Funktion ist für die Geschäftslogik des Moduls zuständig.

::: noteimportant
Die Daten müssen als assoziatives Array organisiert sein.
Das Array kann mehrdimensional sein und alle von der Ansicht erwarteten Daten enthalten.
:::

**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. Erstellen Sie ein neues Verzeichnis *views* im Verzeichnis *MyAddress*.

4. Erstellen Sie eine Datei *my.address.php* im Verzeichnis *views* und definieren Sie die Modulansicht.

Beachten Sie, dass die Variable `$data` in der Ansicht verfügbar ist, ohne dass sie speziell definiert werden muss.
Das Framework übergibt das assoziative Array automatisch an die Ansicht.

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

```php
<?php

(new CHtmlPage())
->setTitle(_('Der HTML-Titel der Seite „Meine Adresse“))
->addItem(new CDiv($data['my-ip']))
->show();
```

5. Die Modulaktion muss in der Datei *manifest.json* registriert werden. Öffnen Sie *manifest.json* und fügen Sie ein neues Objekt „actions“ hinzu, das Folgendes enthält:

- den Aktionsschlüssel mit dem Aktionsnamen in Kleinbuchstaben (a-z) und mit durch Punkte getrennten Wörtern (z. B. „my.address“);
- den Aktionsklassennamen („MyAddress“) als Wert für den Schlüssel „class“ des Objekts „my.address“;
- den Aktionsansichtsnamen („my.address“) als Wert für den Schlüssel „view“ des Objekts „my.address“.

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

```json
{
"manifest_version": 2.0,
"id": "my-address",
"name": "Meine IP-Adresse",
"version": "1.0",
"namespace": "MyAddress",
"description": "Meine externe IP-Adresse.",
"actions": {
"my.address": {
"class": "MyAddress",
"view": "my.address"
}
}
}
```

6. Aktualisieren Sie das Zabbix-Frontend. Klicken Sie auf *Meine Adresse → Externe IP*, um die IP-Adresse Ihres Computers anzuzeigen.

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

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