Giter Club home page Giter Club logo

ynewsletter's Introduction

Newsletter für REDAXO 5.x

Installation

Ablauf

  1. Addon installieren
  2. YForm Tabelle erstellen
  3. Eine Gruppe definieren indem man die Tabelle und das E-Mail Feld bestimmt
  4. Einen Newsletter definieren, indem man Subject, Absendeadresse, Artikel und Versandgruppe bestimmt
  5. Artikel für Anmeldung und Anmeldung Bestätigen erstellen
  6. Artikel Anmeldung Bestätigen befüllen
  7. YForm E-Mail Template erstellen
  8. Artikel Anmeldung befüllen
  9. Über Versand den entsprechenden Newsletter im Intervall oder als Paket verschicken
  10. (optional) Versand über Cronjob steuern

Schritt für Schritt Anleitung

1. Addon YNewsletter installieren

Ins Backend einloggen und mit dem Installer das Addon installieren

2. YForm Tabelle erstellen

In YForm Table Manager eine Tabelle für Newsletter-Empfänger erstellen, zBsp. rex_ynewsletter_verteiler. Folgende Felder erstellen:

Feld Name Typ Sonstiges
email E-Mail-Adresse email
status Status choice inaktiv=0, aktiv=1
newsletter Newsletter checkbox
activation_key Aktivierungsschlüssel text

3. in YNewsletter Gruppe erstellen

In YNewsletter > Gruppe einen Datensatz anlegen, z.B. Name Empfänger, Tabelle rex_ynewsletter_verteiler und E-Mail Feld email

4. in YNewsletter Newsletter erstellen

In YNewsletter > Newsletter einen Datensatz anlegen, z.B. Subject Mein ersters Newsletter, Absender eingeben (beispielsweise [email protected]), Absendername (beispielsweise Maxima Musterfrau), Article den Artikel angeben, der den Newsletter Inhalt abbildet, zuvor erstelle Gruppe angeben Empfänger und ggf. Sprache wählen (aus Redaxo System > Sprachen).

5. in Struktur Artikel erstellen

in Struktur Artikel für Anmeldung und Anmeldung Bestätigen erstellen, Bezeichnung frei wählbar

6. Artikel Anmeldung Bestätigen bearbeiten

Block YForm Formbuilder hinzufügen. In der Eingabemaske folgenden Code einfügen und Platzhalter %TABLE% mit Tabellennamen rex_ynewsletter_verteiler ersetzen. Die Artikel ID dieses Artikels notieren. Falls der Block YForm Formbuilder fehlt, in YForm Übersicht über den enstprechenden Button nachinstallieren.

hidden|status|1
hidden|newsletter|1
objparams|submit_btn_show|0
objparams|send|1
objparams|csrf_protection|0

validate|ynewsletter_auth|%TABLE%|activation_key=activation_key,email=email|status=0|{{ form.newsletter.error.confirmation.validate }}|

action|db|%TABLE%|main_where

7. YForm E-Mail Template erstellen

In YForm > E-Mail Templates einen neuen Datensatz anlegen folgenden Code einfügen. Den Platzhalter %ARTICLE_ID_CONFIRM% mit der zuvor notierten Artikel ID ersetzen. Im Feld “Key” einen eindeutigen Key eingeben, zBsp. email_tmpl_ynewsletter_anmeldung

Bitte bestätigen Sie Ihre Registrierung:
<?php
$url = rex::getServer().rex_getUrl(%ARTICLE_ID_CONFIRM%,'',[ 'activation_key' => REX_YFORM_DATA[field="activation_key"], 'email' => REX_YFORM_DATA[field="email"] ], '&');
$url = str_replace(['./','//','https:/'],['','/','https://'],$url);
echo $url;
?>

8. Artikel Anmeldung bearbeiten

zurück in Struktur im Artikel Anmeldung Block YForm Formbuilder hinzufügen und folgenden Code einfügen. Die Platzhalter %TABLE% und %EMAIL_TEMPLATE_KEY% mit Tabellennamen rex_ynewsletter_verteiler und E-Mail-Template-Key email_tmpl_ynewsletter_anmeldungersetzen.

generate_key|activation_key
hidden|status|0
hidden|newsletter|1

text|email|{{ form.email }}*
validate|unique|email|{{ form.email.error.unique }}|%TABLE%
validate|type|email|email|{{ form.email.error.type }}
captcha|{{ form.captcha  }}|{{ form.captcha.error }}

checkbox|privacy|{{ form.newsletter.privacy }}|0|no_db
validate|empty|privacy|{{ form.privacy.error.empty }}

