Markus Michalski FAQ

Newsletter Management: Storefront-Integration

Newsletter Management für Sylius im Storefront: Anmeldeseite, Footer-Formular, Double-Opt-in-Ablauf, Verwalten und Abmelden, Mails, Sylius-Checkbox, Routen und Theme-Anpassung

English Version

Zurück zur Übersicht

Newsletter Management: Storefront-Integration

Diese Dokumentation bezieht sich immer auf die aktuellste veröffentlichte Version.

Diese Seite beschreibt, was Kunden im Twig-Storefront sehen und erleben: die Anmeldeseite, das Formular im Footer, den Double-Opt-in-Ablauf, die Seiten zum Bestätigen, Verwalten und Abmelden, die Mails des Plugins und die Verbindung zur Newsletter-Checkbox von Sylius. Für Headless-Shops gibt es dieselben Abläufe über die Shop API.

Alle Seiten sind nur für Channels erreichbar, in denen „Newsletter aktiv“ eingeschaltet ist (siehe Konfiguration). Sonst liefert die Anmeldeseite 404.

Routen

Alle Routen stehen in config/routes/shop.yaml. Der Routenname beginnt immer mit mmd_sylius_newsletter_management_plugin_shop_, in der Tabelle steht nur das Ende.

Routenname (Ende) Pfad Methoden Zweck
subscribe /newsletter GET, POST Anmeldeseite
confirm /newsletter/confirm/{token} GET Bestätigungslink aus der Bestätigungsmail
manage /newsletter/manage/{token} GET, POST Anmeldung verwalten (Name, Kategorien)
unsubscribe /newsletter/unsubscribe/{token} GET, POST Abmelden. GET zeigt nur einen Button, POST meldet ab.
track_open /newsletter/track/open/{newsletter}/{signature}.gif GET Zählpixel für Öffnungen (siehe Tracking und Statistik)
track_click /newsletter/track/click/{newsletter}/{code}/{signature} GET Weiterleitung für Klick-Zählung (siehe Tracking und Statistik)

{token} ist das geheime Token der Anmeldung mit 64 Hexzeichen. Die Links in den Mails enthalten es, deshalb braucht keine der Seiten einen Login. Die Routen für die Tracking-Pixel und die Klick-Weiterleitung sind signiert und lassen sich nicht erraten.

Anmeldeseite

Die Seite /newsletter enthält folgende Felder:

Feld Pflicht? Hinweis
E-Mail ja
Vorname, Nachname nein
Kategorienauswahl („Wofür interessierst Du Dich?“) nein Erscheint nur, wenn der Channel aktive Kategorien hat. Leer lassen = alles erhalten. Die Beschreibung der Kategorie steht unter der Checkbox.
Tracking-Einwilligung nein Eigene, freiwillige Checkbox, nur im Tracking-Modus „Personenbezogen“
Einwilligung zum Newsletter ja Verlinkt auf die Datenschutzerklärung, wenn der Channel eine Seite dafür eingetragen hat

Ist ein Kunde eingeloggt, füllt das Plugin E-Mail-Adresse, Vor- und Nachname aus seinem Konto vor. Ein Parameter ?email= in der URL hat Vorrang für die E-Mail-Adresse; so übergibt das Footer-Formular seine Eingabe. Ein abgesendetes Formular behält, was der Besucher getippt hat. Verknüpft wird die Anmeldung mit dem Kundenkonto nur, wenn der Eingeloggte seine eigene Adresse einträgt.

Nach dem Absenden leitet die Seite auf /newsletter zurück und zeigt eine Meldung. Die Meldung ist immer dieselbe, egal ob die Adresse neu, noch unbestätigt oder schon angemeldet ist („Wir haben Dir eine E-Mail geschickt …“). So lässt sich über das Formular nicht herausfinden, wer auf der Liste steht. Ohne Double-Opt-in lautet die Meldung stattdessen „Danke - Du erhältst den Newsletter …“. Weist eine zusätzliche Prüfung (zum Beispiel ein Spam-Schutz, siehe Erweiterbarkeit) die Anmeldung ab, erscheint eine Fehlermeldung, und nichts wird gespeichert.

Das Footer-Formular ist ein Teaser: Es besteht aus einem E-Mail-Feld und dem Button „Newsletter abonnieren“ und schickt die Adresse per GET an die Anmeldeseite. Dort gibt der Besucher Einwilligung, Namen und Kategorien an. Das Formular erscheint nur, wenn

Eingehängt ist es als Twig Hook im Footer:

Hook Name Priorität Template
sylius_shop.base.footer.content newsletter 150 shop/footer/widget.html.twig

Die Priorität 150 platziert das Formular zwischen dem Link-Menü des Footers (200) und der Zeile mit den Zahlungsarten (100).

Double-Opt-in-Ablauf

