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.
8.9 KiB
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 inlanguage/<lang>/admin.php - Content plugins (
type: "content") volgen de geselecteerde content taal — vertalingen inlanguage/<lang>/site.php - Fallback chain: geselecteerde taal → plugin
default_language(uitplugin.json) → CMS site default → lege array (sleutel wordt ongewijzigd getoond)
Core uitbreidingen:
PluginManager:getPluginDefaultLanguage(),getPluginTranslations(),getAllPluginTranslations()met fallback chainPluginAPIInterface:getPluginTranslations()+t()toegevoegd (contract voor beide API's)AdminPluginAPI:getAdminLanguage(),getPluginTranslations(),t()(systeem plugins)CMSAPI:getPluginTranslations(),t()(content plugins)
Admin integratie:
public/admin.phplaadt alle plugin-vertalingen als Twig globalta_plugins+ functionstap()enplugin_menu_label()handlePluginsConfig()resolveertlabel_key/help_key/option_label_keyvia 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_keyin 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.mdmet uniform format: plugin type, bestandsstructuur, functies, instellingen, taal support plugins/README.mdherschreven als korte algemene intro met plugin-overzicht tabelguide/nl|en/codepress-developer/plugin-development.mdvolledig herschreven (structuur, plugin.json velden incl.default_language, settings schema metlabel_key/help_key, API methodes incl.getPluginTranslations/t, admin integratie, taal support sectie)guide/nl|en/codepress-developer/architectuur.mdbijgewerkt met pluginlanguage/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) inclusieflanguage/enassets/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 beschermingeditor-toolbar.jsmodeMap uitgebreid:css: 'css',scss: 'css',js: 'javascript',json: 'javascript'
Nieuw bestand aanmaken
- "Nieuw bestand" knop + modal met pad-invoer (bijv.
helper.phpofassets/css/extra.css) - Submappen worden automatisch aangemaakt
- Stub-content per extensie (
<?php\nvoor PHP,{\n}\nvoor 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 (
.gitkeepkan 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
- Markdown:
- 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.twigincludeert het modal wanneerneeds_editortrue iseditor-toolbar.jsmedia-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 —
#mediaModalbestond 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-bestandenplugins-file-upload— bestanden uploaden naar plugin assets/plugins-file-delete— bestand verwijderen uit pluginplugins-file-move— bestand verplaatsen binnen plugin
Nieuwe bestanden
admin/theme/default/views/pages/_media-modal.twig— herbruikbare media modaladmin/theme/default/views/pages/plugins-move-form.twig— verplaats-paginaplugins/<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 languagecms/core/plugin/PluginAPIInterface.php—getPluginTranslations(),t()contractcms/core/plugin/AdminPluginAPI.php— admin language, plugin translationscms/core/plugin/CMSAPI.php— content language plugin translationscms/core/class/CodePressCMS.php— PluginManager + CMSAPI wiringpublic/admin.php— media-list endpoint, plugin-file routes, plugin translations Twig globals, handlePluginsEdit herschreven, handlePluginsConfig label_key support, flash messagesadmin/theme/default/views/layouts/admin.twig— media modal includeadmin/theme/default/views/pages/plugins-edit.twig— bestandsbrowser, upload, verwijderen, verplaatsenadmin/theme/default/views/pages/plugin-config.twig— vertaalde instellingen-labelsadmin/theme/default/views/pages/plugins.twig— icoon-only knoppen met titlesadmin/theme/default/assets/js/editor-toolbar.js— modeMap uitgebreid, media-case robuustlanguage/{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(-)