# Content beheer CodePress gebruikt een **boom weergave** (`/admin/content`) voor content-beheer: een bestandsbrowser zijbalk + CodeMirror editor, uniform met de plugin- en thema-editors. De oude lijst/tabel weergave is verwijderd. ## Content editor ### Bestandsbrowser zijbalk - Toont de geneste bestandsboom van `content/` - Verborgen mappen (`.bak`, `.git`) en dotfiles worden overgeslagen - Klik op een bestand om het te openen in de CodeMirror editor - Mappen die het actieve bestand bevatten zijn automatisch uitgeklapt - Per map staan actie-knoppen: nieuw bestand, nieuwe map, hernoemen, verwijderen ### Bewerkbare bestandstypen `.md` (Markdown), `.php` (PHP), `.html` (HTML) — consistent met de bestaande content-edit pagina. Alle types ondersteunen `---` frontmatter (layout, created, edited, plugins). De CMS `parseMetadata()` haalt de frontmatter eruit vóór verwerking. Bij PHP bestanden wordt de frontmatter uit de output verwijderd. #### PHP content bestanden PHP bestanden kunnen op twee manieren content leveren: 1. **Echo** (output buffering): alles wat `echo`d of outside `Hallo';` — de geretourneerde string wordt als content gebruikt In PHP bestanden is de `ContentAPI` beschikbaar via `$api`: ```php getMenu(); $pages = $api->getAllPages(); $config = $api->getConfig('site_title'); return '

' . htmlspecialchars($config) . '

'; ``` #### Frontend URL's en bestandsnamen De CMS zoekt bestanden in volgorde: `.md` → `.php` → `.html`. Als bestanden dezelfde naam hebben (bijv. `test.md` en `test.php`), opent `/nl/test` altijd `test.md`. Om een specifiek bestandstype te openen, voeg de extensie toe aan de URL: - `/nl/test` → opent `test.md` (of `.php` / `.html` als `.md` niet bestaat) - `/nl/test.php` → opent `test.php` (expliciete extensie) - `/nl/test.html` → opent `test.html` (expliciete extensie) De preview link in de editor gebruikt automatisch de extensie voor niet-`.md` bestanden. ### Image-grootte instellen (Markdown) In de markdown editor-toolbar staat een "Afbeelding grootte" knop (expand-icoon): 1. Selecteer een afbeelding in de editor in markdown formaat `![alt](url)` 2. Klik op de "Afbeelding grootte" knop 3. Vul breedte en/of hoogte in (px of %, leeg = niet instellen) 4. De `{:width=... height=...}` syntax wordt aan de afbeelding toegevoegd of vervangen Voorbeeld: ```markdown ![logo](/content/_images/logo.png){:width="200" height="100"} ``` Bestaande `{:width=...}` waarden worden in de prompts getoond. De grootte-attributen worden in de frontend als `width`/`height` HTML-attributen op de `` tag gezet. ### Images in content Images in `content/` worden via de `/-media/` endpoint geserveerd (content/ staat buiten de webroot). De markdown syntax `![alt](url)` met lokale URLs (relatief zoals `image.jpg`, of absoluut zoals `/content/_images/image.jpg`) wordt automatisch herschreven naar `/-media/...`. Externe URLs (`https://...`) worden ongewijzigd gelaten. ### Nieuw bestand aanmaken - Klik op **Nieuw bestand** (bovenaan of per map in de zijbalk) - Geef een pad op binnen content (bijv. `nl.pagina` of `blog/nl.post`) - Kies het bestandstype (Markdown/PHP/HTML) - Submappen worden automatisch aangemaakt - Frontmatter met `layout`, `created`, `edited` wordt automatisch gegenereerd ### Bestand uploaden - Klik op **Upload** om bestanden naar `content/` te uploaden - Toegestaan: afbeeldingen, video, audio, PDF, ZIP, office docs, CSS, SCSS, JS, JSON, HTML, MD - Path-traversal bescherming: doelmap moet binnen `content/` blijven ### Bestand verplaatsen / verwijderen - In de bestandsboom heeft elk bestand een verplaats-knop (pijlen-icoon) en een verwijder-knop (prullenbak) - **Verplaatsen**: kies een doelmap uit de dropdown met alle mappen in content - **Verwijderen**: met bevestiging ### Mappen beheer - **Nieuwe map**: per map in de zijbalk of bovenaan - **Map hernoemen**: potlood-icoon per map - **Map verwijderen**: prullenbak-icoon per map (alleen lege mappen) ### Layout selectie Op de editor-pagina kun je de layout kiezen uit de layouts gedefinieerd in `theme.json` (template mapping). De geselecteerde layout wordt opgeslagen in de frontmatter `layout:` key. ### Plugins op pagina's - Alleen actieve **content plugins** (uit `plugin.json` met `type: "content"`) verschijnen in de plugin multiselect; system plugins (zoals Statistics/Logs/Dashboard) zijn uitgesloten - Kies via de multiselect welke plugins op de pagina draaien (gebruik Ctrl/Cmd+klik voor meerdere) - De plugin selectie wordt opgeslagen in de frontmatter `plugins:` key ### Backup integratie Bovenaan de content-editor staat een **Backup** knop die naar de backup-pagina (`/admin/content-backup`) leidt voor ZIP backup/restore en (indien beschikbaar) git versiebeheer. Git integratie in de editor-zijbalk is verwijderd; git wordt later een systeem plugin. ### Frontmatter De editor toont de **Aangemaakt** en **Bewerkt** timestamps (read-only, automatisch bijgewerkt bij elke opslag). De `edited:` waarde wordt bij elke save vernieuwd. ```markdown --- layout: left_sidebar created: 2026-08-19 10:30:25 edited: 2026-08-20 14:22:01 plugins: HTMLBlock, Navigation --- # Pagina titel Content... ``` ## Frontmatter De editor werkt de frontmatter live bij bij wijzigingen van layout of plugin selectie: ```markdown --- layout: left_sidebar created: 2026-08-19 10:30:25 edited: 2026-08-20 14:22:01 plugins: HTMLBlock, Navigation --- # Pagina titel Content... ```