Erweiterungs-Entwicklung

PureWiki verfügt über ein robustes Erweiterungssystem, das es Entwicklern ermöglicht, benutzerdefinierte Funktionen, Editor.js-Plugins, Einstellungsseiten und API-Routen hinzuzufügen, ohne den Core-Code zu ändern.

 Eine voll funktionsfähige Referenzimplementierung findest du im PureWiki-Repository für Beispiel-Erweiterungen:
https://github.com/PureWiki/example-extension

Du kannst dieses Repository klonen und es als Startpunkt für deine eigene Erweiterungsentwicklung verwenden.

Verzeichnisstruktur

Jede Erweiterung befindet sich in einem eigenen Verzeichnis unter /extensions/<extension-id>/. Der Ordnername muss mit der in den Metadaten definierten ID übereinstimmen.

extensions/meine-erweiterung/
├── meta.json          # Erforderlich: Metadaten (ID, Version, Autor)
├── extension.php      # Erforderlich: Registriert alle Hooks
├── settings.php       # Optional: UI für benutzerdefinierten Einstellungs-Tab
├── api.php            # Optional: Benutzerdefinierte API-Endpunkte
├── assets/            # Optional: CSS/JS-Dateien
├── lang/              # Optional: Übersetzungsdateien (en.json, de.json)
└── editorPlugins/     # Optional: Editor.js Blöcke

Die Datei meta.json

Diese Datei ist obligatorisch und teilt PureWiki mit, wie deine Erweiterung zu finden und zu laden ist.

{
  "id": "meine-erweiterung",
  "name": "Meine Erweiterung",
  "version": "1.0.0",
  "author": "Dein Name",
  "description": "Eine kurze Beschreibung.",
  "url": "Link zur Website oder zum GitHub der Erweiterung",
  "editor_plugins": ["mein-block.js"]
}

Hooks registrieren

Die gesamte Logik wird über Hooks innerhalb von extension.php an das Kernsystem angebunden. Du kannst Filter (zum Ändern von Daten) oder Actions (zum Ausführen von Logik oder zur Ausgabe von HTML) registrieren. 

ExtensionLoader::addHook('frontend.head_css', function($context) {
    echo '<link rel="stylesheet" href="' . ExtensionLoader::getUrl('meine-erweiterung') . '/assets/style.css">';
});

Verfügbare Hooks

Hook-Name Beschreibung
parser.block Block-Daten-Array vor dem Rendern manipulieren.
renderer.html Das final generierte HTML der gesamten Seite nachbearbeiten.
editor.tools / editor.tunes Neue Editor.js Tools/Einstellungen registrieren.
page_settings.fields Benutzerdefinierte HTML-Felder zum Modal für Seiteneinstellungen hinzufügen.
page_settings.save In den Speichervorgang eingreifen, um Seitendaten zu manipulieren.
settings.tabs Einen benutzerdefinierten Tab im globalen Einstellungs-Dashboard registrieren.
api.routes Benutzerdefinierte API-Routen zu PHP-Skripten hinzufügen.
api.admin_actions / api.public_actions API-Routen für die Zugriffskontrolle auf die Whitelist setzen.
admin.head_css / admin.head_js Assets in das Admin-Dashboard injizieren.
frontend.head_css / frontend.head_js / frontend.footer_js Assets in das Frontend injizieren.

Seiteneinstellungen automatisch speichern

Um Felder zum Modal für Seiteneinstellungen hinzuzufügen, die automatisch gespeichert werden, hänge einfach die CSS-Klasse pw-ext-input an dein Input-Element im Hook page_settings.fields an. PureWiki wird den Wert automatisch laden und in den JSON-Daten der Seite speichern.

Erweiterungs-Einstellungen (Persistenz)

Erweiterungen sollten nicht die globale config.json verwenden. Stattdessen kannst du deine eigene Konfiguration mit getExtensionSettings($id) und saveExtensionSettings($id, $data) speichern. Die Daten werden sicher in config/extensions/<id>.json gespeichert.

Internationalisierung (i18n)

Du kannst Übersetzungen bereitstellen, indem du .json Dateien in den Ordner lang/ legst (z. B. en.json, de.json). PureWiki lädt diese automatisch. Um Konflikte zu vermeiden, sind alle Erweiterungsübersetzungen in Namespaces unterteilt. Greife mit __('ext.meine-erweiterung.dein_schluessel') darauf zu.