Files
E.Noorlander 5edc929c13 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.
2026-08-18 13:49:52 +00:00

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 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: ![naam](url)
    • 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.phpgetPluginTranslations(), 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(-)