Willkommen! Diese Anleitung führt Sie in 15 Minuten durch die ersten Schritte mit Catamaran CMS.
- Für Redakteure: Ersten Inhalt erstellen
- Für Administratoren: Erstes Model erstellen
- Für Entwickler: API nutzen
- Checkliste: System ist startklar
Ziel: Einen Blog-Artikel erstellen und veröffentlichen
Dauer: 5 Minuten
-
Öffnen Sie die Admin-URL in Ihrem Browser:
http://localhost:8000/adminoder für Produktionsumgebung:
https://ihre-domain.de/admin -
Geben Sie Ihre Zugangsdaten ein
- Klicken Sie im linken Menü auf "Content"
- Sie sehen eine Liste aller vorhandenen Inhalte
-
Klicken Sie rechts oben auf "Neuer Inhalt erstellen" (oder "+ Create Content")
-
Wählen Sie das Model:
- Im Dropdown "Model" wählen Sie "Blog"
- Das Formular zeigt jetzt alle Blog-Felder an
Pflichtfelder (mit * markiert):
Titel: Mein erster Blog-Artikel
URL-Slug: mein-erster-blog-artikel
Inhalt: ## Willkommen
Dies ist mein erster Artikel im Catamaran CMS!
### Was ich gelernt habe
- Catamaran ist ein Headless CMS
- Inhalte werden zentral verwaltet
- Models definieren die Struktur
Optionale Felder:
Teaser: Eine kurze Einführung in mein erstes CMS-Projekt
Autor: Ihr Name
Datum: [Heutiges Datum auswählen]
Tags: Tutorial, Erste Schritte, CMS
- Klicken Sie auf das Feld "Featured Image"
- Wählen Sie ein vorhandenes Bild ODER
- Klicken Sie auf "Upload" um ein neues Bild hochzuladen
- Bild auswählen und bestätigen
- Status: Setzen Sie auf "Published" (veröffentlicht)
- Klicken Sie unten auf "Speichern"
- ✅ Erfolg! Ihr Artikel ist jetzt im System
Option A: Im Backend prüfen
- Gehen Sie zurück zur Content-Liste
- Ihr Artikel erscheint in der Übersicht
Option B: Per API abrufen
- Öffnen Sie:
http://localhost:8000/api/v1/content - Suchen Sie Ihren Artikel in der JSON-Antwort
Option C: Im Frontend (wenn eingerichtet)
- Besuchen Sie Ihre Website
- Artikel sollte in der Blog-Liste erscheinen
Ziel: Ein "Veranstaltung"-Model mit allen nötigen Feldern erstellen
Dauer: 10 Minuten
- Im Admin-Bereich: Klicken Sie auf "Models" im Menü
- Klicken Sie auf "Neues Model erstellen"
Name: Veranstaltung
Beschreibung: Verwaltung von Events und Terminen
Slug: veranstaltung
Hinweis: Der Slug wird für die API verwendet (/api/v1/models/veranstaltung)
Klicken Sie auf "Feld hinzufügen" und erstellen Sie folgende Felder:
Feldname: title
Label: Event-Titel
ElementType: Text
Pflichtfeld: ✓ Ja
Validierung: Min: 3, Max: 200 Zeichen
Feldname: slug
Label: URL-Slug
ElementType: Text
Pflichtfeld: ✓ Ja
Validierung: Regex: ^[a-z0-9-]+$
Hilfetext: Nur Kleinbuchstaben, Zahlen und Bindestriche
Feldname: event_date
Label: Veranstaltungsdatum
ElementType: Date
Pflichtfeld: ✓ Ja
Feldname: location
Label: Veranstaltungsort
ElementType: Text
Pflichtfeld: ✓ Ja
Validierung: Max: 255 Zeichen
Feldname: description
Label: Beschreibung
ElementType: Markdown
Pflichtfeld: ✗ Nein
Hilfetext: Detaillierte Event-Beschreibung mit Formatierung
Feldname: featured_image
Label: Event-Bild
ElementType: Asset
Pflichtfeld: ✗ Nein
Feldname: registration_required
Label: Anmeldung erforderlich
ElementType: Boolean
Pflichtfeld: ✗ Nein
Standardwert: false
Feldname: max_participants
Label: Maximale Teilnehmerzahl
ElementType: Number
Pflichtfeld: ✗ Nein
Validierung: Min: 1, Max: 1000
Feldname: category
Label: Kategorie
ElementType: Select
Pflichtfeld: ✓ Ja
Optionen: - Konzert
- Workshop
- Konferenz
- Networking
- Sonstiges
- Klicken Sie auf "Speichern"
- ✅ Ihr Model "Veranstaltung" ist jetzt aktiv!
- Gehen Sie zu "Content" → "Neuer Inhalt erstellen"
- Wählen Sie Model "Veranstaltung"
- Füllen Sie alle Felder aus:
Event-Titel: Catamaran CMS Workshop
URL-Slug: catamaran-workshop-2025
Veranstaltungsdatum: 31.01.2025
Veranstaltungsort: Online (Zoom)
Beschreibung: ## Workshop-Inhalte
- Headless CMS Grundlagen
- Models erstellen
- API nutzen
Anmeldung erforderlich: Ja
Max. Teilnehmer: 50
Kategorie: Workshop
- Speichern und Status auf "Published" setzen
Testen Sie die API:
# Model-Details abrufen
curl http://localhost:8000/api/v1/models/veranstaltung
# Alle Events abrufen
curl http://localhost:8000/api/v1/models/veranstaltung/content✅ Fertig! Ihr erstes eigenes Model ist einsatzbereit.
Ziel: Inhalte per API abrufen und im Frontend anzeigen
Dauer: 5 Minuten
Entwicklungsumgebung:
http://localhost:8000/api/v1
Produktionsumgebung:
https://ihre-domain.de/api/v1
Request:
curl -X GET http://localhost:8000/api/v1/modelsResponse:
{
"data": [
{
"id": 4,
"name": "Blog",
"slug": "blog",
"description": "Blog-Artikel mit Markdown-Editor",
"fields": [...],
"views": [...]
}
]
}Request:
curl -X GET http://localhost:8000/api/v1/models/blog/contentResponse:
{
"data": [
{
"id": 12,
"title": "Mein erster Blog-Artikel",
"slug": "mein-erster-blog-artikel",
"status": "published",
"created_at": "2025-12-30T10:30:00+00:00",
"updated_at": "2025-12-30T10:30:00+00:00",
"data": {
"title": "Mein erster Blog-Artikel",
"slug": "mein-erster-blog-artikel",
"featured_image": 5,
"excerpt": "Eine kurze Einführung...",
"content": "## Willkommen\n\nDies ist mein erster...",
"author": "Max Mustermann",
"published_date": "2025-12-30",
"tags": "Tutorial, Erste Schritte, CMS"
}
}
]
}Request:
curl -X GET http://localhost:8000/api/v1/content/12Einfaches Beispiel mit fetch:
// Alle Blog-Artikel abrufen
async function fetchBlogPosts() {
const response = await fetch('http://localhost:8000/api/v1/models/blog/content');
const json = await response.json();
return json.data;
}
// Artikel anzeigen
fetchBlogPosts().then(posts => {
posts.forEach(post => {
console.log(`${post.data.title} - ${post.data.published_date}`);
});
});Svelte-Beispiel:
<script>
import { onMount } from 'svelte';
let posts = [];
let loading = true;
onMount(async () => {
const response = await fetch('http://localhost:8000/api/v1/models/blog/content');
const json = await response.json();
posts = json.data;
loading = false;
});
</script>
{#if loading}
<p>Lade Blog-Artikel...</p>
{:else}
<ul>
{#each posts as post}
<li>
<h2>{post.data.title}</h2>
<p>{post.data.excerpt}</p>
<small>{post.data.published_date}</small>
</li>
{/each}
</ul>
{/if}Request:
curl -X POST http://localhost:8000/api/v1/content \
-H "Content-Type: application/json" \
-d '{
"model_id": 4,
"slug": "api-test-artikel",
"status": "published",
"data": {
"title": "Per API erstellt",
"slug": "api-test-artikel",
"excerpt": "Dieser Artikel wurde per API erstellt",
"content": "## Test\n\nInhalt hier...",
"author": "API Bot",
"published_date": "2025-12-30",
"tags": "API, Test"
}
}'Response:
{
"data": {
"id": 13,
"title": "Per API erstellt",
"slug": "api-test-artikel",
"status": "published",
"created_at": "2025-12-30T11:00:00+00:00",
"data": {...}
}
}Request:
curl -X PUT http://localhost:8000/api/v1/content/13 \
-H "Content-Type: application/json" \
-d '{
"data": {
"title": "Aktualisierter Titel"
}
}'Request:
curl -X DELETE http://localhost:8000/api/v1/content/13Hinweis: Content wird auf Status "archived" gesetzt, nicht physisch gelöscht.
- Symfony läuft erfolgreich
- Datenbank ist verbunden
- EasyAdmin ist erreichbar unter
/admin - Mindestens ein Benutzer-Account existiert
- API ist erreichbar unter
/api/v1
Test:
curl http://localhost:8000/api/v1/models
# Sollte JSON mit Models zurückgeben- Mindestens eine Site ist angelegt
- Mindestens ein Model existiert (z.B. "Blog")
- ElementTypes sind synchronisiert
- CORS ist konfiguriert (für Frontend-Entwicklung)
Test:
php bin/console app:sync-element-types
# Sollte ElementTypes synchronisieren- Mindestens ein Test-Inhalt wurde erstellt
- Content kann per API abgerufen werden
- Bilder/Assets können hochgeladen werden
- Markdown-Editor funktioniert
- GET /api/v1/models funktioniert
- GET /api/v1/models/{slug}/content funktioniert
- POST /api/v1/content funktioniert
- PUT /api/v1/content/{id} funktioniert
- DELETE /api/v1/content/{id} funktioniert
- Frontend-Projekt ist erstellt
- API-URL ist konfiguriert (
.envDatei) - Erste API-Calls funktionieren
- Inhalte werden angezeigt
Lösung:
# Cache leeren
php bin/console cache:clear
# Routen prüfen
php bin/console debug:router | grep apiLösung:
Prüfen Sie config/packages/nelmio_cors.yaml:
nelmio_cors:
defaults:
origin_regex: true
allow_origin: ['http://localhost:5173']
allow_methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']
allow_headers: ['Content-Type']Lösung: Bei Blog-Posts brauchen Sie zwei Slugs:
{
"model_id": 4,
"slug": "artikel-slug", // Content-Entity Slug
"data": {
"slug": "artikel-slug", // Auch im data-Objekt!
"title": "..."
}
}Lösung:
# Schema aktualisieren
php bin/console doctrine:schema:update --force
# ElementTypes synchronisieren
php bin/console app:sync-element-typesLösung:
cd catamaran-frontend
npm install -D @sveltejs/adapter-static- ✅ Ersten Artikel erstellt
- ➡️ Weitere Artikel anlegen und Workflow kennenlernen
- ➡️ Bilder und Assets verwalten
- ➡️ Markdown-Formatierung üben
- ✅ Erstes Model erstellt
- ➡️ Views für Models erstellen (Template-Rendering)
- ➡️ Weitere Models anlegen (Produkte, Events, etc.)
- ➡️ Multi-Site konfigurieren (falls nötig)
- ➡️ Benutzer und Rollen verwalten
- ✅ API-Zugriff getestet
- ➡️ Frontend-Projekt aufsetzen (SvelteKit, React, Vue)
- ➡️ API-Client-Library erstellen
- ➡️ Komponenten für Content-Darstellung bauen
- ➡️ CRUD-Funktionen im Frontend implementieren
- ➡️ Deployment vorbereiten
# Cache leeren
php bin/console cache:clear
# Datenbank-Schema aktualisieren
php bin/console doctrine:schema:update --force
# ElementTypes synchronisieren
php bin/console app:sync-element-types
# Routen anzeigen
php bin/console debug:router
# Entwicklungsserver starten
symfony server:start# Alle Models
curl http://localhost:8000/api/v1/models
# Model mit Content
curl http://localhost:8000/api/v1/models/blog/content
# Einzelner Content
curl http://localhost:8000/api/v1/content/12
# Content erstellen
curl -X POST http://localhost:8000/api/v1/content \
-H "Content-Type: application/json" \
-d @test_create.json
# Content aktualisieren
curl -X PUT http://localhost:8000/api/v1/content/12 \
-H "Content-Type: application/json" \
-d '{"data":{"title":"Neuer Titel"}}'
# Content löschen
curl -X DELETE http://localhost:8000/api/v1/content/12# Abhängigkeiten installieren
npm install
# Entwicklungsserver
npm run dev
# Production Build
npm run build
# Preview Production Build
npm run preview- Grundlagen:
GRUNDLAGEN_CATAMARAN_CMS.md - API-Dokumentation:
API_DOCUMENTATION.md - Dieser Guide:
QUICKSTART.md
- Postman Collection:
Catamaran_CMS_API.postman_collection.json - Environments:
Catamaran_CMS_DEV.postman_environment.json
- Cache leeren:
php bin/console cache:clear - Logs prüfen:
var/log/dev.logodervar/log/prod.log - Browser-Konsole prüfen (bei Frontend-Problemen)
- API mit Postman testen (Isolierung des Problems)
Viel Erfolg mit Catamaran CMS! 🚀
Letzte Aktualisierung: 2025-12-30