Die Erstellung eines StudioCMS-Plugins ist eine leistungsstarke Möglichkeit, die Funktionalität von StudioCMS zu erweitern. Sie bieten eine einfache und flexible Möglichkeit, neue Funktionen zu deinem StudioCMS-Projekt hinzuzufügen. Das folgende Beispiel zeigt dir, wie du ein StudioCMS-Plugin erstellst und wie es funktioniert.
Um loszulegen, musst du ein neues StudioCMS-Plugin erstellen. Im Folgenden findest du ein grundlegendes Beispiel für die Dateistruktur eines StudioCMS-Plugins:
In der Hauptdatei src/index.ts definierst du das StudioCMS Plugin. Das folgende Beispiel zeigt, wie du ein StudioCMS-Plugin definierst, das eine Astro-Integration enthält, um ein einfaches Blog-Beispiel zu erstellen:
Creates a Vite virtual module and updates the Astro config.
Virtual imports are useful for passing things like config options, or data computed within the integration.
Creates a Vite virtual module and updates the Astro config.
Virtual imports are useful for passing things like config options, or data computed within the integration.
@param ― options - The configuration options for the plugin.
@returns ― The plugin configuration.
definePlugin({
StudioCMSPlugin.identifier: string
The identifier of the plugin, usually the package name.
identifier:'my-plugin',
StudioCMSPlugin.name: string
The name of the plugin, displayed in the StudioCMS Dashboard.
name:'My Plugin',
StudioCMSPlugin.studiocmsMinimumVersion: string
The minimum version of StudioCMS required for this plugin to function correctly.
This is used to ensure compatibility between the plugin and the StudioCMS core.
It should be a semantic version string (e.g., "1.0.0").
If the plugin is not compatible with the current version of StudioCMS, it should not be loaded.
This is a required field.
@example"1.0.0"
studiocmsMinimumVersion:'0.1.0-beta.8',
integration:
function (localfunction) myIntegration(options: Options): AstroIntegration
myIntegration(
options: Options
options), // Optional, aber empfohlen
Error ts(2353) ― Object literal may only specify known properties, and 'integration' does not exist in type 'StudioCMSPlugin'.
// Definiere die Frontend-Navigationslinks für das Plugin (optional)
// Dies ist nützlich, wenn du die eingebauten StudioCMS-Navigationshilfen in deinem Layout verwendest,
// wie z.B. bei der Verwendung des Plugins `@studiocms/blog`.
frontendNavigationLinks: {
label: string;
href: string;
}[]
frontendNavigationLinks:[{
label: string
label:'Title here',
href: string
href:
options: Options
options?.
Options.route: string
route || 'my-plugin'}],
// Wenn du pageTypes erstellst, kannst du auch eine `pageContentComponent` definieren, wenn dein Plugin einen eigenen Inhaltseditor benötigt.
// In diesem Beispiel ist es in Ordnung, den Standard-Editor (Markdown) zu verwenden.
pageTypes: {
identifier: string;
label: string;
}[]
pageTypes:[{
identifier: string
identifier:'my-plugin',
label: string
label:'Blog Post (My Plugin)'}],
// Definiere die Gitterelemente für das Dashboard
// Dies sind die Elemente, die auf dem StudioCMS Dashboard angezeigt werden
// Du kannst so viele Elemente definieren, wie du willst
// In diesem Beispiel definieren wir ein einzelnes Element, das eine Spannweite von 2 hat und die Berechtigung „Editor“ benötigt. Außerdem injizieren wir eine Astro-Komponente, die das einfache benutzerdefinierte HTML-Element ersetzt.
dashboardGridItems: {
name: string;
span: number;
variant: string;
requiresPermission: string;
header: {
title: string;
icon: string;
};
body: {
html: string;
components: {
examplegriditem: string;
};
};
}[]
dashboardGridItems:[
{
name: string
name:'example',
span: number
span:2,
variant: string
variant:'default',
requiresPermission: string
requiresPermission:'editor',
header: {
title: string;
icon: string;
}
header:{
title: string
title:'Example',
icon: string
icon:'bolt'},
body: {
html: string;
components: {
examplegriditem: string;
};
}
body:{
// Verwende immer einfaches HTML ohne `-` oder Sonderzeichen in den Tags. Sie werden durch die Astro-Komponente ersetzt und dieses HTML wird nie gerendert.
html: string
html:'<examplegriditem></examplegriditem>',
components: {
examplegriditem: string;
}
components:{
// Injiziere die Astro-Komponente, um das einfache benutzerdefinierte HTML-Element zu ersetzen
Das obige Beispiel definiert ein StudioCMS-Plugin, das eine Astro-Integration enthält, um ein einfaches Blog-Beispiel zu erstellen. Das Plugin enthält eine Route, die in das StudioCMS-Projekt injiziert wird, und ein Grid-Element, das auf dem StudioCMS-Dashboard angezeigt wird.
In der Datei src/routes/[...slug].astro definierst du die Route für das Plugin. Das folgende Beispiel zeigt, wie du eine Route für das Plugin definierst. Der erste Teil ist das Frontmatter (zwischen den ----Zeichen) und der zweite Teil ist die HTML-Vorlage, die unter dem zweiten --- eingefügt wird.
Frontmatter
import{
constStudioCMSRenderer: any
StudioCMSRenderer}from'studiocms:renderer';
import
module"studiocms:sdk"
sdkfrom'studiocms:sdk';
import
constconfig: {
route: string;
}
configfrom'myplugin:config';
const
constmakeRoute: (slug: string) =>string
makeRoute = (
slug: string
slug: string)=>{
return`/${
constconfig: {
route: string;
}
config.
route: string
route}/${
slug: string
slug}`;
}
// 'my-plugin' wird hier als Bezeichner für
// den pageType aus der Plugin-Definition verwendet
Das obige Beispiel definiert eine dynamische Route^ für das Plugin, die eine Liste von Blogposts anzeigt, wenn kein Slug angegeben wird, und die den Inhalt eines Blogposts anzeigt, wenn ein Slug angegeben wird.
In der Datei src/dashboard-grid-items/MyPluginGridItem.astro definierst du das Grid Item für das Plugin. Das folgende Beispiel zeigt, wie du ein Grid Item für das Plugin definierst:
MyPluginGridItem.astro
---
import{StudioCMSRoutes}from'studiocms:lib';
importsdkfrom'studiocms:sdk';
// 'my-plugin' wird hier als Bezeichner für
// den pageType aus der Plugin-Definition verwendet
Das obige Beispiel definiert ein Grid-Element für das Plugin, das die 5 zuletzt aktualisierten Seiten der letzten 30 Tage anzeigt. Das Grid-Element enthält eine Liste mit Links zu den Bearbeitungsseiten der einzelnen Seiten im Content Management.
Integration mit den FrontendNavigationLinks Helfern
Wenn du die eingebauten StudioCMS-Navigationshilfen in deinem Projekt verwenden möchtest, ähnlich wie das Plugin @studiocms/blog, kannst du eine eigene Komponente Navigation.astro erstellen:
Das obige Beispiel definiert eine benutzerdefinierte Komponente Navigation.astro, die die eingebauten StudioCMS-Navigationshilfen verwendet, um ein Navigationsmenü für das Projekt zu erstellen. Die Komponente enthält Links zur Haupt-URL der Website, zur Indexseite und zu allen anderen Seiten, die in der Navigation angezeigt werden sollen.
Du musst nur noch ein paar Stile hinzufügen und schon hast du ein voll funktionsfähiges Navigationsmenü, das mit den eingebauten StudioCMS-Navigationshelfern funktioniert.