Construire un module d’extension pour StudioCMS est un moyen puissant d’étendre les fonctionnalités de StudioCMS. Il offre une solution simple et flexible pour ajouter de nouvelles fonctionnalités à votre projet StudioCMS. Voici un exemple simple de création et de fonctionnement d’un module d’extension pour StudioCMS.
Pour commencer, vous devez créer un nouveau module d’extension pour StudioCMS. Voici un exemple de structure de fichier pour un module d’extension pour StudioCMS :
Dans le fichier principal src/index.ts, vous définirez le module d’extension pour StudioCMS. Voici un exemple de définition d’un module d’extension pour StudioCMS incluant une intégration Astro pour créer un blog simple :
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:'mon-module-extension',
StudioCMSPlugin.name: string
The name of the plugin, displayed in the StudioCMS Dashboard.
name:"Mon module d'extension",
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.
// Définir les éléments de la grille pour le tableau de bord
// Voici les éléments qui seront affichés dans le tableau de bord de StudioCMS
// Vous pouvez définir autant d’éléments que vous le souhaitez
// Dans cet exemple, nous définissons un seul élément, qui a une étendue de 2, qui nécessite l’autorisation `editor` et qui injecte un composant Astro qui remplace l’élément personnalisé HTML simple.
dashboardGridItems?: GridItemInput[] | undefined
dashboardGridItems:[
{
GridItemInput.name: string
The name of the grid item.
name:'exemple',
GridItemInput.span: 1 | 2 | 3
The span of the grid item, which can be 1, 2, or 3.
span:2,
GridItemInput.variant: "default" | "filled"
The variant of the grid item, which can be 'default' or 'filled'.
// Utilisez toujours du HTML brut sans `-` ni caractères spéciaux dans les balises, ils seront remplacés par le composant Astro et ce HTML ne sera jamais affiché
html: string
The HTML content of the body.
html:'<examplegriditem></examplegriditem>',
components?: Record<string, string>
The components within the body.
Optional.
components:{
// Injecter le composant Astro pour remplacer l’élément personnalisé HTML brut
// Lors de la création de pagesTypes, vous pouvez également définir un `pageContentComponent` si votre module d’extension nécessite un éditeur de contenu personnalisé.
// pageTypes: [{ identifier: 'mon-module-extension', label: "Article de blog (Mon module d’extension)", pageContentComponent: resolve('./components/MyContentEditor.astro') }],
// Dans cet exemple, nous pouvons utiliser l’éditeur de contenu par défaut (Markdown).
label:"Article de blog (Mon module d'extension)"}],
})
}
}
});
}
L’exemple ci-dessus définit un module d’extension pour StudioCMS incluant une intégration Astro et permettant de créer un exemple de blog simple. Le module d’extension inclut une route injectée dans le projet StudioCMS et un élément de grille affiché dans le tableau de bord de StudioCMS.
Dans le fichier src/routes/[...slug].astro, vous définirez la route du module d’extension. Voici un exemple de définition d’une route pour le module d’extension. Nous la diviserons en deux parties : la première est le frontmatter (entre les barrières ---), et la seconde est le modèle HTML placé sous la seconde barrière ---.
VanillaJS Version of the SDKCore. Most internal functions will still contain Effects, you can use runSDK from the 'studiocms:sdk' to run these as normal async functions
@example
import { SDKCoreJs, runSDK } from'studiocms:sdk';
constpages = awaitrunSDK(SDKCoreJs.GET.pages());
SDKCoreJs,
construnSDK: <A, E>(effect: Effect<A, E, never>) =>Promise<A>
Utility function for running components of the SDKCoreJs
@example
import { SDKCoreJs, runSDK } from'studiocms:sdk';
constpages = awaitrunSDK(SDKCoreJs.GET.pages());
runSDK}from'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}`;
}
// 'mon-module-extension' est ici utilisé comme identifiant pour
// le type de page de la définition du module d’extension
VanillaJS Version of the SDKCore. Most internal functions will still contain Effects, you can use runSDK from the 'studiocms:sdk' to run these as normal async functions
Returns the value of the first element in the array where predicate is true, and undefined
otherwise.
@param ― predicate find calls predicate once for each element of the array, in ascending
order, until it finds one where predicate returns true. If such an element is found, find
immediately returns that element value. Otherwise, find returns undefined.
@param ― thisArg If provided, it will be used as the this value for each invocation of
predicate. If it is not provided, undefined is used instead.
L’exemple ci-dessus définit une route dynamique^ pour le module d’extension qui affiche une liste d’articles de blog lorsqu’aucun slug n’est fourni et affiche le contenu d’un article de blog lorsqu’un slug est fourni.
Dans le fichier src/dashboard-grid-items/MyPluginGridItem.astro, vous définirez l’élément de grille du module d’extension. Voici un exemple de définition d’un élément de grille pour le module d’extension :
MyPluginGridItem.astro
---
import{SDKCoreJs, runSDK}from'studiocms:sdk';
// 'mon-module-extension' est ici utilisé comme identifiant pour
// le type de page à partir de la définition du module d’extension
L’exemple ci-dessus définit un élément de grille pour le module d’extension qui affiche les 5 pages les plus récemment mises à jour au cours des 30 derniers jours. Cet élément inclut une liste de liens vers la page de modification de la gestion de contenu pour chaque page.
Intégration avec les assistants FrontendNavigationLinks
Si vous souhaitez utiliser les assistants de navigation intégrés de StudioCMS dans votre projet, de la même manière que le fait le module d’extension @studiocms/blog, vous pouvez créer un composant Navigation.astro personnalisé :
L’exemple ci-dessus définit un composant personnalisé Navigation.astro qui utilise les assistants de navigation intégrés de StudioCMS pour créer un menu de navigation pour le projet. Ce composant inclut des liens vers l’URL du site principal, la page d’index et toutes les autres pages configurées pour s’afficher dans la navigation.
Il vous suffit d’ajouter quelques styles et vous disposez d’un menu de navigation entièrement fonctionnel qui fonctionne avec les assistants de navigation intégrés de StudioCMS.