Aide-mémoire pour le développement de plugins

Lorsque vous écrivez un plugin, vous vous demandez souvent « dans quel fichier dois-je écrire ceci, et quelle API appeler ? ». Cet aide-mémoire vous aide à vous repérer rapidement.

Structure du répertoire d'un plugin

Créez un plugin avec yarn pm create @my-project/plugin-name : la structure de répertoire suivante sera générée automatiquement. Ne créez pas les répertoires à la main, vous risqueriez d'oublier des étapes d'enregistrement et le plugin ne fonctionnerait pas. Voir Écrire votre premier plugin pour plus de détails.

plugin-name/
├── src/
   ├── client-v2/              # Code client (v2)
   ├── plugin.tsx          # Point d'entrée du plugin client
   ├── locale.ts           # Hooks de traduction useT / tExpr
   ├── models/             # FlowModel (blocs, champs, actions)
   └── pages/              # Composants de page
   ├── client/                 # Code client (v1, compatibilité)
   ├── plugin.tsx
   ├── locale.ts
   ├── models/
   └── pages/
   ├── server/                 # Code serveur
   ├── plugin.ts           # Point d'entrée du plugin serveur
   └── collections/        # Définitions de tables de données
   └── locale/                 # Fichiers de traduction multilingue
       ├── zh-CN.json
       └── en-US.json
├── client-v2.js                # Point d'entrée à la racine (cible du build)
├── client-v2.d.ts
├── client.js
├── client.d.ts
├── server.js
├── server.d.ts
└── package.json

Côté client : ce que je veux faire → comment l'écrire

Ce que je veux faireDans quel fichierQuelle API appelerDocumentation
Enregistrer une route de pageload() de plugin.tsxthis.router.add()Router
Enregistrer une page de configuration de pluginload() de plugin.tsxpluginSettingsManager.addMenuItem() + addPageTabItem()Router
Enregistrer un bloc personnaliséload() de plugin.tsxthis.flowEngine.registerModelLoaders()FlowEngine → Extension de bloc
Enregistrer un champ personnaliséload() de plugin.tsxthis.flowEngine.registerModelLoaders()FlowEngine → Extension de champ
Enregistrer une action personnaliséeload() de plugin.tsxthis.flowEngine.registerModelLoaders()FlowEngine → Extension d'action
Faire apparaître une table interne dans la sélection de tables des blocsload() de plugin.tsxmainDS.addCollection()Tables de données Collections
Traduire le contenu textuel du pluginlocale/zh-CN.json + locale/en-US.jsonInternationalisation i18n

Côté serveur : ce que je veux faire → comment l'écrire

Ce que je veux faireDans quel fichierQuelle API appelerDocumentation
Définir une table de donnéesserver/collections/xxx.tsdefineCollection()Tables de données Collections
Étendre une table existanteserver/collections/xxx.tsextendCollection()Tables de données Collections
Enregistrer une API personnaliséeload() de server/plugin.tsthis.app.resourceManager.define()ResourceManager
Configurer les permissions d'APIload() de server/plugin.tsthis.app.acl.allow()Contrôle d'accès ACL
Insérer des données initiales à l'installationinstall() de server/plugin.tsthis.db.getRepository().create()Plugin

Aide-mémoire FlowModel

Ce que je veux faireClasse parente à étendreAPI clés
Faire un bloc d'affichage simpleBlockModelrenderComponent() + define()
Faire un bloc lié à une table de données (rendu personnalisé)CollectionBlockModelcreateResource() + renderComponent()
Faire un bloc tableau complet (sur la base du tableau intégré)TableBlockModelfilterCollection() + customModelClasses
Faire un composant d'affichage de champClickableFieldModelrenderComponent(value) + bindModelToInterface()
Faire un bouton d'actionActionModelstatic scene + registerFlow({ on: 'click' })

Aide-mémoire des méthodes de traduction

ScénarioQuoi utiliserD'où l'importer
Dans load() du Pluginthis.t('key')Fournie par la classe Plugin
Dans un composant Reactconst t = useT(); t('key')locale.ts
Définition statique d'un FlowModel (define(), registerFlow())tExpr('key')locale.ts

Aide-mémoire des appels d'API courants

Ce que je veux faireDans le PluginDans un composant
Envoyer une requête APIthis.context.api.request()ctx.api.request()
Obtenir une traductionthis.t()useT()
Obtenir le loggerthis.context.loggerctx.logger
Enregistrer une routethis.router.add()
Naviguer entre les pagesctx.router.navigate()
Ouvrir une boîte de dialoguectx.viewer.dialog()

Liens connexes