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.