Files
CodePress/docs/release-notes/v2.6.2.md
T
E.Noorlander 6f18a13f90 Fix: /admin/content is nu boom-editor + image-grootte knop + custom syntax
- /admin/content is nu de boom-editor (plugin-file-tree structuur),
  consistent met plugin- en thema-editors. Oude tabelweergave verhuisd
  naar /admin/content-list, bereikbaar via 'Boom weergave'/'Lijst
  weergave' knoppen. /admin/content-files redirect naar /admin/content.
- Image-grootte knop in markdown editor-toolbar: selecteer ![alt](url),
  klik knop, breedte/hoogte dialog, {:width=... height=...} syntax
  toevoegen/vervangen. Bestaande waarden worden in prompts getoond.
- Custom-grootte syntax {:width=...} nu ook correct herschreven naar
  /-media/ endpoint (was alleen gewone ![alt](url) herschreven).
- Handleidingen bijgewerkt (content-beheer.md NL+EN: boom/lijst
  weergave uitleg + image-grootte + images in content sectie)
- Release notes v2.6.2 bijgewerkt
- Pentest 30/30, WCAG 25/25
2026-08-19 12:15:56 +00:00

13 KiB

CodePress CMS v2.6.2 — Release Notes

Release datum: 2026-08-19
Codename: Lyra
Status: stable


Samenvatting

Deze release brengt de thema-editor en de content-editor op hetzelfde niveau als de plugin-editor. Thema's en content zijn nu volledig bewerkbaar in de admin met een bestandsbrowser zijbalk, uploaden/verwijderen/verplaatsen, en SCSS-compile (thema's) of git/backup-integratie (content). Daarnaast is de bestandsscanner geünificeerd tot één herbruikbare scanEditorFiles() functie.

Beide grote features zijn geïmplementeerd als spiegel van de plugin-editor (/admin/plugins-edit), zodat de editor-ervaring consistent is voor plugins, thema's en content.


Nieuwe features

