Das markemacht.de-Anfrageformular (Audit-Modal) war nach der Laravel- Integration ohne Endpoint. Es wird jetzt serverseitig über Livewire verarbeitet statt über das alte statische PHP-Skript. - AuditAnfrage-Mailable + Mail-View, Reply-To = Absender - config/marketing.php: Empfänger via MARKETING_ANFRAGE_TO (Default info@markemacht.de) - Livewire-SFC web.audit-form: Validierung (dt.), Honeypot, Rate-Limit (3/10 Min), dispatch('audit-sent') schließt das Modal - Modal-Markup auf <livewire:web.audit-form /> umgestellt - Feature-Tests (Validierung, Versand, Honeypot, Throttle) - Entwicklungsplan unter dev/audit-formular-cookies/ Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
9.7 KiB
Umsetzungsplan — Audit-Formular (Laravel) + Cookie-/Datenschutz-Anpassung
Kontext: Die statische markemacht.de wurde in die Laravel-App integriert. Zwei offene Punkte: (1) das Anfrage-/Audit-Formular ist nach der Migration tot und muss als Laravel-Feature wieder funktionieren, (2) Laravel setzt jetzt System-Cookies — der Hinweis „Keine Cookies" und die Datenschutzerklärung müssen ehrlich werden.
Dieses Dokument ist lebend: Es wird nach jedem Checkpoint aktualisiert. Wer die Arbeit (auch an einem anderen Tag) wieder aufnimmt, liest zuerst 📍 Aktueller Stand und macht beim ersten offenen Checkpoint weiter. Jeder Checkpoint ist so geschnitten, dass der Code danach in sich konsistent ist (Tests grün, nichts halb-fertig).
📍 Aktueller Stand (immer zuerst lesen)
- Phase: ✅ 1 + 2 abgeschlossen.
- Zuletzt erledigt: Phase 2 komplett & verifiziert — mm-wirkung-Cookie entfernt (JS+Blade,
aus Build bestätigt), Footer „DSGVO-konform · keine Weitergabe", Datenschutz neu, 61/61 Tests grün,
Build neu (
markemacht-NNJhNDv3.js). - Als Nächstes: Phase 3 (Klarheits-Check) — eigener Plan/PR, separat. ODER offene Commit-Grenze klären.
- Offen (Entscheidung User): Commit-Grenze. Branch ist komplett WIP/uncommittet; die Phase-1/2- Dateien sind NICHT separat committet, um die laufende Integration nicht zu fragmentieren.
- Branch:
feat/markemacht-laravel-migration - Wiederaufnahme: Diesen Block lesen → ersten offenen
[ ]-Checkpoint suchen → dort „Verifikation" am Ende ausführen, um den Ist-Zustand zu bestätigen, dann weiterarbeiten.
Gesperrte Entscheidungen (nicht mehr offen)
- Audit-Formular wird Livewire-SFC
web.audit-form(Projekt-Konvention: Single-File-Component mit ⚡-Präfix unterresources/views/components/web/⚡audit-form.blade.php, nicht class-based). Tag im Markup:<livewire:web.audit-form />. Modal-Chrome (öffnen/schließen/Fokus inmarkemacht.js) bleibt Vanilla-JS unverändert. - Mailversand über Mailable +
config/mail.php. Lokal: Mailpit (Mutterschiff). Echte SMTP-Creds kommen später in die Server-.env— Code liest nur ausconfig('mail'). - Klarheits-Check ist nicht Teil dieses Plans (eigenes Feature/PR, Controller-basiert).
- Cookie-Strategie: nur technisch notwendige Cookies (
*_session,XSRF-TOKEN).mm-wirkung-Cookie wird entfernt → localStorage-only. Kein Cookie-Banner (kein Rechtsrat). - Footer-Text statt „Keine Cookies": „DSGVO-konform · keine Weitergabe".
Fortschritt (Überblick)
Phase 1 — Audit-Formular funktionsfähig (Livewire)
- CP 1.1 Mail-Fundament:
AuditAnfrage-Mailable + Mail-View, Config/ENV geprüft - CP 1.2 Livewire-Komponente
AuditForm(Validierung, Honeypot, Throttle, Versand) - CP 1.3 Modal-Markup auf
<livewire:web.audit-form />umstellen; Livewire-Assets sicherstellen - CP 1.4 Tests (
Mail::fake, Validierung, Honeypot, Throttle) + Pint — 58/58 grün - CP 1.5 Manuelle Verifikation in Mailpit (Commit: an User-Commit-Grenze gekoppelt)
Phase 2 — Cookies & Datenschutz ehrlich
- CP 2.1
mm-wirkung-Cookie entfernen (JS + Blade-Fallback) → localStorage-only - CP 2.2 Footer-Text „Keine Cookies" → „DSGVO-konform · keine Weitergabe"
- CP 2.3 Datenschutz: Cookie-Absatz neu (technisch notwendige Cookies) + Aussage Datenweitergabe
- CP 2.4 Tests (Footer-Text, Datenschutz-Inhalt) + Pint — 61/61 grün, Build neu
Phase 3 — (separat, nur notiert)
- Klarheits-Check: Blade + JS +
POST /klarheits-check/auswerten(Anthropic-Proxy), inkl. KI-Datenschutz-Absatz. Eigener Plan/PR.
Phase 1 — Audit-Formular (Detail)
Altes Verhalten (Referenz): _markemacht.de/assets/php/send-anfrage.php — POST, Felder
name, email, message, privacy (Pflicht-Checkbox), Honeypot company/url, Versand per
PHPMailer/SMTP, JSON-Antwort {ok, message}. Empfänger/Betreff aus config.php.
CP 1.1 — Mail-Fundament
php artisan make:mail AuditAnfrage --markdown=mail.audit-anfrage(oder plain Blade-View)- Mailable: Felder
name,email,message;Reply-To= Absender;Subject„Neue Anfrage über markemacht.de"; Empfänger ausconfig(z. B.config('mail.from')oder neueconfig('marketing.anfrage_empfaenger')). - Empfänger-Adresse: entscheiden, wo sie herkommt (ENV
MARKETING_ANFRAGE_TO, Defaultinfo@markemacht.de). Inconfig/ablegen, nicht hardcoden. - Verifikation:
php artisan testläuft weiter grün; Mailable-Klasse existiert. - Wiederaufnahme-Notiz (erledigt 2026-06-18): Mailable
App\Mail\AuditAnfrage(ctor:anfrageName,anfrageEmail,anfrageMessage;replyTo= Absender; Subject „Neue Anfrage über markemacht.de"). Viewresources/views/mail/audit-anfrage.blade.php. Empfänger:config('marketing.anfrage_empfaenger')←MARKETING_ANFRAGE_TO, Defaultinfo@markemacht.de(neue Dateiconfig/marketing.php). Render + Inhalt verifiziert.
CP 1.2 — Livewire-Komponente
php artisan make:livewire Web/AuditForm(Livewire-4-Konvention im Projekt prüfen)- Properties + Rules:
namerequired,emailrequired/email,messagerequired,privacyaccepted; Honeypotcompany/url(müssen leer sein). submit(): Honeypot-Check (still „erfolgreich" bei Befüllung), Validierung,RateLimiter(z. B. 3 Anfragen / 10 Min pro IP),Mail::to(...)->send(new AuditAnfrage(...)), Erfolg →$this->dispatch('audit-sent')(das hörtmarkemacht.js:139bereits), Felder leeren, Status-Property setzen.- View
resources/views/livewire/web/audit-form.blade.php: 1:1 die bestehenden Felder/Klassen ausfooter.blade.phpübernehmen (Designsystem unverändert),wire:model,wire:submit,@error,wire:loading,aria-live-Status. - Verifikation: Komponente rendert isoliert (
Livewire::test). - Wiederaufnahme-Notiz: (Throttle-Limits, Event-Name, Validierungsregeln dokumentieren)
CP 1.3 — Einbau ins Modal
- In
resources/views/web/partials/footer.blade.phpden<form data-audit-form …>-Block (Zeilen ~45–77) durch<livewire:web.audit-form />ersetzen. Hülle[data-audit-form-panel]behalten oder in die Komponente ziehen — Modal-Chrome bleibt. - Sicherstellen, dass Livewire-Assets auf Marketing-Seiten geladen werden (Default-Auto-Inject
prüfen; ggf.
@livewireScripts/@livewireStylesins Marketing-Layout). Achtung: vorher lud die Marketing-Seite KEIN Livewire — hier genau testen (Konsole auf Fehler prüfen). - Verifikation: Seite
/auditund Footer-Modal öffnen, Formular sichtbar, keine JS-Fehler. - Wiederaufnahme-Notiz: (ob Layout angepasst werden musste)
CP 1.4 — Tests
- Feature-/Livewire-Test in
tests/Feature/Web/: erfolgreicher Versand (Mail::fake,assertSent), Validierungsfehler, Honeypot (kein Versand, aber „ok"), Throttle. php artisan test --compact --filter=Auditvendor/bin/pint --dirty- Verifikation: alle neuen Tests grün, Gesamt-Suite grün.
CP 1.5 — Manuell + Commit
- Lokal echtes Absenden → Mail erscheint in Mailpit.
- Commit:
feat(marketing): Audit-Anfrageformular als Livewire-Komponente. - Verifikation:
git logzeigt Commit; Arbeitsbaum sauber bzgl. Phase 1.
Phase 2 — Cookies & Datenschutz (Detail)
CP 2.1 — mm-wirkung-Cookie entfernen
resources/js/web/markemacht.js:28(document.cookie = …mm-wirkung…) entfernen.resources/views/web/layouts/marketing.blade.php:53Cookie-Fallback im Inline-Script entfernen (localStorage genügt, läuft vor erstem Paint).npm run buildnötig (JS/Blade-Asset) — User bitten oder ausführen.- Verifikation: Theme-Umschalter funktioniert weiter; im DevTools-Application-Tab kein
mm-wirkung-Cookie mehr, nur localStorage.
CP 2.2 — Footer-Text
resources/views/web/partials/footer.blade.php:6„Keine Cookies" → „DSGVO-konform · keine Weitergabe".- Verifikation: Footer zeigt neuen Text.
CP 2.3 — Datenschutzerklärung
resources/views/web/datenschutz.blade.php:225-226: „verwendet keine Cookies" ersetzen durch Absatz „Technisch notwendige Cookies":markemacht_session+XSRF-TOKEN, Zweck (Bereitstellung/Absicherung der Formulare), Art. 6 Abs. 1 lit. f DSGVO / § 25 Abs. 2 TTDSG, keine Einwilligung nötig, kein Tracking.- localStorage-Absatz (228–233) bleibt korrekt → behalten.
- Aussage zur Datenweitergabe ergänzen/prüfen (Umami self-hosted, keine Dritten) — passt zur Footer-Aussage und zum bestehenden Umami-Absatz (285+).
- Verifikation: Datenschutzseite konsistent, keine Aussage „keine Cookies" mehr.
CP 2.4 — Tests + Commit
- Test in
tests/Feature/Web/: Footer enthält neuen Text / nicht mehr „Keine Cookies"; Datenschutz enthält „Technisch notwendige Cookies". php artisan test --compact+vendor/bin/pint --dirty- Commit:
feat(marketing): Cookie-Hinweis & Datenschutz an Laravel-Integration angepasst. - Verifikation: Suite grün, Commit gesetzt.
Changelog (Arbeitsprotokoll)
| Datum | Checkpoint | Ergebnis / Notiz |
|---|---|---|
| 2026-06-18 | Setup | Plan angelegt, Entscheidungen gesperrt, Footer-Text = „DSGVO-konform · keine Weitergabe". |
| 2026-06-18 | Phase 1 | Mailable AuditAnfrage + Config marketing.anfrage_empfaenger, Livewire-SFC web.audit-form, Modal-Einbau, Tests, Mailpit-E2E. |
| 2026-06-18 | Phase 2 | mm-wirkung-Cookie raus (localStorage-only), Footer-Hinweis, Datenschutz „Technisch notwendige Cookies", Tests, Build. |