MODx: Beispiel für die Eventfunktion eFormOnValidate

von Thomas Jakobi am Montag, 13. Oktober 2008 um 18:15 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 eFormOnValidate. Diese Funktion wird aufgerufen, nachdem das Formular validiert worden ist und bevor die Validierungsnachricht am Bildschirm ausgegeben wird. Mit dieser Funktion ist eine zusätzliche Validierungslogik (z.B. bei Feldabhängigkeiten) implementierbar. Also der passende Zeitpunkt um eigene Validierungsregeln zu abzuarbeiten und eigene Fehlermeldungen auszugeben.

Eigene Validierungsregeln benötigt man, wenn z.B. Felder im Formular von einander abhängig sind. Im folgenden Beispiel wird eine Bankverbindung abhängig von einem aktivierten Radiobutton validiert. Dies geht nur mit dem Event &eFormOnValidate von eForm.

Zunächst wird in einem Snippet die Eventfunktion definiert, die an eForm mit dem Parameter &eFormOnValidate übergeben wird. Diese Funktion erwartet die Parameter &$fields, &$vMsg und &$rMsg, die der Funktion als Verweis (Referenz) übergeben werden. &$fields enthält wie auch bei eFormOnBeforeMailSent und eFormOnMailSent ein assoziatives Array von Formularfeldern und ihren Inhalten. &$vMsg enthält ein numerisches Array von Validierungs-Fehlermeldungen. &$rMsg enthält ein numerisches Array von fehlenden benötigten Feldern. Da die numerischen Arrays schon gefüllt sein können, muss man neue Werte an $vMsg und $rMsg anhängen. Alle Fehlermeldungen werden von eForm gebündelt und zusammen ausgegeben.

CheckKonto.php
<?php
function check_konto(&$fields, &$vMsg, &$rMsg)
{
    if ($fields ['einzug'] == 'konto') {
        if ($fields ['konto'] == '') {
            $rMsg [] = 'Kontonummer';
        }
        if ($fields ['blz'] == '') {
            $rMsg [] = 'BLZ';
        }
        if ($fields ['bank'] == '') {
            $rMsg [] = 'Bank';
        }
        if ($fields ['inhaber'] == '') {
            $rMsg [] = 'Inhaber';
        }
    } else {
        $fields ['konto'] = $fields ['blz'] = $fields ['bank'] = $fields ['inhaber'] = '';
    }
    return true;
}
 
// Return empty string
return '';

Im eForm-Aufruf muss der Parameter &eFormOnValidate=`check_konto` gesetzt werden. Die Funktion checkt den Wert des Radio-Buttons aus dem Formular-Chunk …

CheckKontoForm
<input class="radio" onclick="this.form.konto.value='';this.form.blz.value='';this.form.bank.value='';this.form.inhaber.value='';" name="einzug" type="radio" value="selbst" />Ich überweise den Mitgliedsbeitrag auf das Vereinskonto 123456789 bei der SoUndSoBank (BLZ: 123 456 78)
<input class="radio" name="einzug" type="radio" value="konto" />Ich möchte den Mitgliedsbeitrag bequem per Einzugermächtigung abbuchen lassen und ermächtige hiermit …, den von mir zu entrichtenden jährlichen Mitgliedsbeitrag zu Lasten des folgenden Kontos einzuziehen.
<label for="konto">Konto-Nr.:</label>
<input id="konto" maxlength="60" name="konto" type="text" eform="Konto-Nr.:html:0:Ungültige Kontonummer:#FUNCTION check_kontonr" /><br />
<label for="blz">BLZ:</label>
<input id="blz" maxlength="60" name="blz" type="text" eform="BLZ:html:0:Ungültige Bankleitzahl:#FUNCTION check_blz" /><br />
<label for="bank">Bank:</label>
<input id="bank" maxlength="60" name="bank" type="text" eform="Bank:html:0" /><br />
<label for="inhaber">Inhaber:</label>
<input id="inhaber" maxlength="60" name="inhaber" type="text" eform="Inhaber:html:0" /><br />

… und gibt die passenden Validierungsmeldungen aus, wenn der Beitrag eingezogen werden soll und die Kontofelder nicht ausgefüllt worden sind. Wenn der Beitrag selbst gezahlt werden soll, löscht das Snippet den Inhalt der Kontofelder.

Die Funktionen check_kontonr und check_blz sollten auch noch in das oben genannte Snippet eingebaut werden

CheckKonto2.php
function check_kontonr($str) {
	if (! ctype_digit ( $str ))
		return false;
	return true;
}
function check_blz($str) {
	if (strlen ( $str ) != 8 || ! ctype_digit ( $str ))
		return false;
	return true;
}

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

[[!checkKonto]]
[[!eForm?
&eFormOnValidate=`check_konto`
...
]]

Ich hoffe, so wird die erweiterte Validierung von eForm etwas verständlicher.

Die Artikelreihe zu den eForm Eventfunktionen umfasst mittlerweile folgende Texte: