# CodePress CMS v2.6.3 — Release Notes **Release datum:** 2026-08-20 **Codename:** Lyra **Status:** stable --- ## Samenvatting Deze release richt zich op **content met meerdere bestandstypes** en een **duidelijkere Content API**. Content bestanden die dezelfde naam delen maar een ander type hebben (`test.md`, `test.php`, `test.html`) worden nu correct afgehandeld: de frontend serveert per extensie het juiste bestand, en de admin accepteert en toont ze allemaal. Daarnaast is de `getAllPages()` API herschreven naar een rijkere array-structuur en zijn de verberg-prefixen voor mappen/bestanden gewijzigd (`.` vervangt `_`). --- ## Nieuwe features & wijzigingen ### 1. Content bestanden met dezelfde naam, ander type Eerder kon een content map niet twee bestanden bevatten met dezelfde naam maar een verschillend type (bijv. `test.md` + `test.php`). De frontend routeerde alleen op naam zonder extensie, waardoor slechts één bestand geserveerd werd. Nu: - **URL met extensie** (`/nl/test.php`) serveert exact dat bestand. - **URL zonder extensie** (`/nl/test`) valt terug op het eerste bestaande bestand met prioriteit **md > php > html** (via de nieuwe `resolveContentByType()` helper). - De admin content editor accepteert bestanden met dezelfde naam (ander type); de "bestaat al" check is per extensie. De melding is verduidelijkt naar "Bestand met dit type bestaat al." - De admin preview-knop linkt per extensie (`test.php` → `/nl/test.php`) zodat elk type individueel te bekijken blijft. ### 2. Frontend navigatie tonen alle bestandstypes `scanDirectory()` (menu), `getDirectoryListing()` (directory view) en `searchInDirectory()` (zoeken) tonen nu elk bestand apart met de extensie behouden in de URL. Bestanden met dezelfde naam maar ander type zijn niet meer samengevoegd tot één menu-item — elk type krijgt zijn eigen link. ### 3. getAllPages() array structuur `ContentAPI::getAllPages()` (en `CMSAPI::getAllPages()` voor plugins) gaf eerder een associative array `['pad' => 'titel']`. Nu is het een **list van entry arrays**: ```php [ ['path' => 'test-map', 'title' => 'Test Map', 'type' => 'folder'], ['path' => 'test-map/test.md','title' => 'Nieuwe pagina', 'type' => 'md'], ['path' => 'test.md', 'title' => 'Test', 'type' => 'md'], ['path' => 'test.php', 'title' => 'Test.', 'type' => 'php'], ['path' => 'test.html', 'title' => 'Nieuwe pagina', 'type' => 'html'], ] ``` - `type` is `md`/`php`/`html` voor bestanden, `folder` voor mappen. - Mappen krijgen hun eigen entry zodat de boom-structuur zichtbaar blijft. - Bestanden met dezelfde naam maar ander type botsen niet meer (de extensie zit in het pad). `autoLinkPageTitles()` is aangepast aan de nieuwe structuur en slaat mappen over. ### 4. Verberg-prefix logica: `.` i.p.v. `_` Vooraf verborg de frontend mappen/bestanden die begonnen met `.`, `-` of `_`. Nu is `_` **geen** verberg-prefix meer — alleen `.` (en `-`) verbergen aan de frontend. Dit maakt `.map` of `.bak` de standaard manier om content te verbergen. De admin daarentegen toont **wél** alle `.` bestanden en mappen (`.bak`, `.map`), behalve `.git`/`.gitkeep`. De `scanEditorFilesNode()` functie heeft een nieuwe `$scope` parameter die bepaalt of dotfiles getoond worden (alleen voor `content` scope). `collectContentPages()` (admin config default-page dropdown) toont nu ook `.` bestanden. ### 5. ContentAPI getPage()/pageExists() met extensie `ContentAPI::getPage('test.php')` en `pageExists('test.php')` respecteren nu de expliciete extensie — ze openen dat specifieke bestand in plaats van terug te vallen op md-prioriteit. ### 6. Handleiding content-api.md herschreven De handleiding `guide/nl/content-beheerder/content-api.md` en de Engelse tegenhanger zijn volledig herschreven: - **Hoe content naar Twig gaat**: echo/print vs return mechanisme duidelijk uitgelegd met voorbeelden - **Wat je niet kunt**: geen eigen Twig variabelen vanuit PHP; je voedt alleen `{{ content }}` - **Beschikbare variabelen** in een `.php` bestand: `$api` en `$pageMetadata` - **Nieuwe getAllPages() structuur** met type-veld en voorbeelden - **Layout kiezen**: hoe de `layout` frontmatter key koppelt naar `theme.json` - **Veiligheidsrichtlijnen** --- ## Technische details ### Nieuwe/gewijzigde functies (core) - `CodePressCMS::resolveContentByType(string $basePath, ?string $preferredExt = null): ?array` — Nieuwe helper die het eerste bestaande bestand (md > php > html) serveert, of het bestand met de gevraagde extensie als `$preferredExt` opgegeven is. - `CodePressCMS::scanForPageTitles()` — herschreven naar list van `['path','title','type']` entries; mappen als eigen entry; `_` niet meer verborgen. - `CodePressCMS::scanDirectory()` / `searchInDirectory()` / `getDirectoryListing()` — `_` verwijderd uit verberg-logica; extensie behouden in URLs. - `CodePressCMS::autoLinkPageTitles()` — aangepast aan nieuwe array structuur. - `ContentAPI::getPage()` / `pageExists()` — respecteren expliciete extensie. - `ContentAPI::getAllPages()` / `CMSAPI::getAllPages()` — docblocks bijgewerkt. - `scanEditorFilesNode()` — nieuwe `$scope` parameter; content-scope toont dotfiles (behalve .git/.gitkeep). - `scanContentDir()` / `collectContentPages()` — tonen nu `.` bestanden/mappen. ### Gewijzigde bestanden - `cms/core/class/CodePressCMS.php` — resolveContentByType, scanForPageTitles, scanDirectory, searchInDirectory, getDirectoryListing, autoLinkPageTitles, sanitizePageParam (punt toegestaan), getPage (explicitExt terug) - `cms/core/class/ContentAPI.php` — getPage/pageExists met extensie, getAllPages docblock - `cms/core/plugin/CMSAPI.php` — getAllPages docblock - `public/admin.php` — scanContentDir, scanEditorFilesNode, collectContentPages, handleContentNew/handleContentFiles meldingen - `admin/theme/default/views/pages/content-files.twig` — preview link per extensie - `admin/theme/default/views/pages/content-edit.twig` — preview link per extensie - `guide/nl/content-beheerder/content-api.md` — herschreven - `guide/en/content-beheerder/content-api.md` — herschreven - `version.php` — 2.6.3 - `README.md` / `README.en.md` — versie 2.6.3 - `TODO.md` — v2.6.3 sectie toegevoegd --- ## Tests - PHP lint: alle bestanden syntactisch correct (`php -l`) - Live getest via Apache (development.codepress.noorlander.info): - `/nl/test.php` serveert test.php - `/nl/test.html` serveert test.html - `/nl/test` (zonder ext) serveert test.md (md prioriteit) - Admin content boom toont `.bak`, `.map`, `_images` en alle bestandstypes - Frontend navigatie verbergt `.bak`/`.map`, toont alle bestandstypes apart - `$api->getAllPages()` in test.php toont pad/titel/type structuur --- ## Volgende stappen Zie `TODO.md` voor openstaand werk (multidomein implementatie).