# 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/`, met een klikbare **content** root bovenaan
- Verborgen mappen (`.bak`, `.git`) en dotfiles worden overgeslagen
- Klik op een **bestand** om het te openen in de CodeMirror editor
- Klik op een **map** (mapnaam) om de map te selecteren — rechts verschijnt het **map detail paneel**
- De chevron (▶/▼) naast een map klapt deze in/uit zonder de map te selecteren
- Mappen die het actieve bestand bevatten zijn automatisch uitgeklapt
- Per map staan actie-knoppen: nieuw bestand (plus-icoon), nieuwe map (map-plus-icoon) — deze opereren op de geselecteerde map
- Per bestand staan actie-knoppen: hernoemen/verplaatsen (potlood), verwijderen (prullenbak) — verschijnen bij hover
### Bestanden verslepen (drag-and-drop)
- Sleep een bestand of map naar een andere map om het te verplaatsen
- Tijdens het slepen worden geldige doel-mappen highlight getoond
- De verplaatsing gebeurt via een AJAX-call — de pagina herlaadt automatisch na succes
- Beveiliging: een map kan niet naar zichzelf of naar een submap verplaatst worden
- Path-traversal bescherming: alle paden blijven binnen de content map
### 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 ``
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
{: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 `` 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
- Selecteer de doelmap in de zijbalk (klik op de mapnaam), of gebruik de root
- Klik op **Nieuw bestand** (in het map-detail paneel of bovenaan)
- 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
- Het nieuwe bestand wordt aangemaakt in de geselecteerde map
### Bestand uploaden
- Selecteer de doelmap in de zijbalk (klik op de mapnaam), of gebruik de root
- Klik op **Upload** (in het map-detail paneel of bovenaan) om bestanden naar de geselecteerde map te uploaden
- Toegestaan: afbeeldingen, video, audio, PDF, ZIP, office docs, CSS, SCSS, JS, JSON, HTML, MD
- Path-traversal bescherming: doelmap moet binnen `content/` blijven
- Na de upload keer je terug naar de geselecteerde map
### Bestand hernoemen / verwijderen
- Open het bestand in de editor (klik op de bestandsnaam in de zijbalk)
- **Hernoemen**: bewerk het **Bestandsnaam** veld rechts boven de editor en klik op Opslaan — het bestand wordt direct hernoemd
- **Verwijderen**: klik op de verwijder-knop (prullenbak) naast het bestand in de zijbalk, met bevestiging
### Mappen beheer
- Klik op een map in de zijbalk om het **map-detail paneel** rechts te openen
- **Map hernoemen**: bewerk het **Mapnaam** veld in het map-detail paneel en klik op Opslaan
- **Nieuw bestand / Nieuwe map / Uploaden in deze map**: gebruik de knoppen in het map-detail paneel — ze opereren op de geselecteerde map
- **Map verwijderen**: verwijder-knop in het map-detail paneel (alleen lege mappen)
- De content-root is ook selecteerbaar (klik op "content" bovenaan de boom) — toont het map-detail paneel voor de root (hernoemen uitgeschakeld)
### 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...
```