submit|send|{{ form.newsletter.submit }}|no_db

action|db|%TABLE%
action|tpl2email|%EMAIL_TEMPLATE_KEY%|email

9. Fertig!

Nun kann man unter YNewsletter > Testversand oder unter YNewsletter > Versand ein Testversand respektive ein echter Versand ausgelöst werden.


(Optional) 10. Versand über Cronjob

Will man einen Versand über einen Cronjob automatisch starten, so kann man folgenden PHP Code verwenden:

Achtung - Jeder erstellte Newsletter wird dann direkt verschickt

<?php

$nllog = '';
$open_newsletters = self::query()->where('status', 0)->orderBy('id', 'desc')->find();

if (0 == count($open_newsletters)) {
    echo 'keine Newsletter zu verschicken';
} else {
    foreach ($open_newsletters as $obj) {
        $newsletter = self::get($obj->id);
        $newsletter->sendPackage(500);
        echo $newsletter->ynewsletter_user_count.'verschickt an '.$newsletter->subject.' [id='.$newsletter->id.']'."\n";
    }
}

?>

Gut zu wissen

Platzhalter die angepasst werden müssen

Platzhalter Beschreibung
%TABLE% Tabelle in der die Anmeldungen gespeichert werden
%EMAIL_TEMPLATE_KEY% Key des YForm E-Mail-Templates
%ARTICLE_ID_CONFIRM% Id zum Bestätigungsartikel (wird aus der E-Mail heraus aufgerufen)

Andere Platzhalter die mit {{ ... }} umschlossen sind, werden via Sprog ersetzt.

Platzhalter für die Verwendung in Templates, Modulen, Subject etc. Hier ein Beispiel für die Verwendung von Ansprachen. Bitte beachten, dass bei Modulen die REX_VALUES mit output="html" verwendet werden müssen, da sonst unerwünschte Quotes auftauchen könnten oder Feldnamen nicht erkannt werden könnten.

REX_YNEWSLETTER_DATA[field="name" prefix="Sehr geehrte/r Herr/Frau "]
REX_YNEWSLETTER_DATA[field="name" ifempty="Sehr geehrte Damen und Herren"]

Rechte

  • Da die Tabellen über die YForm verwaltet werden, muss man hierrüber an die User Tabellenrechte geben.
  • Nur ein Admin kann die Gruppen anlegen

Ausschlussliste

  • Diese Liste kann mit E-Mails befüllt werden, welche beim Versand explicit ausgenommen werden
  • Wenn ein User keiner Versandgruppe zugordnet ist, wird der Versand an diese E-Mail immer unterbunden.

Integrierte Abmeldung (Eintrag in die Ausschlussliste)

Die Ausschlussliste ermöglich ein Abmelden eines Empfänger ohne in der Originaltabelle Eintragungen zu machen. Dabei wird über REX_VARs ein Abmeldenlink erstellt und die ArtikelID angegeben, welchen nach der Abmeldung aufgerufen wird. ("Danke" für die Abmeldung).

Folgender REX_VAR wird dafür verwenden, welcher einfach in das Newsletter Template oder Modul eingesetzt wird

Beispiel 1

REX_YNEWSLETTER_UNSUBSCRIBE[groups="" redirectToID=3 output=url]

Es wird ein individueller Link erstellt welcher für Abmeldung des aktuellen Users sorge und auf die ArtikelID 3 verweist. Es wird ausschliesslich die URL ausgegeben.

Beispiel 2

REX_YNEWSLETTER_UNSUBSCRIBE[groups=1,3,2 redirectToID=4 output=html]

Es wird der komplette A Tag erstellt mit dem Link, welcher den User aus den Gruppen 1,2 und 3 abmelden und anschliessend auf den Artikel mit der ID weiterleitet.

Beispiel 3 (normalerweise diesen hier nutzen)

REX_YNEWSLETTER_UNSUBSCRIBE[redirectToID=3 output=url]

Es wird ein Abmeldelink erstellt mit dem aktuellen User und der aktuellen Gruppe.

Sofern der Newsletter im Browser aufgerufen wird, verschwinden die REX_VARS.

ynewsletter's People

Contributors

dergel avatar itworks-development avatar tbaddade avatar tyrant88 avatar ynamite avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

ynewsletter's Issues

Versendete Newsletter können nicht nochmal benutzt werden ...

