# Universal Features - Dokumentation *Letzte Aktualisierung: 18. Dezember 2025* ## Übersicht Die Universal Features erweitern das Payload CMS um wiederverwendbare Collections und Blocks für Blog, News, Testimonials, Newsletter, FAQ, Team und Prozess-Darstellungen. Alle Features sind Multi-Tenant-fähig. **Wichtig:** Frontends verwenden die **Production-API** (cms.c2sgmbh.de). --- ## API-Endpoints für Frontend ### Collections | Collection | Endpoint | Beschreibung | |------------|----------|--------------| | Posts | `GET /api/posts` | Blog, News, Presse | | Testimonials | `GET /api/testimonials` | Kundenbewertungen | | FAQs | `GET /api/faqs` | FAQ-Einträge | | Team | `GET /api/team` | Team-Mitglieder | | Services | `GET /api/services` | Leistungen | | Timelines | `GET /api/timelines` | Chronologische Events | | Workflows | `GET /api/workflows` | Prozess-Darstellungen | ### Beispiel: Posts laden ```typescript // Featured Blog-Posts für Tenant C2S laden const posts = await fetch( 'https://cms.c2sgmbh.de/api/posts?where[tenant][equals]=4&where[type][equals]=blog&where[isFeatured][equals]=true&locale=de&limit=6' ).then(r => r.json()) ``` ### Newsletter API | Endpoint | Methode | Beschreibung | |----------|---------|--------------| | `/api/newsletter/subscribe` | POST | Newsletter-Anmeldung | | `/api/newsletter/confirm` | GET/POST | Double Opt-In Bestätigung | | `/api/newsletter/unsubscribe` | GET/POST | Abmeldung | ```typescript // Newsletter-Anmeldung const response = await fetch('https://cms.c2sgmbh.de/api/newsletter/subscribe', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: 'user@example.com', firstName: 'Max', tenantId: 4, source: 'footer' }) }) ``` --- ## Collections ### 1. Posts Collection **Pfad:** `src/collections/Posts.ts` **Slug:** `posts` **Admin-Gruppe:** Content Die Posts Collection dient zur Verwaltung von Blog-Artikeln, News, Pressemitteilungen und Ankündigungen. #### Felder | Feld | Typ | Beschreibung | Pflicht | |------|-----|--------------|---------| | `title` | Text | Titel des Beitrags | Ja | | `slug` | Text | URL-Pfad (unique) | Ja | | `type` | Select | Art des Beitrags | Ja | | `isFeatured` | Checkbox | Hervorgehobener Beitrag | Nein | | `excerpt` | Textarea | Kurzfassung (max. 300 Zeichen) | Nein | | `featuredImage` | Upload | Beitragsbild | Nein | | `content` | RichText | Hauptinhalt | Ja | | `categories` | Relationship | Kategorien (hasMany) | Nein | | `author` | Text | Autorname | Nein | | `status` | Select | draft/published/archived | Nein | | `publishedAt` | Date | Veröffentlichungsdatum | Nein | | `meta` | Group | SEO-Einstellungen | Nein | #### Post-Typen - `blog` - Blog-Artikel (Standard) - `news` - News/Aktuelles - `press` - Pressemitteilung - `announcement` - Ankündigung --- ### 2. Testimonials Collection **Pfad:** `src/collections/Testimonials.ts` **Slug:** `testimonials` **Admin-Gruppe:** Content Kundenstimmen und Bewertungen für Referenz-Seiten. #### Felder | Feld | Typ | Beschreibung | Pflicht | |------|-----|--------------|---------| | `quote` | Textarea | Zitat/Bewertungstext | Ja | | `author` | Text | Name des Kunden | Ja | | `role` | Text | Position/Rolle | Nein | | `company` | Text | Unternehmen | Nein | | `image` | Upload | Portrait-Foto | Nein | | `rating` | Number | Bewertung 1-5 Sterne | Nein | | `source` | Text | Quelle (z.B. "Google Reviews") | Nein | | `sourceUrl` | Text | Link zur Original-Bewertung | Nein | | `date` | Date | Datum der Bewertung | Nein | | `isActive` | Checkbox | Sichtbarkeit | Nein | | `order` | Number | Sortierung | Nein | --- ### 3. Newsletter Subscribers Collection **Pfad:** `src/collections/NewsletterSubscribers.ts` **Slug:** `newsletter-subscribers` **Admin-Gruppe:** Marketing DSGVO-konforme Speicherung von Newsletter-Anmeldungen mit Double Opt-In. #### Felder | Feld | Typ | Beschreibung | Pflicht | |------|-----|--------------|---------| | `email` | Email | E-Mail-Adresse | Ja | | `firstName` | Text | Vorname | Nein | | `lastName` | Text | Nachname | Nein | | `status` | Select | Anmeldestatus | Ja | | `interests` | Select (hasMany) | Interessengebiete | Nein | | `source` | Text | Anmeldequelle | Nein | | `subscribedAt` | Date | Anmeldedatum (auto) | Nein | | `confirmedAt` | Date | Bestätigungsdatum (auto) | Nein | | `unsubscribedAt` | Date | Abmeldedatum (auto) | Nein | | `confirmationToken` | Text | Token für Double Opt-In (auto) | Nein | | `ipAddress` | Text | IP-Adresse (DSGVO) | Nein | | `userAgent` | Text | Browser-Info | Nein | #### Double Opt-In Flow 1. User meldet sich an → Status: `pending`, Token generiert 2. E-Mail mit Bestätigungs-Link wird automatisch gesendet 3. User klickt Link → Status: `confirmed` 4. Willkommens-E-Mail wird gesendet 5. Abmeldung jederzeit über Link möglich #### Status-Werte - `pending` - Ausstehend (Double Opt-In) - `confirmed` - Bestätigt - `unsubscribed` - Abgemeldet - `bounced` - E-Mail nicht zustellbar --- ### 4. FAQs Collection **Pfad:** `src/collections/FAQs.ts` **Slug:** `faqs` **Admin-Gruppe:** Content Häufig gestellte Fragen mit Kategorisierung. #### Felder | Feld | Typ | Beschreibung | Pflicht | |------|-----|--------------|---------| | `question` | Text | Frage | Ja | | `answer` | RichText | Antwort | Ja | | `category` | Text | Kategorie | Nein | | `order` | Number | Sortierung | Nein | | `isActive` | Checkbox | Sichtbarkeit | Nein | --- ### 5. Team Collection **Pfad:** `src/collections/Team.ts` **Slug:** `team` **Admin-Gruppe:** Content Team-Mitglieder und Mitarbeiter. #### Felder | Feld | Typ | Beschreibung | Pflicht | |------|-----|--------------|---------| | `name` | Text | Name | Ja | | `role` | Text | Position/Rolle | Nein | | `image` | Upload | Portrait-Foto | Nein | | `bio` | Textarea | Kurzbiografie | Nein | | `email` | Email | E-Mail-Adresse | Nein | | `phone` | Text | Telefon | Nein | | `socialLinks` | Array | Social Media Links | Nein | | `order` | Number | Sortierung | Nein | | `isActive` | Checkbox | Sichtbarkeit | Nein | --- ### 6. Services Collection **Pfad:** `src/collections/Services.ts` **Slug:** `services` **Admin-Gruppe:** Content Leistungen und Dienstleistungen. #### Felder | Feld | Typ | Beschreibung | Pflicht | |------|-----|--------------|---------| | `title` | Text | Leistungsname | Ja | | `slug` | Text | URL-Pfad | Ja | | `excerpt` | Textarea | Kurzbeschreibung | Nein | | `content` | RichText | Detailbeschreibung | Nein | | `icon` | Text | Icon-Name | Nein | | `image` | Upload | Bild | Nein | | `category` | Relationship | Service-Kategorie | Nein | | `order` | Number | Sortierung | Nein | --- ### 7. Timelines Collection **Pfad:** `src/collections/Timelines.ts` **Slug:** `timelines` **Admin-Gruppe:** Content Chronologische Events für Geschichte, Meilensteine, Releases. #### API ```typescript // Timeline laden fetch('https://cms.c2sgmbh.de/api/timelines?tenant=4&slug=company-history&locale=de') ``` #### Timeline-Typen - `history` - Unternehmensgeschichte - `milestones` - Projektmeilensteine - `releases` - Produkt-Releases - `career` - Karriere/Lebenslauf - `events` - Ereignisse - `process` - Prozess/Ablauf --- ### 8. Workflows Collection **Pfad:** `src/collections/Workflows.ts` **Slug:** `workflows` **Admin-Gruppe:** Content Komplexe Prozesse mit Phasen, Abhängigkeiten und Status-Tracking. #### API ```typescript // Workflow laden fetch('https://cms.c2sgmbh.de/api/workflows?tenant=4&type=project&locale=de') ``` #### Workflow-Typen - `project` - Projektabläufe - `business` - Geschäftsprozesse - `approval` - Genehmigungs-Workflows - `onboarding` - Mitarbeiter-/Kundeneinführung - `support` - Support/Service-Prozesse - `development` - Entwicklungsprozesse --- ## Blocks Alle Blocks können in der Pages Collection verwendet werden. ### Block-Übersicht | Block | Slug | Beschreibung | |-------|------|--------------| | Posts List | `posts-list-block` | Blog/News-Liste | | Testimonials | `testimonials-block` | Kundenstimmen | | Newsletter | `newsletter-block` | Anmeldeformular | | Process Steps | `process-steps-block` | Prozess-Schritte | | Timeline | `timeline-block` | Chronologie | | FAQ | `faq-block` | FAQ-Akkordeon | | Team | `team-block` | Team-Mitglieder | | Services | `services-block` | Leistungen | ### 1. Posts List Block **Slug:** `posts-list-block` Zeigt eine Liste von Blog-Artikeln, News oder anderen Post-Typen an. #### Konfigurationsoptionen | Option | Typ | Standard | Beschreibung | |--------|-----|----------|--------------| | `title` | Text | - | Überschrift | | `subtitle` | Text | - | Untertitel | | `postType` | Select | blog | Beitragstyp-Filter | | `layout` | Select | grid | Darstellung | | `columns` | Select | 3 | Spaltenanzahl (bei Grid) | | `limit` | Number | 6 | Anzahl Beiträge | | `showFeaturedOnly` | Checkbox | false | Nur hervorgehobene | | `filterByCategory` | Relationship | - | Kategorie-Filter | | `showExcerpt` | Checkbox | true | Kurzfassung anzeigen | | `showDate` | Checkbox | true | Datum anzeigen | | `showAuthor` | Checkbox | false | Autor anzeigen | | `showCategory` | Checkbox | true | Kategorie anzeigen | | `showPagination` | Checkbox | false | Pagination | | `showReadMore` | Checkbox | true | "Alle anzeigen" Link | | `backgroundColor` | Select | white | Hintergrundfarbe | #### Layout-Optionen - `grid` - Karten im Grid - `list` - Listenansicht - `featured` - Featured + Grid - `compact` - Kompakt (für Sidebar) - `masonry` - Masonry-Layout --- ### 2. Testimonials Block **Slug:** `testimonials-block` Zeigt Kundenstimmen aus der Testimonials Collection. #### Layout-Optionen - `slider` - Karussell - `grid` - Karten im Grid - `single` - Einzeln (Featured) - `masonry` - Masonry-Layout - `list` - Listenansicht --- ### 3. Newsletter Block **Slug:** `newsletter-block` Anmeldeformular für Newsletter mit DSGVO-Hinweis. #### Layout-Optionen - `inline` - Eingabe + Button nebeneinander - `stacked` - Untereinander - `with-image` - Mit Bild (50/50) - `minimal` - Nur Input - `card` - Karten-Design --- ### 4. FAQ Block **Slug:** `faq-block` FAQ-Akkordeon mit Schema.org Markup. #### Konfigurationsoptionen | Option | Typ | Beschreibung | |--------|-----|--------------| | `title` | Text | Überschrift | | `subtitle` | Text | Untertitel | | `displayMode` | Select | all / selected / byCategory | | `selectedFaqs` | Relationship | Handverlesene FAQs | | `filterCategory` | Text | Kategorie-Filter | | `layout` | Select | accordion / list / grid | | `expandFirst` | Checkbox | Erste FAQ offen | | `showSchema` | Checkbox | JSON-LD generieren | --- ### 5. Team Block **Slug:** `team-block` Team-Mitglieder aus der Team Collection. #### Layout-Optionen - `grid` - Karten im Grid - `list` - Listenansicht - `carousel` - Karussell - `compact` - Kompakt --- ### 6. Services Block **Slug:** `services-block` Leistungen aus der Services Collection. #### Layout-Optionen - `grid` - Karten im Grid - `list` - Listenansicht mit Details - `icons` - Icon-Grid - `tabs` - Tab-Navigation --- ## Multi-Tenant Konfiguration Alle Collections sind für Multi-Tenant konfiguriert: ```typescript // payload.config.ts multiTenantPlugin({ tenantsSlug: 'tenants', collections: { posts: {}, testimonials: {}, 'newsletter-subscribers': {}, faqs: {}, team: {}, services: {}, timelines: {}, workflows: {}, // ... weitere Collections }, }) ``` ### Tenant-Zuordnung Jedes Dokument enthält ein `tenant`-Feld. Die Access-Control sorgt für Isolation: - **Authentifizierte Admins:** Sehen alle Dokumente - **Anonyme Requests:** Nur Dokumente des passenden Tenants ### Tenant-IDs | ID | Name | Slug | |----|------|------| | 1 | porwoll.de | porwoll | | 4 | Complex Care Solutions GmbH | c2s | | 5 | Gunshin | gunshin | --- ## Dateien-Übersicht ``` src/ ├── collections/ │ ├── Posts.ts │ ├── Categories.ts │ ├── Testimonials.ts │ ├── NewsletterSubscribers.ts │ ├── FAQs.ts │ ├── Team.ts │ ├── Services.ts │ ├── ServiceCategories.ts │ ├── Timelines.ts │ └── Workflows.ts ├── blocks/ │ ├── PostsListBlock.ts │ ├── TestimonialsBlock.ts │ ├── NewsletterBlock.ts │ ├── ProcessStepsBlock.ts │ ├── TimelineBlock.ts │ ├── FAQBlock.ts │ ├── TeamBlock.ts │ ├── ServicesBlock.ts │ └── index.ts ├── lib/ │ ├── tenantAccess.ts │ └── email/ │ ├── newsletter-service.ts │ └── newsletter-templates.ts ├── hooks/ │ └── sendNewsletterConfirmation.ts └── app/(payload)/api/newsletter/ ├── subscribe/route.ts ├── confirm/route.ts └── unsubscribe/route.ts ``` --- ## URLs ### Production (für Frontends) | Resource | URL | |----------|-----| | Posts API | https://cms.c2sgmbh.de/api/posts | | Testimonials API | https://cms.c2sgmbh.de/api/testimonials | | FAQs API | https://cms.c2sgmbh.de/api/faqs | | Team API | https://cms.c2sgmbh.de/api/team | | Services API | https://cms.c2sgmbh.de/api/services | | Timelines API | https://cms.c2sgmbh.de/api/timelines | | Workflows API | https://cms.c2sgmbh.de/api/workflows | | Newsletter Subscribe | https://cms.c2sgmbh.de/api/newsletter/subscribe | ### Development | Resource | URL | |----------|-----| | API Base | https://pl.porwoll.tech/api | | Admin Panel | https://pl.porwoll.tech/admin | --- ## Changelog ### Version 1.2 (18.12.2025) - Dokumentation auf Production-URLs aktualisiert - API-Endpoints für Frontend hinzugefügt - Newsletter Double Opt-In Flow dokumentiert - Timelines und Workflows Collections hinzugefügt - FAQ, Team, Services Blocks dokumentiert ### Version 1.1 (14.12.2025) - Timelines Collection für chronologische Darstellungen - Workflows Collection für Prozesse - FAQs Collection mit Kategorisierung - Team Collection mit Social Links - Services Collection mit Kategorien ### Version 1.0 (30.11.2025) - Posts Collection um `type`, `isFeatured`, `excerpt` erweitert - Testimonials Collection erstellt - NewsletterSubscribers Collection erstellt (DSGVO-konform) - 5 neue Blocks für Pages implementiert - Multi-Tenant Integration für alle Collections --- *Letzte Aktualisierung: 18. Dezember 2025*