IBAN im Formular validieren

von

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!

Zurück