... das wissen die Kunden nicht und stellen die bereits verschickten NL wieder auf "offen", wechseln den Newsletter-Artikel und wundern sich, dass der NL nicht ankommt. Mein Vorschlag wäre: mindestens eine farbliche Kennzeichnung, dass die fertig verschickten NL ausgegraut werden (die noch nicht ganz verschickten vielleicht solange in orange), oder, dass es nicht mehr möglich ist, die NL erneut auf "offen" zu stellen, solange das LogFile den erneuten Versand verhindern würde.
Merci
Heinz

Funktioniert es?

An sich ein tolles Addon und ich freu mich drauf. Ich wollte es aber gerade mal einsetzen/testen und musste feststellen, dass es irgendwie nicht funktioniert oder ich zu blöd bin :).

Ich habe schon länger eine yform-Tabelle 'rex_newsletter_subscribers' und nun das Addon installiert. Dann habe ich eine Gruppe angelegt. Tabellenname ist 'rex_newsletter_subscribers'; E-Mail Feld ist 'email'.

Anschliessend bin ich auf Newsletter gegangen und habe dort einen angelegt. Beim Versand kommt aber lediglich die Meldung Error while executing statement "select * from ``"! SQLSTATE[42000]: Syntax error or access violation: 1103 Incorrect table name '' ... und das obwohl beim Newsletter eine Gruppe hinterlegt ist.

Fehler bei ynewsletter mit yform?

Einen Fehler bekomme ich, wenn ich nach der Installation des ynewsletter bei yform in das SetUp gehe:
Declaration of rex_yform_validate_ynewsletter_auth::getDescription() must be compatible with rex_yform_base_abstract::getDescription(): string. Erzeugt wird der Fehler laut Logfile in
redaxo/src/addons/ynewsletter/lib/yform/validate/ynewsletter_auth.php, Zeile 52.
Wenn ich ynewsletter deaktiviere funktioniert der SetUp Link bei yform wieder.
LG Heinz

Readme mit einfacher Schritt für Schritt Anleitung ergänzen

Die Readme ist recht verwirrend und imo genau verkehrt beschrieben, wie man vorgehen soll.

So was in der Art fände ich besser:

  1. zuerst in yform eine Tabelle für Newsletter-Empfänger erstellen, zBsp. rex_newsletter_verteiler
  2. diese Tabelle weist du in ynewsletter einer Gruppe zu (soweit bist du glaube ich schon)
  3. erstelle die Artikel “Anmeldung” und einen Artikel “Anmeldung bestätigen”
  4. im Artikel “Anmeldung bestätigen” fügst du den Block yform formbuilder hinzu. In der Eingabemaske fügst du den Code aus der Readme unter “Anmeldung bestätigen” ein und ersetzt den Platzhalter %TABLE% mit deinem Tabellennamen, bzw. rex_newsletter_verteiler. Notiere dir die Artikel ID dieses Artikels.
  5. nun erstellst du unter yform ein E-Mail-Template und fügst dort den Code aus der Readme unter “Anmeldung per E-Mail versenden” ein und ersetzt den Platzhalter %ARTICLE_ID_CONFIRM% mit der zuvor notierten Artikel ID. Im Feld “Key” einen eindeutigen Key eingeben, zBsp. mail_newsletter_anmeldung
  6. zu guter Letzt im Artikel “Anmeldung” den Block yform formbuilder hinzufügen. In der Eingabemaske dann den Code aus dem Abschnitt “Anmeldung” aus der Readme einfügen und die Platzhalter %TABLE% und %EMAIL_TEMPLATE_KEY% mit deinem Tabellennamen und E-Mail-Template-Key ersetzen; dem Beispiel folgend rex_newsletter_verteiler und mail_newsletter_anmeldung einsetzen
  7. Fertich.

Wichtig: falls der Block yform formbuilder fehlt, in der yform Übersicht über den enstprechenden Button nachinstallieren.

--

Testversand - ID des Testusers via List Widget?

Hintergrund:
Kunde wollte den Testversand an mehrere User schicken. Er ging den Umweg über Tabelle leeren und reduziert importieren (4 Adressen).

Da fände ich es sinnvoller, wenn beim Testversand ein List Widget erscheint mit Auswahl der User. So muss man auch nicht zwingend erst die Id des Users aus der Datentabelle suchen.

REX_YNEWSLETTER_DATA : keine Übergabe der Userdaten - subject bleibt leer

Das wird im Modul genutzt

$salutation = 'REX_YNEWSLETTER_DATA[field="salutation" salutation=REX_VALUE[4] callback=Project\RexVar\Callback::newsletterSalutation]';

