- Content bestanden met dezelfde naam maar ander type (md/php/html) worden correct geserveerd: URL met extensie opent dat bestand, URL zonder extensie valt terug op md > php > html (resolveContentByType helper) - Admin content editor accepteert bestanden met dezelfde naam (ander type); preview-knop linkt per extensie - Frontend navigatie/directory listing/search tonen elk bestandstype apart - getAllPages() array structuur gewijzigd naar list van ['path','title','type'] met type 'md'/'php'/'html'/'folder' - Verberg-prefix logica: _ is geen verberg-prefix meer, alleen . (en -); admin toont wél alle . bestanden/mappen - ContentAPI getPage()/pageExists() respecteren expliciete extensie - Handleiding content-api.md (NL+EN) herschreven - File-tree unificatie: _file-tree.twig + _editor-styles.twig includes - Versie verhoogd naar 2.6.3
160 lines
6.7 KiB
Markdown
160 lines
6.7 KiB
Markdown
# 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). |