v2.6.1d (Lyra): Plugin i18n, plugin editor vernieuwd, media invoegen
Plugin internationalisatie: plugins hebben eigen language/ mappen. Systeem plugins volgen admin taal (admin.php), content plugins volgen content taal (site.php). Fallback chain: geselecteerd -> plugin default_language -> CMS default. PluginManager/AdminPluginAPI/CMSAPI uitgebreid met getPluginTranslations()/t(). plugin.json settings ondersteunen label_key/help_key/option_label_key. Plugin uniformiteit: alle 6 plugins hebben uniforme structuur (README.md, assets/.gitkeep, language/nl|en/). plugins/README.md herschreven. guide plugin-development.md (NL+EN) volledig herschreven. Plugin editor vernieuwd: geneste bestandsbrowser zijbalk, nieuw bestand aanmaken, uploaden naar assets/, verwijderen en verplaatsen. Nieuwe routes: plugins-file-upload, plugins-file-delete, plugins-file-move. Path-traversal bescherming + protected plugins geblokkeerd. Media invoegen in editor: nieuw /admin/media-list JSON endpoint + herbruikbare _media-modal.twig include. Plugin-context scant assets/ map. editor-toolbar.js modeMap uitgebreid voor css/scss/js/json. Plugin overzicht knoppen: alleen iconen met title/aria-label. Tests: pentest 30/30, WCAG 2.1 AA 25/25.
This commit is contained in:
@@ -0,0 +1,173 @@
|
||||
# CodePress CMS v2.6.1d — Release Notes
|
||||
|
||||
**Release datum:** 2026-08-18
|
||||
**Codename:** Lyra
|
||||
**Status:** stable
|
||||
|
||||
---
|
||||
|
||||
## Samenvatting
|
||||
|
||||
Deze release richt zich volledig op **plugin-verbeteringen**: plugin internationalisatie (i18n), plugin uniformiteit, en een volledig vernieuwde plugin-editor met bestandsbrowser, uploaden, verwijderen en verplaatsen van bestanden binnen een plugin.
|
||||
|
||||
---
|
||||
|
||||
## Nieuwe features
|
||||
|
||||
### 1. Plugin internationalisatie (i18n)
|
||||
|
||||
Plugins hebben nu hun eigen `language/` map met vertalingen, geïntegreerd met de admin-taal en content-taal.
|
||||
|
||||
- **Systeem plugins** (`type: "system"`) volgen de geselecteerde **admin taal** — vertalingen in `language/<lang>/admin.php`
|
||||
- **Content plugins** (`type: "content"`) volgen de geselecteerde **content taal** — vertalingen in `language/<lang>/site.php`
|
||||
- **Fallback chain**: geselecteerde taal → plugin `default_language` (uit `plugin.json`) → CMS site default → lege array (sleutel wordt ongewijzigd getoond)
|
||||
|
||||
**Core uitbreidingen:**
|
||||
- `PluginManager`: `getPluginDefaultLanguage()`, `getPluginTranslations()`, `getAllPluginTranslations()` met fallback chain
|
||||
- `PluginAPIInterface`: `getPluginTranslations()` + `t()` toegevoegd (contract voor beide API's)
|
||||
- `AdminPluginAPI`: `getAdminLanguage()`, `getPluginTranslations()`, `t()` (systeem plugins)
|
||||
- `CMSAPI`: `getPluginTranslations()`, `t()` (content plugins)
|
||||
|
||||
**Admin integratie:**
|
||||
- `public/admin.php` laadt alle plugin-vertalingen als Twig global `ta_plugins` + functions `tap()` en `plugin_menu_label()`
|
||||
- `handlePluginsConfig()` resolveert `label_key`/`help_key`/`option_label_key` via plugin-vertalingen voor instellingen-labels
|
||||
- Admin sidebar toont vertaalde plugin-menu labels via `plugin_menu_label()`
|
||||
|
||||
**Alle 6 plugins bijgewerkt:**
|
||||
- Dashboard, GeoIPInfo, Logs, Statistics (systeem): `language/nl/admin.php` + `language/en/admin.php`
|
||||
- HTMLBlock, Navigation (content): `language/nl/site.php` + `language/en/site.php`
|
||||
- `plugin.json`: `default_language: "nl"` toegevoegd
|
||||
- Logs en Statistics: instellingen-labels via `label_key`/`help_key` in plaats van hardcoded tekst
|
||||
- Alle hardcoded Nederlandse strings in `handleAdminRoute()`/`getSidebarContent()` vervangen door vertaalde waarden
|
||||
|
||||
### 2. Plugin uniformiteit
|
||||
|
||||
Elke plugin heeft nu een uniforme structuur:
|
||||
|
||||
```
|
||||
plugins/<Plugin>/
|
||||
├── <Plugin>.php # Hoofd plugin class
|
||||
├── plugin.json # Metadata + instellingen
|
||||
├── README.md # Plugin documentatie (uniform format)
|
||||
├── assets/ # CSS/JS/SCSS (.gitkeep als leeg)
|
||||
│ └── ...
|
||||
└── language/ # Vertalingen
|
||||
├── nl/
|
||||
└── en/
|
||||
```
|
||||
|
||||
- Per plugin een `README.md` met uniform format: plugin type, bestandsstructuur, functies, instellingen, taal support
|
||||
- `plugins/README.md` herschreven als korte algemene intro met plugin-overzicht tabel
|
||||
- `guide/nl|en/codepress-developer/plugin-development.md` volledig herschreven (structuur, plugin.json velden incl. `default_language`, settings schema met `label_key`/`help_key`, API methodes incl. `getPluginTranslations`/`t`, admin integratie, taal support sectie)
|
||||
- `guide/nl|en/codepress-developer/architectuur.md` bijgewerkt met plugin `language/` map
|
||||
|
||||
### 3. Plugin editor volledig vernieuwd
|
||||
|
||||
De plugin-editor (`/admin/plugins-edit`) toonde alleen het `<Plugin>.php` bestand. Nu is het een volledige bestandsbeheer-omgeving.
|
||||
|
||||
#### Bestandsbrowser zijbalk
|
||||
- Geneste, inklapbare boomstructuur van alle bestanden in de plugin-map (`.php`, `.json`, `.md`, `.html`, `.css`, `.scss`, `.js`) inclusief `language/` en `assets/` submappen
|
||||
- Mappen die het actieve bestand bevatten worden automatisch uitgeklapt
|
||||
- Iconen per bestandstype (PHP, JSON, MD, CSS, JS, HTML, mappen)
|
||||
- Bootstrap collapse via `<button>` toggles met chevron-rotatie
|
||||
- `scanPluginFiles()` helper — recursieve boom-opbouw met path-traversal bescherming
|
||||
- `editor-toolbar.js` modeMap uitgebreid: `css: 'css'`, `scss: 'css'`, `js: 'javascript'`, `json: 'javascript'`
|
||||
|
||||
#### Nieuw bestand aanmaken
|
||||
- "Nieuw bestand" knop + modal met pad-invoer (bijv. `helper.php` of `assets/css/extra.css`)
|
||||
- Submappen worden automatisch aangemaakt
|
||||
- Stub-content per extensie (`<?php\n` voor PHP, `{\n}\n` voor JSON)
|
||||
- Path-traversal bescherming: `../`/`..\\`/`./` stripping + `..`/`.` segment-guard + realpath prefix-check
|
||||
|
||||
#### Uploaden
|
||||
- Upload-knop + inklapbaar upload-formulier dat bestanden opslaat in `plugins/<naam>/assets/`
|
||||
- Toegestane extensies: afbeeldingen, video, audio, PDF, ZIP, CSS, SCSS, JS, JSON, HTML, MD
|
||||
- Nieuwe route: `plugins-file-upload`
|
||||
- Protected plugins (Navigation) geblokkeerd
|
||||
- Path-traversal bescherming
|
||||
|
||||
#### Verwijderen
|
||||
- Per-bestand prullenbak-icoon in de bestandsboom (altijd zichtbaar, met mouseover-tekst)
|
||||
- Nieuwe route: `plugins-file-delete`
|
||||
- Path-traversal bescherming + protected plugins geblokkeerd + dotfiles geweigerd (`.gitkeep` kan niet verwijderd worden)
|
||||
- Na verwijderen valt de editor terug op het hoofd-bestand
|
||||
|
||||
#### Verplaatsen
|
||||
- Per-bestand verplaats-icoon (pijlen) in de bestandsboom
|
||||
- Nieuwe route: `plugins-file-move` + `pages/plugins-move-form.twig`
|
||||
- Dropdown met alle mappen binnen de plugin (plugin root als optie, huidige map uitgesloten)
|
||||
- `rename()` uitvoering met path-traversal bescherming voor zowel bron als doel
|
||||
- Protected plugins geblokkeerd
|
||||
|
||||
### 4. Media invoegen in editor
|
||||
|
||||
De media-knop in de editor-toolbar was al die tijd stuk — het probeerde een niet-bestaand `#mediaModal` te openen.
|
||||
|
||||
- Nieuw JSON-endpoint `/admin/media-list`: retourneert media-bestanden (recursief), images eerst
|
||||
- Nieuwe herbruikbare Twig include `pages/_media-modal.twig`: Bootstrap modal met zoekfilter en raster van media-bestanden
|
||||
- Laadt media-lijst via `fetch('/admin/media-list')` bij openen
|
||||
- Bij klik wordt een snippet in de CodeMirror-editor ingevoegd op de cursor:
|
||||
- Markdown: ``
|
||||
- HTML/PHP: `<img src="url" alt="naam">` / `<a>` / `<video>` / `<audio>`
|
||||
- CSS/SCSS/JS/JSON: ruwe URL
|
||||
- **Plugin-context**: in de plugin-editor scant het endpoint `plugins/<naam>/assets/` i.p.v. content-map (via `?plugin=` parameter); URLs beginnen met `/plugins/<naam>/assets/`
|
||||
- `admin.twig` includeert het modal wanneer `needs_editor` true is
|
||||
- `editor-toolbar.js` media-case robuuster gemaakt
|
||||
|
||||
### 5. Plugin overzicht knoppen
|
||||
|
||||
De knoppen op de plugin-kaarten (`/admin/plugins`) tonen nu alleen iconen met mouseover-tekst (`title` + `aria-label`) in plaats van icoon + tekst, zodat ze netjes naast elkaar passen in de `btn-group w-100`.
|
||||
|
||||
---
|
||||
|
||||
## Bug fixes
|
||||
|
||||
- **Admin taal niet geïntegreerd met plugins** — opgelost via plugin i18n systeem (zie boven)
|
||||
- **Plugin editor toonde alleen `<Plugin>.php`** — opgelost via bestandsbrowser (zie boven)
|
||||
- **Media-knop in editor werkte niet** — `#mediaModal` bestond niet; opgelost via nieuwe media-modal include
|
||||
- **Plugin editor uploaden/verwijderen/verplaatsen ontbrak** — toegevoegd (zie boven)
|
||||
- **Plugin-kaart knoppen tekst liep niet goed** — teksten verwijderd, alleen iconen met title
|
||||
|
||||
---
|
||||
|
||||
## Technische details
|
||||
|
||||
### Nieuwe routes
|
||||
- `media-list` — JSON endpoint voor media-bestanden
|
||||
- `plugins-file-upload` — bestanden uploaden naar plugin assets/
|
||||
- `plugins-file-delete` — bestand verwijderen uit plugin
|
||||
- `plugins-file-move` — bestand verplaatsen binnen plugin
|
||||
|
||||
### Nieuwe bestanden
|
||||
- `admin/theme/default/views/pages/_media-modal.twig` — herbruikbare media modal
|
||||
- `admin/theme/default/views/pages/plugins-move-form.twig` — verplaats-pagina
|
||||
- `plugins/<Plugin>/language/{nl,en}/{admin,site}.php` — plugin vertalingen (per plugin)
|
||||
- `plugins/<Plugin>/README.md` — uniforme documentatie (per plugin)
|
||||
- `plugins/<Plugin>/assets/.gitkeep` — lege assets map placeholder
|
||||
|
||||
### Gewijzigde bestanden (core)
|
||||
- `cms/core/plugin/PluginManager.php` — i18n methoden, site default language
|
||||
- `cms/core/plugin/PluginAPIInterface.php` — `getPluginTranslations()`, `t()` contract
|
||||
- `cms/core/plugin/AdminPluginAPI.php` — admin language, plugin translations
|
||||
- `cms/core/plugin/CMSAPI.php` — content language plugin translations
|
||||
- `cms/core/class/CodePressCMS.php` — PluginManager + CMSAPI wiring
|
||||
- `public/admin.php` — media-list endpoint, plugin-file routes, plugin translations Twig globals, handlePluginsEdit herschreven, handlePluginsConfig label_key support, flash messages
|
||||
- `admin/theme/default/views/layouts/admin.twig` — media modal include
|
||||
- `admin/theme/default/views/pages/plugins-edit.twig` — bestandsbrowser, upload, verwijderen, verplaatsen
|
||||
- `admin/theme/default/views/pages/plugin-config.twig` — vertaalde instellingen-labels
|
||||
- `admin/theme/default/views/pages/plugins.twig` — icoon-only knoppen met titles
|
||||
- `admin/theme/default/assets/js/editor-toolbar.js` — modeMap uitgebreid, media-case robuust
|
||||
- `language/{nl,en,de}/admin.php` — nieuwe vertaalstrings
|
||||
|
||||
---
|
||||
|
||||
## Tests
|
||||
|
||||
- **Pentest**: 30/30 tests geslaagd — 0 vulnerabilities
|
||||
- **WCAG 2.1 AA accessibility**: 25/25 tests geslaagd — 100% compliance
|
||||
|
||||
---
|
||||
|
||||
## Bestanden gewijzigd sinds v2.6.1c
|
||||
|
||||
40 bestanden gewijzigd, 2559 insertions(+), 369 deletions(-)
|
||||
Reference in New Issue
Block a user