IBAN im Formular validieren
von Hella Schuster
IBAN-Validierung in Contao 4.4
Ergänzung zum Thread im Contao-Forum.
Verwendete Contao-Version: 4.4.40
Um die IBAN in einem Formular zu validieren, verwenden wir den Hook validateFormField und die PHP-Bibliothek globalcitizen/php-iban. (kann über den Contao Manager installiert werden.)
Wie schon im Post mit der Vergabe der Anmeldenummern, benötigen wir auch hier zwei Dateien.
Zuerst die Datei CONTAO/app/Resources/contao/config/config.php
Sollten die Verzeichnisse in Deiner Installation nicht vorhanden sein, dann lege sie einfach an.
<?php
$GLOBALS['TL_HOOKS']['validateFormField'][] = array('AppBundle\MyHooks', 'ibanValidation');
Die zweite Datei - wir nennen sie hier MyHooks.php - muss sich an folgendem Ort befinden:
CONTAO/src/AppBundle/Resources/MyHooks.php
Auch hier gilt: Wenn die Verzeichnisstruktur so noch nicht besteht, dann lege sie an.
<?php
namespace AppBundle;
// Teil von Contao, der verwendet wird:
use Contao\Widget;
// Annahme: globalcitizen/php-iban ist über Composer installiert (composer require globalcitizen/php-iban)
require_once(TL_ROOT.'/vendor/globalcitizen/php-iban/php-iban.php');
// Klasse muss heißen wie php-Datei, hier MyHooks.php
class MyHooks {
public function ibanValidation(Widget $objWidget, $formId, $arrForm)
{
// ID des Formulars mit der IBAN. Im Backend nachsehen und hier eintragen.
$MY_FORM_ID = 1;
// Wenn wir nicht zuständig sind, weil es nicht das zu betrachtende Formular
// oder nicht das IBAN-Feld ist, nichts weiter machen. Dazu einfach (wie im
// Hook erwartet) das unveränderte Widget zurückgeben.
if ($arrForm['id'] != $MY_FORM_ID || $objWidget->name != 'iban') {
return $objWidget;
}
// IBAN verifizieren und bei Fehlern dem Widget die Fehlermeldung mit addError() hinzufügen
if (!verify_iban(strtoupper($objWidget->value))) {
$objWidget->addError($GLOBALS['TL_LANG']['ERR']['iban']);
// Das obige $GLOBALS['TL_LANG']['ERR']['iban'] muss an geeigneter Stelle
// definiert sein. Sonst wird nur eine leere Fehlermeldung ausgebenen, d.h.
// der Frontend-User sieht nichts :-o
// Die Definition geschieht in src/AppBundle/Resources/contao/languages/de/default.php
//
// Alternative: anstelle eine Variable für den Fehlertext zu verwenden ihn einfach
// direkt oben hinschreiben.
// $objWidget->addError('Die von Ihnen eingebenene IBAN scheint nicht gültig zu sein');
}
return $objWidget;
}
}
Damit ein gewünschter Fehlertext ausgegeben wird, so vorgehen, wie in den Kommentaren beschrieben.
Für die erste (und im Skript aktivierten) Variante, die ich bevorzuge, weil man nie weiß, wann der Kunde die Webseite noch in einer weiteren Sprache anbieten möchte, benötigen wir noch die Sprachdateien, die unter
src/AppBundle/Resources/contao/languages/de/default.php
src/AppBundle/Resources/contao/languages/en/default.php
etc.
angelegt werden.
Als Beispiel hier noch die deutsche Variante:
<?php
$GLOBALS['TL_LANG']['ERR']['iban'] = 'Bitte geben Sie eine gültige IBAN an.';
composer.json
Schließlich ergänzen wir unsere composer.json-Datei im webroot noch um folgenden Eintrag, damit der Autoloader unsere neue Klasse finden kann. Das abschließende Komma ist nur nötig, wenn danach noch weitere Angaben folgen.
"autoload": {
"psr-4": {
"AppBundle\\": "src/AppBundle/"
}
},
Autoloader, Cache und Tests
Damit die Einstellungen zum Classloader in der composer.json
wirksam werden muss der Autoloader neu geschrieben werden. Im Contao-Manager gibt es dazu unter "Systemwartung" den Punkt "Composer Class Loader" (auf der Konsole: composer dump-autoload
). Schließlich muss noch der Cache gelöscht werden, damit die Änderungen berücksichtigt werden.
Entweder
- auf der Console mit
vendor/bin/contao-console cache:clear
- im Contao-Manager -> Systemwartung -> Prod.-Cache erneuern oder
- durch Löschen des var/cache Verzeichnisses
Viel Spaß beim Ausprobieren!