First Steps
Einen Webserver bauen
Jedes Plugin in Neleto ist einfach ein normaler Webserver mit einigen JSON-REST-Endpunkten. Diese Endpunkte können verschiedene Zwecke erfüllen. Sie können verwendet werden, um gerendertes HTML zu manipulieren, bevor es an den Client gesendet oder gecached wird, oder sie können Funktionen oder Helfer für den Renderer selbst definieren. Hier sind die Typen (wir verwenden TypeScript als Beispiel, aber du kannst dein Plugin in jeder Sprache bauen):
Rewriter-Endpunkt
Dieser Endpunkt kann unter rewriter in deiner plugin.json angegeben werden.
// Der Body der Anfrage, die dieser Endpunkt erhält, sieht so aus:
type Body = string;
// Und die Antwort muss so aussehen:
type Response = string;
Helper-Endpunkt
Dieser Endpunkt kann im Array unter helpers in deiner plugin.json verwendet werden.
// Der Body der Anfrage, die dieser Endpunkt erhält, sieht so aus:
type Body = {
// der Name des aufgerufenen Helpers
name: string;
args: JsonValue[]; // jeder Wert, der gültiges JSON ist
};
// Und die Antwort muss so aussehen:
type Response = {
// jeder Wert, der gültiges JSON ist, dies muss mit dem VariableType im
// `type`-Abschnitt dieses Helper-Endpunkts in deiner `plugin.json` übereinstimmen
data: JsonValue;
};
Seiten-Endpunkt
Dieser Endpunkt kann im Array unter pages in deiner plugin.json verwendet werden.
Seiten-Endpunkte sind normale Endpunkte, die die Anfrage direkt vom Client weitergeleitet bekommen. Sie können auch alles zurückgeben, da sie auch als API-Endpunkt fungieren können.
Admins und Entwickler können im CMS für jeden von Plugins definierten Seiten-Endpunkt ein Layout auswählen. Wenn ein Seiten-Endpunkt ein Layout zugewiesen hat, wird die Anfrage an diesen Endpunkt in eine POST-Anfrage umgewandelt und das gerenderte Layout wird im Body der Anfrage enthalten sein. Die Antwort wird nicht verändert.
Das gerenderte Layout enthält ein einzelnes <slot></slot>-Element, das die Stelle markiert, an der der Seiteninhalt eingefügt wird. Ersetze es durch deinen Inhalt und gib das vollständige HTML-Dokument zurück:
const layout = await request.text();
const page = layout.replace(/<slot[^>]*><\/slot>/g, yourContent);
return new Response(page, { headers: { "Content-Type": "text/html" } });
Das Layout rendert die aktuelle Seitensprache als <html lang="…"> – lies sie aus, um deinen Inhalt zu lokalisieren – und liefert einen leeren <title></title>. Setze den Titel sowie Meta-/Open-Graph-Tags selbst, indem du das Layout vor der Rückgabe anpasst.
Mehrere Sprachen
Neleto liefert nicht-Standard-Sprachen unter einem Pfad-Präfix aus (zum Beispiel /en/deine-seite). Damit der Sprachumschalter des Layouts funktioniert, definiere sowohl die einfache als auch die sprach-präfixierte Route, sodass beide dein Plugin erreichen, und lies die aktive Sprache aus dem <html lang> des Layouts:
"pages": [
{ "route": "/deine-seite/:slug", "allow_select_layout": true },
{ "route": "/:lang/deine-seite/:slug", "allow_select_layout": true }
]
Api-Endpunkt
Dieser Endpunkt kann im Array unter api in deiner plugin.json verwendet werden.
Api-Endpunkte ähneln Seiten-Endpunkten, außer dass ihr Zugriff so kontrolliert werden kann, dass er nur für eingeloggte Benutzer mit einer bestimmten Rolle zugänglich ist. Api-Endpunkte werden durch das CMS-Backend mit dem Routen-Präfix /api/rest/plugin/<plugin-name>/api weitergeleitet. Das bedeutet, dass eine Route, die dein Plugin als /foo definiert, unter /api/rest/plugin/<dein-plugin-name>/api/foo verfügbar sein wird. Query, Body und die Anfrage-Methode werden beim Weiterleiten nicht verändert, es wird nur auf gültige Authentifizierung und die korrekte Benutzerrolle geprüft.
Ui-Endpunkt
Der Ui-Endpunkt ähnelt Api-Endpunkten, da er nur für eingeloggte Benutzer zugänglich ist. Der einzige Unterschied ist, dass die Benutzerrolle für diesen Endpunkt nicht geprüft wird und dass er verwendet wird, um eine benutzerdefinierte Admin-Oberfläche für dein Plugin bereitzustellen. Du kannst nur einen Ui-Endpunkt in deiner plugin.json definieren, da dieser eine Endpunkt als Einstiegspunkt für die Benutzeroberfläche deines Plugins in einem Iframe verwendet wird.
Dein Plugin-Server kann auf mehr als einem Endpunkt lauschen, und du kannst Links verwenden, um zwischen ihnen zu navigieren, aber diese Links müssen das Präfix /api/rest/plugin/<dein-plugin-name>/ui haben.