graph TD
    A["Anmeldung per Formular oder Shop API"] --> B{"Newsletter im Channel aktiv?"}
    B -->|"Nein"| C["404 / nicht verfügbar"]
    B -->|"Ja"| D{"Zusätzliche Prüfung lehnt ab?"}
    D -->|"Ja"| E["Fehlermeldung, nichts wird gespeichert"]
    D -->|"Nein"| F{"Adresse schon bestätigt?"}
    F -->|"Ja"| G["Mail Bereits angemeldet, nichts ändert sich"]
    F -->|"Nein"| H{"Double-Opt-in aktiv?"}
    H -->|"Ja"| I["Status ausstehend, Bestätigungsmail"]
    H -->|"Nein"| J["Status bestätigt, Willkommensmail"]
    I --> K["Klick auf den Bestätigungslink"]
    K --> L["Status bestätigt, Willkommensmail"]

Der Ablauf im Detail:

  1. Anmeldung. Das Plugin legt eine Anmeldung pro E-Mail-Adresse und Channel an. Die Adresse wird kleingeschrieben und von Leerzeichen befreit. Die gewählten Kategorien werden gespeichert, nicht verfügbare ignoriert.
  2. Bestätigungsmail (bei Double-Opt-in). Die Anmeldung hat den Status „Bestätigung ausstehend“. Wer sich vor der Bestätigung erneut anmeldet, bekommt die Bestätigungsmail erneut. Wer sich nach einer Abmeldung wieder anmeldet, startet von vorn: neuer Status „ausstehend“, neue Tokens, neue Bestätigung.
  3. Bestätigung. Der Klick auf den Link öffnet /newsletter/confirm/{token}, setzt den Status auf „Bestätigt“ und speichert Zeitpunkt und IP-Adresse. Die Seite zeigt „Anmeldung bestätigt“. Ein zweiter Klick auf denselben Link zeigt die Seite erneut, ohne etwas zu ändern oder eine weitere Mail zu senden; ein Link, den es nicht (mehr) gibt oder der zu einer abgemeldeten Anmeldung gehört, zeigt „Link ungültig oder abgelaufen“ (Status 404) mit einem Button, um sich erneut anzumelden.
  4. Willkommensmail. Sie geht nach der Bestätigung raus, bei ausgeschaltetem Double-Opt-in direkt bei der Anmeldung.

Mails, die das öffentliche Formular auslöst, sind pro Anmeldung gedrosselt: Zwischen zwei solchen Mails an dieselbe Adresse liegen mindestens 10 Minuten. Das verhindert, dass jemand über das Formular das Postfach eines Fremden flutet. Die Willkommensmail direkt nach dem Klick auf den Bestätigungslink ist davon ausgenommen. Scheitert der Versand einer Mail, bleibt die Anmeldung trotzdem gespeichert, und der Fehler wird ohne E-Mail-Adresse protokolliert.

Seite „Anmeldung verwalten“

Der Link steckt in der Willkommens- und der „Bereits angemeldet“-Mail sowie im Fuß jedes Newsletters. Die Seite ist nur für bestätigte Anmeldungen erreichbar, alle anderen Tokens zeigen „Link ungültig“. Kunden ändern hier:

Die E-Mail-Adresse wird angezeigt, ist aber nicht änderbar. Sie ist die Grundlage des Einwilligungsnachweises, der Bestätigung und der Verknüpfung mit dem Kundenkonto. Wer eine andere Adresse verwenden möchte, meldet sich ab und mit der neuen Adresse neu an.

Abmelden

Der Abmeldelink öffnet /newsletter/unsubscribe/{token} und zeigt nur eine Frage mit dem Button „Abmelden“. Erst der Klick auf den Button (ein POST) meldet ab. Das ist Absicht: Mailprogramme und Sicherheitsscanner rufen Links in Mails vorab ab, und das darf niemanden abmelden.

Die Abmeldung

Die Seite danach lautet „Du wurdest abgemeldet“. Wer sich später wieder anmeldet, durchläuft den Ablauf von vorn. Der Link im Header List-Unsubscribe der Newsletter zeigt auf dieselbe Route.

„Bereits angemeldet“-Mail

Meldet jemand über das öffentliche Formular eine Adresse an, die schon bestätigt ist, ändert sich nichts an der Anmeldung: weder Kategorien noch Namen. Die Seite antwortet wie bei einer neuen Adresse. Stattdessen bekommt der Inhaber der Adresse die Mail „Du bist bereits für den Newsletter von {Channel-Name} angemeldet“ mit den Links zum Verwalten und Abmelden. Sie unterliegt der Drosselung von 10 Minuten.

Newsletter-Checkbox von Sylius

Sylius bringt im Registrierungsformular und auf der Profilseite eine eigene Newsletter-Checkbox mit, die nur ein Feld am Kunden setzt. Das Plugin macht daraus eine echte Anmeldung mit Double-Opt-in:

