Blog heiratet Newsletter

Eines unserer derzeitigen Projekte ist ein Webshop. Dieser Shop hat einen Blog, um über Produktneuheiten zu informieren oder Werbeaktionen anzukündigen. Jetzt ist eine Werbeaktion eine Sache für einen Newsletter ganz klar. Einen Tag keine Versandkosten berechnen und schon gehen die Bestellzahlen nach oben.

Eine Werbeaktion schreit ja eigentlich nach einem Newsletter. Wenn man sich die Arbeit für einen Blogbeitrag gemacht hat, kann man auch noch schnell einen Newsletter daraus erstellen. So eine Aufgabe schreit nach Automatisierung!

Der neue Actionbutton im BackendIn SilverStripe ist das schnell umgesetzt, vorausgesetzt man weis wie es geht. Im folgenden will ich zeigen, wie man das Backend um einen weiteren Actionbutton erweitert. Mit einem Klick auf den selbigen wird ein Newsletter erzeugt und versendet.

Der Button an sich ist der leichteste Teil der Arbeit:

class BlogEntryDecorator extends DataObjectDecorator {

    public function updateCMSActions(FieldSet &$actions) {

        $action = new FormAction(

                "sendEntryAsNewsletter",

                "newsletterisieren"

        );

        $actions->push($action);

        parent::updateCMSActions($actions);

 

        return $actions;

    }

}

Per Decorator wird der Klasse BlogEntry eine neue CMS Action hinzugefügt. Diese ruft die Methode   "sendEntryAsNewsletter" auf. Um diese Methode zu implementieren, müssen wir die entsprechende Klasse des CMS dekorieren:

class CMSActionDecorator extends LeftAndMainDecorator {

 

    public function sendEntryAsNewsletter() {

        //Get ´s the id of the class that called this decorator.

        $id = (int) $_REQUEST['ID'];

        //Get the instance of that class

        $blogEntry = DataObject::get_by_id('BlogEntry', $id);

 

        if ($blogEntry) {

            $newsletterSubscribers = DataObject::get('member', "`SubscribedToNewsletter` = true");

            foreach ($newsletterSubscribers as $subscriber) {

                if ($subscriber->Email) {

                    $email = new Email("senders@email.de", $subscriber->Email, $blogEntry->Title, '');

                    $email->setTemplate('MailNewsletter');

                    $email->populateTemplate(

                            array(

                                'Subscriber' => $subscriber,

                                'BlogEntry' => $blogEntry

                            )

                    );

                    $email->send();

                }

            }

        }

        FormResponse::status_message(sprintf('Newsletter verschickt'),'good');

return FormResponse::respond();

    }

}

 

  • Hier wird zuerst die ID des Seitenobjekts ermittelt. Mit deren Hilfe wird das BlogEntry Objekt geladen.
  • Als nächstes werden alle Mitglieder geladen, die den Newsletter bestellt haben.
  • Zur Erstellung der Email will ich nichts mehr sagen, denn das kann man in der SilverStripe Doku prima nachlesen.
  • Mit den letzten beiden Anweisungen wird die Statusmeldung des Backendbuttons konfiguriert.

Die beiden Dekoratoren müssen jetzt noch in der _config.php registriert werden:  

Object::add_extension('CMSMain', 'CMSActionDecorator');  

Object::add_extension('BlogEntry', 'BlogEntryDecorator');

Ich kann nicht behaupten, dass der Lösungsansatz zur Gänze auf meinem Mist gewachsen ist. Die Idee dazu habe ich auf der Seite ssbits gefunden.

Viel Spass beim „newsletterisieren“ ;)

Tags: