# Ein Plugin erstellen

Dieser Leitfaden führt durch die Erstellung eines einfachen Chamilo-Plugins. Für weitere Details siehe die [Plugin-Entwicklung Wiki-Seite](https://github.com/chamilo/chamilo-lms/wiki/Plugin-development).

## Schritt 1: Plugin-Verzeichnis erstellen

Erstellen Sie ein Verzeichnis in `public/plugin/`. Der Verzeichnisname sollte mit dem Identifikator Ihres Plugins übereinstimmen:

```
public/plugin/MyPlugin/
```

## Schritt 2: Plugin-Klasse definieren

Erstellen Sie `src/MyPluginPlugin.php`. Die Klasse erweitert `Plugin` und folgt dem Singleton-Muster:

```php
<?php

class MyPluginPlugin extends Plugin
{
    protected function __construct()
    {
        $settings = [
            'tool_enable' => 'boolean',
            'api_key'     => 'text',
        ];
        parent::__construct('1.0', 'Your Name', $settings);
    }

    public static function create(): static
    {
        static $instance = null;
        return $instance ??= new static();
    }
}
```

### Verfügbare Einstellungstypen

| Typ        | Beschreibung                             |
| ---------- | ---------------------------------------- |
| `boolean`  | Kontrollkästchen an/aus                  |
| `text`     | Einzeiliges Texteingabefeld              |
| `select`   | Dropdown (Array `options` bereitstellen) |
| `wysiwyg`  | Rich-Text-Editor                         |
| `html`     | Rohes HTML-Feld                          |
| `checkbox` | Kontrollkästchen                         |
| `user`     | Benutzerauswahl                          |

Für `select`-Einstellungen:

```php
$settings = [
    'mode' => [
        'type'             => 'select',
        'options'          => ['auto' => 'Automatic', 'manual' => 'Manual'],
        'translate_options' => true,
    ],
];
```

Zugriff auf Einstellungen zur Laufzeit:

```php
$plugin = MyPluginPlugin::create();
$key  = $plugin->get('api_key');       // einzelner Wert
$all  = $plugin->get_settings();       // alle Einstellungen
```

## Schritt 3: plugin.php erstellen

`plugin.php` im Plugin-Stammverzeichnis ist **erforderlich**. Es muss `$plugin_info` zuweisen:

```php
<?php
$plugin_info = MyPluginPlugin::create()->get_info();
```

## Schritt 4: Installations- und Deinstallationsskripte erstellen

`install.php`:

```php
<?php
MyPluginPlugin::create()->install();
```

`uninstall.php`:

```php
<?php
MyPluginPlugin::create()->uninstall();
```

Implementieren Sie die tatsächliche Schema-Erstellung/-Löschung innerhalb der Klasse mit Doctrine's `SchemaTool`.

## Schritt 5: Übersetzungen hinzufügen

Erstellen Sie Sprachdateien in `lang/` unter Verwendung von Lokalisierungscodes (z. B. `en_US.php`, `fr_FR.php`, `es_ES.php`). Die Standarddatei ist `en_US.php`.

```php
<?php
// lang/en_US.php
$strings['plugin_title']   = 'My Plugin';
$strings['plugin_comment'] = 'Description of what this plugin does.';
$strings['tool_enable']    = 'Enable plugin';
$strings['api_key']        = 'API Key';
$strings['api_key_help']   = 'Enter the API key from your account.';
```

Zugriff auf Übersetzungen über `$plugin->get_lang('key')`.

## Schritt 6: Inhalte über Anzeigebereiche einfügen

Plugins können HTML in 18 vordefinierte Bereiche des Vue-Frontends einfügen. Überschreiben Sie `renderRegion()` in Ihrer Klasse:

```php
public function renderRegion(string $region): string
{
    if ('header_right' !== $region) {
        return '';
    }
    return '<div class="my-plugin-widget">Hello!</div>';
}
```

Verfügbare Bereiche umfassen: `content_bottom`, `content_top`, `course_tool_plugin`, `footer_center`, `footer_left`, `footer_right`, `header_center`, `header_left`, `header_main`, `header_right`, `login_bottom`, `login_top`, `main_bottom`, `main_top`, `menu_administrator`, `menu_bottom`, `menu_top`, `pre_footer`.

## Schritt 7: Auf Plattformereignisse reagieren (optional)

Plugins können auf Plattformereignisse mit Symfony-Event-Subscribern reagieren. Erstellen Sie eine Datei, die auf `EventSubscriber.php` endet, in `src/EventSubscriber/` — sie wird automatisch über `PluginEventSubscriberPass` registriert.

```php
<?php
// src/EventSubscriber/MyPluginEventSubscriber.php

use Chamilo\CoreBundle\Event\Events;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class MyPluginEventSubscriber implements EventSubscriberInterface
{
    private MyPluginPlugin $plugin;

    public function __construct()
    {
        // Plugin-Klassen sind keine Symfony-Dienste — verwenden Sie das create()-Singleton.
        $this->plugin = MyPluginPlugin::create();
    }

    public static function getSubscribedEvents(): array
    {
        return [
            Events::COURSE_CREATED => 'onCourseCreated',
        ];
    }

    public function onCourseCreated($event): void
    {
        if (!$this->plugin->isEnabled()) {
            return;
        }
        // Ihre Logik hier
    }
}
```

Eine vollständige Liste der verfügbaren Ereignisse (Benutzer, Kurs, Sitzung, LP, Übung, Portfolio, Authentifizierung und mehr) finden Sie in `src/CoreBundle/Event/Events.php`.

## Schritt 8: Lifecycle-Hooks

Überschreiben Sie diese Methoden in Ihrer Plugin-Klasse, um auf Plattformaktionen zu reagieren:

| Methode                                   | Ausgelöst, wenn                                                            |
| ----------------------------------------- | -------------------------------------------------------------------------- |
| `install()`                               | Plugin wird aktiviert                                                      |
| `uninstall()`                             | Plugin wird entfernt                                                       |
| `performActionsAfterConfigure()`          | Administrator speichert das Konfigurationsformular                         |
| `course_settings_updated(array $values)`  | Einstellungen auf Kursebene ändern sich                                    |
| `validateCourseSetting(string $variable)` | Kurseinstellung wird gespeichert (geben Sie `false` zurück, um abzulehnen) |
| `doWhenDeletingUser(int $userId)`         | Ein Benutzer wird gelöscht                                                 |
| `doWhenDeletingCourse(int $courseId)`     | Ein Kurs wird gelöscht                                                     |
| `doWhenDeletingSession(int $sessionId)`   | Eine Sitzung wird gelöscht                                                 |

## Schritt 9: Aktivieren

Melden Sie sich als Administrator an, navigieren Sie zu **Plugins verwalten**, suchen Sie Ihr Plugin und klicken Sie auf **Aktivieren**.

## Tipps

* **Folgen Sie bestehenden Plugins als Beispiele** — `public/plugin/HelloWorld/` und `public/plugin/TopLinks/` sind gute einfache Referenzen
* **Verwenden Sie Übersetzungen** — Nutzen Sie immer das `lang/`-System für benutzerorientierte Texte
* **Aufräumen bei Deinstallation** — Entfernen Sie Datenbanktabellen und Einstellungen im Deinstallationsskript
* **Überprüfen Sie den Aktivierungsstatus** — Rufen Sie in Event-Subscribern immer `$this->plugin->isEnabled()` auf, bevor Sie Logik ausführen


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.chamilo.org/2.x-de/entwicklerhandbuch/developer-guide/plugins/creating-a-plugin.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
