# Plugin Development ## Plugin types CodePress kent twee soorten plugins, bepaald door het `type` veld in `plugin.json`: - **Content plugins** (`type: "content"`) — Verschijnen in de sidebar en in de plugin selectie op content-edit pagina's. Bieden sidebar content via `getSidebarContent()`. - **Systeem plugins** (`type: "system"`) — Worden geladen door PluginManager maar verschijnen NIET in de sidebar. Bieden functionaliteit via admin menu, routes en de CMSAPI. Bij afwezigheid van een `type` veld wordt `content` aangenomen. ## Plugin structuur ``` plugins/MijnPlugin/ ├── MijnPlugin.php # Plugin code (NIET plugin.php) ├── plugin.json # Metadata met type veld ├── config.json # Optionele configuratie └── assets/ ├── scss/mijnplugin.scss # SCSS bron (optioneel) └── css/mijnplugin.css # CSS (handmatig onderhouden) ``` Plugin bestanden heten `.php` (bijv. `Navigation.php`, `HTMLBlock.php`). `PluginManager` laadt `$pluginDir . '/' . $pluginName . '.php'`. ## plugin.json ```json { "name": "Mijn Plugin", "version": "1.0.0", "author": "Jouw Naam", "description": "Beschrijving", "type": "content" } ``` - `name` — Weergavenaam - `type` — `"content"` of `"system"` (default: `content`) ## Content plugin voorbeeld ```php 'Mijn Plugin', 'type' => 'content', ]; } public function getSidebarContent(): string { return '

Hello World

'; } } ``` ## Systeem plugin voorbeeld ```php 'Mijn Systeem', 'type' => 'system', ]; } public function getAdminMenu(): array { return [ ['label' => 'Mijn Systeem', 'route' => 'mijn-systeem', 'icon' => 'bi-gear'], ]; } public function getAdminRoutes(): array { return ['mijn-systeem']; } public function handleAdminRoute(string $route): void { echo '

Mijn Systeem pagina

'; } } ``` Systeem plugins worden via `PluginManager::getAdminMenuItems()` in de admin sidebar getoond en via `PluginManager::handleAdminRoute()` afgehandeld. ## CMSAPI gebruiken ```php getConfig(); $page = $api->getPage($path); ``` `setAPI()` wordt automatisch aangeroepen door `PluginManager` als de plugin de methode heeft. ## Plugin CSS - Plugin CSS in `assets/css/` is handmatig te onderhouden (SCSS compilatie voor plugins is nog niet automatisch) - Plugin CSS wordt automatisch geladen ná theme CSS (in `base.twig`), zodat thema's plugin styling kunnen overschrijven - Plugin assets worden geserveerd via `cms/router.php` op URL `/plugins//assets/...` - Implementeer `getCssUrl()` in de plugin klasse om de CSS URL terug te geven ```php public function getCssUrl(): string { return '/plugins/MijnPlugin/assets/css/mijnplugin.css'; } ``` ## Hooks en filters PluginManager auto-registert deze methoden als hooks/filters: - **Hooks**: `onPageLoad`, `onBeforeRender`, `onAfterRender`, `onSearch`, `onMenuBuild` - **Filters**: `onContentFilter`, `onTitleFilter`, `onMenuFilter` ```php public function onPageLoad($page) { /* ... */ } public function onContentFilter($content) { return $content; } ``` ## Essentiële plugins Essentiële plugins zijn gedefinieerd in `getProtectedPlugins()` in `public/admin.php`. Huidige essentiële plugin: **Navigation**. Deze plugins kunnen niet worden gedeactiveerd, bewerkt of verwijderd. Voeg altijd de `isProtectedPlugin()` check toe aan nieuwe plugin handlers.