139 lines
7.0 KiB
Markdown
139 lines
7.0 KiB
Markdown
# 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 `<?php` staat wordt als content gebruikt
|
|
2. **Return** (callback stijl): `return '<h1>Hallo</h1>';` — de geretourneerde string wordt als content gebruikt
|
|
|
|
In PHP bestanden is de `ContentAPI` beschikbaar via `$api`:
|
|
```php
|
|
<?php
|
|
$menu = $api->getMenu();
|
|
$pages = $api->getAllPages();
|
|
$config = $api->getConfig('site_title');
|
|
return '<h1>' . htmlspecialchars($config) . '</h1>';
|
|
```
|
|
|
|
#### 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 `<img>` 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...
|
|
``` |