Danach hält das Plugin das Feld synchron: Es steht auf „angemeldet“, sobald der Kunde (nach der E-Mail-Adresse zugeordnet) in irgendeinem Channel bestätigt ist, und auf „nicht angemeldet“ nach einer Abmeldung, solange er nirgends bestätigt ist. Eine unbestätigte Anmeldung aus einem anderen Weg (etwa dem Footer-Formular) fasst das Feld nicht an, weil sie auch von einem Fremden stammen kann, der die Adresse nur kennt.

Die Shop API von Sylius zur Registrierung (POST /shop/customers) setzt das Sylius-Feld, ohne dass das Plugin davon erfährt. Headless-Clients melden Kunden deshalb über den Endpunkt des Plugins an (siehe Shop API).

Gespeicherter Einwilligungsnachweis

Pro Anmeldung speichert das Plugin, was du im Streitfall zeigen musst. Im Admin siehst du es auf der Detailseite des Abonnenten.

Angabe Inhalt
E-Mail und Channel pro Kombination genau eine Anmeldung
Quelle Shop-Formular, API, Registrierung oder Admin
Sprache Sprache bei der Anmeldung (bestimmt auch die Sprache der Mails)
Anmeldung Zeitpunkt und IP-Adresse
Bestätigung Zeitpunkt und IP-Adresse
Abmeldung Zeitpunkt
Tracking-Einwilligung Zeitpunkt und der Wortlaut, dem der Abonnent zugestimmt hat

Wie lange abgemeldete und nie bestätigte Anmeldungen aufbewahrt werden, legst du pro Channel fest (siehe Konfiguration).

Mails an Abonnenten

Die drei Mails laufen über den Mailer von Sylius (Mail-Codes unter sylius_mailer.emails). Sie sind HTML-Mails auf Basis des Sylius-Mail-Layouts und kommen in der Sprache der Anmeldung. Den Absender legst du pro Channel fest (siehe Konfiguration). Die Newsletter selbst sind ein eigener Mailweg und stehen auf der Seite Newsletter schreiben und versenden.

Mail-Code Wann Template Inhalt
newsletter_confirmation Neue oder noch unbestätigte Anmeldung bei aktivem Double-Opt-in emails/confirmation.html.twig Bestätigungsbutton und der Link im Klartext
newsletter_welcome Nach der Bestätigung, bei ausgeschaltetem Double-Opt-in direkt bei der Anmeldung emails/welcome.html.twig Button „Anmeldung verwalten“ und Abmeldelink
newsletter_already_subscribed Öffentliche Anmeldung einer bereits bestätigten Adresse emails/already_subscribed.html.twig Hinweis, dass nichts geändert wurde, mit Links zum Verwalten und Abmelden

Der Button in allen drei Mails kommt aus dem Partial emails/_cta.html.twig. Seine Farben stellst du in der Konfigurationsdatei ein (siehe Konfiguration).

Templates im eigenen Theme anpassen

Alle Templates des Plugins liegen im Namensraum @MmdSyliusNewsletterManagementPlugin. Du überschreibst sie wie bei jedem Symfony-Bundle, indem du eine Datei mit demselben Pfad unter templates/bundles/MmdSyliusNewsletterManagementPlugin/ anlegst. Praktisch sinnvoll sind diese:

Template (unter templates/) Zweck
shop/newsletter/subscribe.html.twig Anmeldeseite
shop/newsletter/confirm.html.twig Seite nach dem Klick auf den Bestätigungslink
shop/newsletter/manage.html.twig, manage_invalid.html.twig Anmeldung verwalten und die Fehlerseite dazu
shop/newsletter/unsubscribe.html.twig, unsubscribed.html.twig Abmelde-Button und Bestätigung
shop/footer/widget.html.twig Teaser im Footer
shop/form/theme.html.twig Form Theme der Formulare (zeigt die Kategoriebeschreibung unter der Checkbox)
emails/confirmation.html.twig, welcome.html.twig, already_subscribed.html.twig Die drei Mails
emails/_cta.html.twig Button der Mails

Die Seiten erweitern @SyliusShop/shared/layout/base.html.twig und füllen dessen Block content. Die Mails erweitern @SyliusCore/Email/layout.html.twig.

Ersetzt dein Theme das Footer-Template von Sylius, ohne den Hook sylius_shop.base.footer.content zu rendern, erscheint das Teaser-Formular nicht. Verlinke dann auf /newsletter.

Auf der Anmeldeseite rendert das Plugin nach der Einwilligungs-Checkbox und vor dem Absenden-Button noch den Hook mmd_altcha.widget.newsletter, in den das ALTCHA-Plugin sein Widget einhängt. Ohne dieses Plugin bleibt der Hook leer. Wie andere Plugins das Formular erweitern, steht auf der Seite Erweiterbarkeit.