1. Thema editor (thema's net zo bewerkbaar maken als plugins)

De thema-beheer pagina toonde alleen thema-kaarten met activeren/compileer knoppen. Nu is elk thema volledig bewerkbaar via /admin/theme-edit.

Bestandsbrowser zijbalk

  • Geneste, inklapbare boomstructuur van alle bestanden in de thema-map (.twig, .json, .scss, .css, .js, .html, .md, .php) inclusief partials/ en assets/ submappen
  • assets/css_compiled/ (runtime artefact, read-only) wordt verborgen in de boom
  • scanThemeFiles() helper — recursieve boom-opbouw met path-traversal bescherming; skipt css_compiled/
  • Mappen die het actieve bestand bevatten worden automatisch uitgeklapt
  • Iconen per bestandstype (TWIG, PHP, JSON, MD, CSS, JS, HTML, mappen)

Nieuw bestand aanmaken

  • "Nieuw bestand" knop + modal met pad-invoer (bijv. partials/header.twig of assets/scss/_variables.scss)
  • Submappen worden automatisch aangemaakt
  • Stub-content per extensie ({% extends 'base.twig' %} voor TWIG, {\n}\n voor JSON, enz.)
  • Path-traversal bescherming: ..//..\\/./ stripping + ../. segment-guard + realpath prefix-check

Uploaden / Verwijderen / Verplaatsen

  • Upload-knop + inklapbaar upload-formulier dat bestanden opslaat in themes/<naam>/assets/
  • Toegestane extensies: afbeeldingen, video, audio, PDF, ZIP, CSS, SCSS, JS, JSON, HTML, MD, TWIG, fonts
  • Per-bestand prullenbak-icoon en verplaats-icoon in de bestandsboom
  • theme.json is beschermd: kan bewerkt maar niet verwijderd of verplaatst worden

SCSS compileren vanuit de editor

  • "SCSS compileren" knop bovenaan de editor (alleen als assets/scss/theme.scss bestaat)
  • Toont compile-status: up-to-date (groen) of verouderd (geel)
  • Forceert compilatie via ThemeManager::compileCss(true)

Thema overzicht + activeren + verwijderen

  • theme.twig vernieuwd: bewerken/activeer/verwijder/compileer knoppen per thema-kaart
  • SCSS-status badges per thema (up-to-date / verouderd)
  • Activeren: zet active_theme in config.json (nieuwe route theme-activate)
  • Verwijderen: alleen niet-actieve, niet-default thema's (nieuwe route theme-delete); default thema beschermd
  • Nieuw thema met basis-kopie: kies een bestaand thema als basis bij aanmaken; css_compiled/ wordt niet gekopieerd; de title in theme.json wordt overschreven met de nieuwe themanaam; README.md krijgt een nieuwe header

Uniforme thema-structuur

Nieuwe thema's die via de admin worden aangemaakt krijgen automatisch een uniforme structuur:

  • theme.json, base.twig, full_content.twig, partials/header.twig, partials/footer.twig
  • assets/scss/theme.scss (starter SCSS), assets/css/, assets/js/, assets/img/, assets/fonts/
  • README.md per thema

Media invoegen in editor

  • De media-modal ondersteunt nu ook thema-context: /admin/media-list?theme=<naam> scant themes/<naam>/assets/
  • _media-modal.twig JS uitgebreid met mediaThemeName scope

2. Content editor (content consistent met plugins en thema's)

De content-beheer pagina (/admin/content) was een klassieke tabelweergave. Nu is er een额外的 content-editor /admin/content-files met dezelfde bestandsbrowser-zijbalk-ervaring als de plugin- en thema-editors. Beide weergaven werken naast elkaar en gebruiken dezelfde content-map.

Bestandsbrowser zijbalk

  • Geneste, inklapbare boomstructuur van alle bestanden in content/
  • scanContentFiles() helper — recursieve boom-opbouw met path-traversal bescherming; skipt .bak/, .git/, dotfiles
  • Bewerkbare extensies: .md, .php, .html (consistent met bestaande content-edit)
  • Per-map actie-knoppen: nieuw bestand, nieuwe map, hernoemen, verwijderen

Nieuw bestand / map aanmaken

  • "Nieuw bestand" knop + modal met pad-invoer en extensie-keuze (Markdown/PHP/HTML)
  • in_dir prefix ondersteuning: bestand kan direct in een submap worden aangemaakt vanuit de zijbalk
  • Frontmatter met layout, author_name, author_email, created wordt automatisch gegenereerd
  • "Nieuwe map" knop + modal; submappen worden automatisch aangemaakt

Uploaden / Verwijderen / Verplaatsen

  • Upload-knop + inklapbaar upload-formulier dat bestanden opslaat in content/ (of een submap)
  • Toegestane extensies: afbeeldingen, video, audio, PDF, ZIP, office docs, CSS, SCSS, JS, JSON, HTML, MD
  • Per-bestand prullenbak-icoon en verplaats-icoon in de bestandsboom
  • Nieuwe routes: content-file-upload, content-file-delete, content-file-move

Mappen beheer

  • Nieuwe map (content-dir-create-in): per map in de zijbalk of bovenaan
  • Map hernoemen (content-dir-rename-in): potlood-icoon per map
  • Map verwijderen (content-dir-delete-in): prullenbak-icoon per map (alleen lege mappen; verborgen .bak bestanden genegeerd)

Layout selectie + plugins + frontmatter

  • Layout dropdown uit theme.json template mapping (zoals bestaande content-edit)
  • Plugin checkbox-groep voor plugins: frontmatter key
  • Author metadata, created datum in frontmatter
  • Live frontmatter-update bij layout/plugin wijziging (spiegel van content-edit.twig JS)

Git / Backup integratie (Fase 5)

Bovenaan de content-editor staan backup- en git-acties:

  • Git init: initialiseert een git repository in content/ (als er nog geen is)
  • Commit: committed alle niet-committed wijzigingen (alleen als er een git repo is en er wijzigingen zijn)
  • Backup: link naar de backup-pagina (/admin/content-backup) voor ZIP backup/restore
  • Git status badge toont de huidige branch, of er niet-committed wijzigingen zijn (dirty/clean), en de laatste commit

3. Uniformiteit: één scanEditorFiles() voor alle editors

De drie nagenoeg identieke scan-functies (scanPluginFiles, scanThemeFiles, scanContentFiles) zijn geünificeerd tot één herbruikbare functie:

  • scanEditorFiles(string $dir, string $scope = 'plugin'): array — hoofd-functie
  • scanEditorFilesNode(string $absDir, string $relPath, string $realBase, array $skipPaths = []): array — recursieve helper
  • Scope-specifieke skips via $skipPaths map (bijv. ['assets/css_compiled' => true] voor themes)
  • scanPluginFiles/scanThemeFiles/scanContentFiles behouden als dunne wrappers voor backwards-compatibiliteit

De file-upload/delete/move handler-families zijn per-scope behouden (plugin: protected-plugins check; theme: theme.json-bescherming; content: geen specifieke bescherming) — generalisatie zou een complexe configuratie-laag vereisen die de leesbaarheid niet verbetert.


Bug fixes

  • Thema-naam niet overgenomen bij kopiëren — bij het aanmaken van een nieuw thema met een basisthema werd de title uit het basisthema's theme.json gekopieerd; nu wordt de title overschreven met de nieuwe themanaam en krijgt README.md een nieuwe header
  • Mappen met _ prefix zichtbaar in frontend navigatie — mappen zoals _drafts, _data, _images werden in het menu getoond omdat scanDirectory() alleen . en - prefixen oversloeg. Nu worden ook _-prefix mappen overgeslagen in scanDirectory(), searchInDirectory() en scanForPageTitles() (consistente filtering)
  • Images in markdown niet weergegeven![alt](test.svg) werd gerenderd als <img src="test.svg"> (relatieve URL → 404) of ![alt](/content/test.svg) als <img src="/content/test.svg"> (content/ staat buiten webroot → 404). processContent() herschrijft nu lokale image/link URLs naar de /-media/ endpoint die bestanden uit content/ serveert met juiste MIME-type. Externe URLs (http(s)://), /-media/, /-assets/, /themes/, /plugins/, /admin/, data: en mailto: worden ongewijzigd gelaten. Ook de custom-grootte syntax ![alt](url){:width=... height=...} wordt correct herschreven.

UX verbeteringen

  • /admin/content is nu de boom-editor — de hoofdroute /admin/content toont nu de bestandsbrowser zijbalk structuur (zoals plugin-file-tree), consistent met de plugin- en thema-editors. De oude tabelweergave is verhuisd naar /admin/content-list en is bereikbaar via de "Lijst weergave" knop. Een "Boom weergave" knop in de tabelweergave keert terug naar de boom-editor. De content-files route redirect naar /admin/content (backward compat).
  • Image-grootte knop in editor-toolbar — nieuwe knop "Afbeelding grootte" (expand-icoon) in de markdown editor-toolbar. Selecteer een ![alt](url) image in de editor en klik op de knop om een breedte/hoogte-dialog te krijgen. De {:width=... height=...} syntax wordt aan de image toegevoegd of vervangen. Bestaande waarden worden getoond in de prompts.

Technische details

Nieuwe routes

  • theme-edit — thema bestandsbrowser editor
  • theme-file-upload — bestanden uploaden naar thema assets/
  • theme-file-delete — bestand verwijderen uit thema (theme.json beschermd)
  • theme-file-move — bestand verplaatsen binnen thema (theme.json beschermd)
  • theme-activate — thema activeren (active_theme in config.json)
  • theme-delete — thema verwijderen (alleen niet-actief, niet-default)
  • theme-scss — SCSS compileren voor thema
  • content-files — content bestandsbrowser editor
  • content-file-upload — bestanden uploaden naar content/
  • content-file-delete — bestand verwijderen uit content
  • content-file-move — bestand verplaatsen binnen content
  • content-dir-create-in — map aanmaken in content vanuit editor
  • content-dir-rename-in — map hernoemen in content vanuit editor
  • content-dir-delete-in — map verwijderen in content vanuit editor (alleen leeg)

Nieuwe bestanden

  • admin/theme/default/views/pages/theme-edit.twig — thema editor met bestandsbrowser
  • admin/theme/default/views/pages/theme-move-form.twig — thema bestand verplaatsen
  • admin/theme/default/views/pages/content-files.twig — content editor met bestandsbrowser
  • admin/theme/default/views/pages/content-move-form.twig — content bestand verplaatsen
  • admin/theme/default/views/pages/content-dir-rename-form.twig — content map hernoemen
  • docs/release-notes/v2.6.2.md — dit release-verslag

Gewijzigde bestanden (core)

  • public/admin.php — nieuwe routes + handlers (handleThemeEdit/FileUpload/Delete/Move/Activate/Delete/Scss, handleContentFiles/FileUpload/Delete/Move/DirCreateIn/DirRenameIn/DirDeleteIn, createUniformThemeStructure, copyDirRecursive, removeDirRecursive, scanEditorFiles + scanEditorFilesNode unified), handleTheme/handleThemeNew herschreven, handleMediaList uitgebreid met ?theme= scope
  • admin/src/AdminAuth.php — site-admin rechten voor nieuwe theme routes; content-manager rechten voor nieuwe content routes
  • admin/theme/default/views/pages/theme.twig — bewerk/activeer/verwijder/compileer knoppen + SCSS-status badges
  • admin/theme/default/views/pages/theme-new.twig — base-theme keuze dropdown
  • admin/theme/default/views/pages/_media-modal.twig?theme= scope support
  • admin/theme/default/assets/js/editor-toolbar.jstwightmlmixed mode toegevoegd
  • cms/core/class/CodePressCMS.phpscanDirectory/searchInDirectory/scanForPageTitles skippen nu _ prefix; processContent() herschrijft lokale image/link URLs naar /-media/
  • language/{nl,en,de}/admin.php — ~45 nieuwe vertaalstrings (theme-editor + content-editor)
  • guide/{nl,en}/admin-beheerder/thema-beheer.md — volledig herschreven met thema-editor uitleg
  • guide/{nl,en}/admin-beheerder/content-beheer.md — volledig herschreven met content-editor uitleg
  • TODO.md — thema-editor en content-editor items aangevinkt

Tests

  • Pentest: 30/30 tests geslaagd — 0 vulnerabilities
  • WCAG 2.1 AA accessibility: 25/25 tests geslaagd — 100% compliance
  • PHP lint: alle bestanden schoon (geen syntax errors)
  • curl tests: alle nieuwe routes getest (aanmaken, bewerken, opslaan, uploaden, verwijderen, verplaatsen, map aanmaken/hernoemen/verwijderen, SCSS compileren, thema activeren/verwijderen, thema kopiëren); path-traversal pogingen (delete/new_file/upload) allemaal geblokkeerd; default/active theme bescherming geverifieerd; theme.json verwijderen/plaatsen geblokkeerd; image-URL rewriting geverifieerd (relatief, /content/, subdir, extern ongewijzigd); _-map niet in frontend navigatie

Bestanden gewijzigd sinds v2.6.1d

15 bestanden gewijzigd (core + admin theme + language + guide), ~2200 insertions, ~200 deletions.