Das Callback sieht so aus

<?php declare(strict_types=1);

namespace Project\RexVar;

class Callback
{
    public static function newsletterSalutation($params)
    {
        dd($params);

        array:6 [▼
            "var" => "REX_YNEWSLETTER_DATA"
            "class" => "rex_var_ynewsletter_data"
            "subject" => ""
            "field" => "salutation"
            "salutation" => 1
            "callback" => "Project\RexVar\Callback::newsletterSalutation"
        ]
    }
}

das subject bleibt leer.

Mailjet trigger einbauen

Mailjet kann events triggern, z.B. Bounces. Um das entgegenzunehmen könnte man mit einem API Key das entsrepchend bereitstellen, so dass die Ausschlussliste z.B. Hardbounces mit aufnimmt.

REX_YNEWSLETTER_DATA erweitern

wenn z.B. im Frontend ausgegeben, dann sollte der REX_VAR Context auch verwendet werden und ein Plkatzhalter gesetzt werden. z.B. Statt Vornamen, Nachnamen -> sehr geehrte Damen ..

prüfen ob das möglich ist.

REX_YNEWSLETTER_DATA - Context anpassen

Bisher wird das Var nur im ynewsletter_template Context geparst wird jedoch zumeist aber auch auf der Website dargestellt, sodass die Var dort direkt ausgegeben wird.

Zur Veranschaulichung

Beispiel Screenshot von der Website

Bildschirmfoto 2021-09-27 um 10 31 35

Im versendeten Newsletter selbst steht dort

Sehr geehrter Herr Jan Kristinus,

Entweder REX_YNEWSLETTER_DATA würde den Context erweitern und über einen zusätzlichen Key Standardwerte ausgeben lassen oder was ich sinnvoller finde, aber eher in den Core gehört, dass man im Template/Modul den Context abfragt und selbst reagieren kann.

Personalierte Newsletter ermöglichen

Ich würde gerne einen personalisierten Newsletter verschicken. Sprich mit Platzhaltern für Vorname/Nachname. Diese müsste man irgendwie definieren können, PR dafür steht bereit.

Aktuelle Version nicht im Installer

Die Version 1.5.1 im Installer hat noch keine Return types. Das führt zu
Declaration of rex_yform_validate_ynewsletter_auth::getDescription() must be compatible with rex_yform_base_abstract::getDescription(): string

Der aktuelle GitHub-Stand funktioniert.

Cronjob

Hallo yakamara,
ynewsletter ist für mich eine gute Alternative zum Multinewsletter und ich würde ihn gerne nehmen für ein Projekt. Hier kann ich z.B. eine Mehrfach-Anmeldung auf eine eMail-Adresse selbst mit meinen Kenntnissen erreichen. Die Menge der ynewsletter-Dateien ist übersichtlich und ich fände es super, wenn ynewsletter weiter entwickelt würde.
Leider bin ich nur Redaxo-Anwender (das aber schon seit 15 Jahren), kein Entwickler, deshalb steige ich durch die Anbindung mit yform nicht durch. Was ich im Moment brauche, ist die Auslösung des Newsletter-Versands durch einen Cronjob, und das für mehrere Gruppen in einem Rutsch.
Ich habe diese Frage schon in Slack gestellt, doch dort werden leider auch präzise Fragen allzuoft mit Gegenfragen beantwortet. Ich habe Druck seitens des Kunden und muss hier bald eine Lösung finden.
Meine Frage: wo kann ich ansetzen?. Das Versendescript soll alle Gruppen mit einem Cronjob abschicken. Ein guter Hinweis, aus der Hüfte geschossen, würde mich ja vielleicht schon auf die Spur bringen.
Danke und viele Grüße v. Heinz

GitHub Adresse falsch, Fehlermeldung

Auch hier ist die GitHub-Adresse falsch in der add-on-Hilfe: Es steht dort github.org anstatt github.com

Ich kann ynewsletter mit yform 4.0.0 nicht installieren (Versionsfehlermeldung). Daraufhin habe ich im packages.yml die Version manuell auf 4 gesetzt. Die Installation geht, aber wenn ich dann im Modul bspw. auf den Tab "Versand" klicke, kommt dies:

Error while executing statement "SELECT rex_ynewsletter.* FROM rex_ynewsletter WHERE status = :p1 ORDER BY id desc" using params {"p1":0}! SQLSTATE[42S22]: Column not found: 1054 Unknown column 'status' in 'where clause'

Platzhaler unsubscribe wird nicht ersetzt

Hallo,
ich nutze REX_YNEWSLETTER_UNSUBSCRIBE[groups="" redirectToID=5 output=html] im Newsletterartikel.
In der versendeten e-Mail kommt nur der Platzhalter {{ ynewsletter.unsubscribe }}
SPROG will nicht ersetzen.

Auch der eigene Outputfilter zeigt keine Wirkung:

rex_extension::register('OUTPUT_FILTER', "meineUpdateFunction", rex_extension::LATE);
function meineUpdateFunction($ep) {
    # dump($ep); // auskommentieren, um alle Informationen des EP-Objekts zu erhalten
    $subject = str_replace("{{ ynewsletter.unsubscribe }}","Newsletter abmelden",$ep->getSubject());
    return $subject;
}

Doku verbessern.

Beschreiben was passiert.

  • Text und HTML Varianten
  • Wie ist der Ablauf
  • Wann Pakete versenden, wann alles
  • Abmeldung, Userlisten, Ycom?, Kompletter Ablauf

@tyrant88 Bock ? :)

User in mehreren Gruppen

Kennt jemand eine Lösung für folgendes Problem: wenn ein User mehr als einer (Newsletter-) Gruppe zugewiesen wird, wird er (z.B. beim Testversand) nicht gefunden... Danke - Snoopen

Abmeldefunktion!?

Es wäre toll wenn es noch eine Abmeldefunktion in der Beschreibung gebe. ;-)

Gruß Christian :-)

Mehrsprachigkeit beim Newsletter

Ich habe einen mehrsprachigen Newsletter. Im NL-Template frage ich die Sprache ab, um in der Zeile "Zur Online-Version" z.B. auf die entsprechende URL der Website in der entsprechenden Sprache zu kommen. Wenn ich mir die Sprache ausgeben lasse in der Vorschau des Redaxo-Artikels, der mit dem NL-Template bestückt ist, dann klappt das gut. Doch bei Testversand und Versand des NL wird nur die Clang 1 genommen wie es scheint. Sprog geht hier scheinbar auch nicht, {{url.sprache}} wird nicht umgesetzt, sondern erscheint in Klarschrift.
LG Heinz

Auszug Template:

<!DOCTYPE html>
<html lang="<?php print rex_clang::getCurrent()->getCode(); ?>" xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
<head>
<meta name="viewport" content="width=device-width"> 
usw.
<?php

$dieseseite = rex_getUrl($this->getValue('article_id'), rex_clang::getCurrentId());
$thislang = rex_clang::getCurrent()->getCode();
switch ($thislang) {
    case 'en':
        $online_lang = 'Go to online version of the newsletter.';
        $abbestell_lang = 'Unsubscribe newsletter';
        $impress_lang = 'Imprint';
        break;
    case 'it':
        $online_lang = 'Per la versione online della newsletter.';
        $abbestell_lang = 'Annullamento della newsletter';
        $impress_lang = 'Impronta';
        break;
    default:
        $online_lang = 'Zur Onlineversion des Newsletter.';
        $abbestell_lang = 'Newsletter abbestellen';
        $impress_lang = 'Impressum';
}

?>    
<style>
usw.
</style>
</head>
<body class="">

<table border="0" cellpadding="0" cellspacing="0" class="onlinelink">
<tr>
<td class="container" align="center">
<a href="<?php echo $dieseseite; ?>"><?php echo $online_lang; ?></a></td>
</tr>
</table>

REX_ARTICLE[]
usw.
<?php
$impressumlink = rex_getUrl(9);
$unsubscribelink = rex_getUrl(297).'?activationkey=REX_YNEWSLETTER_DATA[field="activationkey"]&email=REX_YNEWSLETTER_DATA[field="email"]';
?>
<table align="center" border="0" cellpadding="0" cellspacing="0">
<tr>
<td align="right">
<p><a href="<?php echo $unsubscribelink; ?>"><?php echo $abbestell_lang; ?></a></p>
<p><a href="<?php echo $impressumlink; ?>"><?php echo $impress_lang; ?></a></p>
</td>
</tr>
</table>

Namen der Tabellenspalten

Hey,

ich habe eben über den Umweg Watson festgestellt, dass der Spaltenname table in der Tabelle rex_ynewsletter_group etwas ungünstig ist, da table ebenfalls ein reserviertes Keyword für MySQL ist. Kurzum das Addon Watson wird dadurch untauglich.

Mein kurzer Fix bestand nur darin den Spaltennamen anzupassen und daraufhin funktionierte zumindest der Watson wieder.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.