MODx: Beispiel für die Eventfunktion eFormOnBeforeMailSent

von Thomas Jakobi am Donnerstag, 12. Juni 2008 um 09:11 Uhr.

eForm ist ein MODx-Snippet welches das CMS um Formularauswertung und -validierung erweitert. Dazu enthält es viele eingebaute Funktionen. Sollten diese einmal nicht ausreichen, lässt sich das Snippet an verschiedenen Stellen im Ablauf der Formularverarbeitung durch selbst geschriebene Eventfunktionen erweitern.

In diesem Blogeintrag erläutere ich ein Beispiel für die Eventfunktion eFormOnBeforeMailSent. Diese Funktion wird dann ausgeführt, nachdem das Formular ohne Fehlermeldungen validiert worden ist und bevor die Mail verschickt wird. Also der passende Zeitpunkt um beispielsweise die Formulardaten in eine Datenbanktabelle abzuspeichern (siehe eform2db im englischen Forum).

Man kann aber auch eine eigene Mailroutine schreiben und diesem Zusammenhang die Mailroutine von eForm deaktivieren. Im folgenden Beispiel wird dies gemacht, um einen per fpdf erzeugten Anhang mit einer Mail zu verschicken. Das Beispiel benötigt die Klassendatei von fpdf im Verzeichnis /assets/snippets/fpdf.

Zunächst wird in einem Snippet die Eventfunktion definiert, die an eForm mit dem Parameter eFormOnBeforeMailSent übergeben wird. Sie erwartet den Parameter &$fields. Der Parameter enthält ein assoziatives Array von Formularfeldern und ihren Inhalten und wird der Funktion als Verweis (Referenz) übergeben.

eFormToPDF.php
<?php
/*---------------------------------------------------------------
Creates a PDF-File with a parsed chunk and mails it as attachment
to the given mail-address by the form
---------------------------------------------------------------*/
 
function eForm2pdf(&$fields)
{
    global $modx;
 
    // Include FPDF-class & PHPMailer-class
    require_once(MODX_BASE_PATH . '/assets/snippets/fpdf/fpdf.php');
    require_once(MODX_BASE_PATH . '/manager/includes/controls/class.phpmailer.php');
 
    // Fill PDF-chunk
    $text = $modx->parseChunk('reportPDF', $fields, '[+', '+]');
    $text = utf8_decode($text);
    $betreff = "PDF-Datei im Anhang";
    $bodytext = "Dies ist eine Mail mit PDF-Anhang";
    $name = "Versender";
    $email = "Bitte Javascript aktivieren!";
    $empfaenger = $fields ['email'];
 
    $datum = strftime("%e. %B %Y", mktime());
    $adresse = $fields ['vorname'] . ' ' . $fields ['name'] . "\r\n";
    $adresse .= $fields ['strasse'] . "\r\n";
    $adresse .= $fields ['stadt'];
 
    $pdf = new FPDF ('P', 'mm', 'A4');
    $pdf->Open();
    $pdf->SetAutoPageBreak(true);
    $pdf->SetMargins(20, 20, 20);
    $pdf->AddPage();
    $pdf->SetFont('Arial', '', 12);
 
    $pdf->SetXY(20, 50);
    $pdf->Write(5, utf8_decode($adresse));
    $pdf->SetXY(146, 63);
    $pdf->Cell(0, 5, utf8_decode($datum), 0, 2);
    $pdf->SetXY(20, 95);
    $pdf->SetFont('Arial', 'B', 12);
    $pdf->Cell(0, 5, utf8_decode($betreff));
    $pdf->SetXY(20, 110);
    $pdf->SetFont('Arial', '', 12);
    $pdf->Write(5, $text);
    $anhang = $pdf->Output('', 'S');
    $pdf->Close();
 
    $mail = new PHPMailer ();
    $mail->From = $email;
 
    $mail->FromName = $name;
    $mail->AddAddress($empfaenger);
    $mail->Subject = $betreff;
    $mail->Body = $bodytext;
    $mail->AddStringAttachment($anhang, 'anhang.pdf');
 
    // Check if the mail was sent
    if (!$mail->Send()) {
        echo "Die Email konnte nicht gesendet werden";
        echo "Fehler: " . $mail->ErrorInfo;
    }
    return true;
}

Dieses Snippet wird im MODx-Dokument vor dem Aufruf von eForm aufgerufen. Mit dem Parameter &eFormOnBeforeMailSent wird der Funktionsname an eForm übergeben. Der Quelltext der Seite könnte folgendermaßen aussehen:

[[!eFormToPDF]]
[[!eForm?
&eFormOnBeforeMailSent=`eFormToPDF`
&noemail=`1`
...
]]

Die Artikelreihe zu den eForm Eventfunktionen umfasst mittlerweile folgende Texte: