# RiccardoNewsletter

Verdrahtet das Newsletter-Formular im Footer-Band mit Shopwares Newsletter-Anmeldung.

* Formular: `Resources/views/storefront/component/newsletter/rz-newsletter-form.html.twig`
  – wird vom Theme (`layout/footer/footer.html.twig`) eingebunden, abgesichert über
  den Twig-Global `riccardoNewsletterActive` (Theme setzt das Plugin nicht voraus).
* Route: `POST /newsletter/anmelden` (`frontend.riccardo.newsletter.subscribe`)
  ruft Shopwares `NewsletterSubscribeRoute` mit `option=subscribe` auf – also
  **Double-Opt-in**: der Eintrag wird erst nach dem Klick im Bestätigungsmail aktiv.
  Das Rate-Limit je IP bringt die Core-Route mit.
* Mit JavaScript antwortet die Route als JSON und die Meldung erscheint unter dem
  Formular; ohne JavaScript wird normal abgeschickt und mit Flash-Meldung auf die
  Ausgangsseite zurückgeleitet.
* Bestätigungsseite nach dem Klick im Mail: `/newsletter-subscribe` (Core-Route),
  Gestaltung im Theme unter `page/newsletter/confirm-subscribe.html.twig`.

## Prüfen

```bash
# Empfänger und Status
mysql shopware_dev -e "select email,status,confirmed_at from newsletter_recipient order by created_at desc limit 5"
# Mails im lokalen Mailpit
curl -s 'localhost:8025/mailpit/api/v1/messages?limit=5'
```

## Zweiter Klick auf den Bestätigungslink

Shopware wirft dabei eine `ConstraintViolationException`, die der Storefront-Controller
nicht abfängt – der Kunde sah eine Fehlerseite (HTTP 400). `ConfirmRouteDecorator`
fängt das ab: ist dieselbe Adresse schon bestätigt, gilt der zweite Klick als
erfolgreich; ein verfälschter Link wird zur `NewsletterException` und damit zur
Meldung auf der Startseite (Snippets in `Resources/snippet/`, Du-Form).

Abmeldungen laufen über Shopwares eigene Route (`/form/newsletter` mit
`option=unsubscribe`) bzw. den Link in den Mailings.
