Im Contao-Forum gibt es einen Thread (https://community.contao.org/de/showthread.php?76233-globalcitizen-php-iban), in dem ein User Probleme dabei hat, eine IBAN in einem Formular zu validieren. Er ist dabei vorgegangen, wie in unseren Blog-Posts auf https://www.contao-bayern.de beschrieben.
Um zu überprüfen, woran es lag, habe ich alle beschriebenen Schritte durchgeführt und bei Null begonnen.
Wie sich herausstellen wird: die Anleitung war unvollständig und ein klassicher Fall von "works on my mashine" :-(
Die Schritte -- inklusive der erfolglosen -- habe ich im Folgenden dokumentiert. Um zu einer funktionierenden Lösung zu kommen also am besten erst ein Mal ganz durchlesen und dann die erfolglosen Schritte auslassen.
mkdir testumgebung
cd testumgebung
composer create-project contao/managed-edition . 4.4
Die weiteren Schritte gemäß dem Blogpost https://www.contao-bayern.de/newsreader/iban-im-formular-validieren-revisited.html
composer require globalcitizen/php-iban
ergibt
...
- Installing globalcitizen/php-iban (v2.7.1): Downloading (100%)
...
(vgl. alten Blogeintrag, auf den verwiesen wird)
in der composer.json
am Ende (vor der letzten schließenden Klammer) hinzugefügt:
"autoload": {
"psr-4": {
"AppBundle\\": "src/AppBundle/"
}
}
Beachte: ,
zur Trennung vom bereits existierenden vormals letzten Eintrag!) nicht vergessen. Also so:
...
},
"autoload": {
...
Danach (siehe ebenfalls den referenzierten Blogeintrag https://www.contao-bayern.de/newsreader/iban-im-formular-validieren.html):
composer dump-autoload
ausführen.
Dateinamen, jeweils wie im Kommentar in ersten Codezeile der Beispiele angegeben. Nicht existierende Dateien und Verzeichnisse wurden angelegt:
<?php
// src/AppBundle/Resources/contao/dca/tl_form_field.php
$GLOBALS['TL_DCA']['tl_form_field']['fields']['rgxp']['options'][] = 'iban';
Test:
vendor/bin/contao-console cache:clear
und noch nichts zu sehen. Also weiter:
<?php
// src/AppBundle/Resources/contao/languages/de/tl_form_field.php
$GLOBALS['TL_LANG']['tl_form_field']['iban'] = [
'IBAN',
'IBAN-Verifizierung'
];
und noch nichts zu sehen. Also debuging:
- Worked on my mashine (aber in der damaligen Testumgebung gab es mutmaßlich bereits mehr)
- Daher
composer.json
erweitert
"autoload": {
"classmap": [
"app/ContaoManagerPlugin.php",
"src/AppBundle/Resources/contao"
],
"psr-4": {
"AppBundle\\": "src/AppBundle/"
},
"exclude-from-classmap": [
"src/AppBundle/Resources/contao/assets",
"src/AppBundle/Resources/contao/config",
"src/AppBundle/Resources/contao/dca",
"src/AppBundle/Resources/contao/languages",
"src/AppBundle/Resources/contao/templates"
]
}
- Dateien angelegt:
<?php
// app/ContaoManagerPlugin.php
use AppBundle\AppBundle;
use Contao\ManagerPlugin\Bundle\Config\BundleConfig;
use Contao\ManagerPlugin\Bundle\BundlePluginInterface;
use Contao\ManagerPlugin\Bundle\Parser\ParserInterface;
use Contao\CoreBundle\ContaoCoreBundle;
class ContaoManagerPlugin implements BundlePluginInterface
{
/**
* {@inheritdoc}
*/
public function getBundles(ParserInterface $parser)
{
return [
BundleConfig::create(AppBundle::class)
->setLoadAfter([ContaoCoreBundle::class]),
];
}
}
<?php
// src/AppBundle/AppBundle.php
namespace AppBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class AppBundle extends Bundle
{
}
Ein abschließendes
composer install
und voila: wir haben die IBAN-Prüfung in der Auswahl bei "Eingabeprüfung".
Nicht ganz, denn "kannste zwar so machen, ist halt ...".
Wie sollte man es machen? Das hängt wohl auch von der Contao-Version ab.
Die sehr gute neue Contao-Doku (https://docs.contao.org/dev) zeigt, wie es gemacht werden sollte: Dateien unter contao/
anlegen.
Für die 4.4
er Versionen entspräche das: Anlegen unter app/Resources/contao
.
Also noch Mal los auf Start:
"autoload"
-Eintrag aus dercomposer.json
entferntContaoManagerPlugin.php
undsrc/AppBundle/AppBundle.php
gelöschtsrc/AppBundle/Resources
nachapp/Resources
verschoben. Der Ordnersrc/
, der nun nur noch den leeren OrdnerAppBundle
enthält kann gelöscht werden.composer dump-autoload
undcomposer install
ausgeführt.
Ergebnis: wir haben die IBAN-Prüfung immer noch in der Auswahl bei "Eingabeprüfung".
Wir sind aber natürlich noch nicht fertig, denn der Teil, der den nun unbekannten rgxp
iban
behandelt fehlt noch.
Hier machen wir weiter wie im ursprünglichenBlogpost beschrieben, beachten aber,
daß alles nun unterhalb von app/Resources/contao
angelegt wird.
<?php
// app/Resources/contao/config/config.php
$GLOBALS['TL_HOOKS']['addCustomRegexp'][] = ['AppBundle\Hooks\Iban', 'validateIban'];
<?php
// app/Resources/contao/classes/AppBundle/Hooks/Iban.php
namespace AppBundle\Hooks;
// Voraussetzung: globalcitizen/php-iban ist über Composer installiert
require_once(TL_ROOT.'/vendor/globalcitizen/php-iban/php-iban.php');
use Contao\Widget;
class Iban
{
/**
* Custom Rgxp for 'iban'
* https://docs.contao.org/books/api/extensions/hooks/addCustomRegexp.html
*
* @param string $rgxp
* @param string $varValue
* @param Widget $objWidget
* @return bool
*/
public static function validateIban(string $rgxp, string $varValue, Widget $objWidget)
{
if ('iban' === $rgxp) {
$isValidIban = verify_iban(strtoupper($varValue));
if (!$isValidIban) {
$objWidget->addError($GLOBALS['TL_LANG']['ERR']['iban']);
}
return true; // Ergebnis: wir haben den custom rgxp behandelt
}
return false; // Ergebnis: wir haben den custom rgxp nicht behandelt
}
}
<?php
// app/Resources/contao/languages/de/default.php
$GLOBALS['TL_LANG']['ERR']['iban'] = 'Bitte geben Sie eine gültige IBAN an.';
Noch mal den Contao Cache löschen.
Ergebnis: die Klasse Iban
wird nicht gefunden. Also wieder den "autoload"
-Abschnitt
zur composer.json
hinzufügt (und natürlich composer dump-autoload
).
"autoload": {
"psr-4": {
"AppBundle\\": "app/Resources/contao/classes/AppBundle/"
}
}
Ergebnis: Bei Eingabe einer (absichtlich falschen) IBAN in einem Formular erscheint die gewünschte Fehlermeldung "Bitte geben Sie eine gültige IBAN an.". 🤩
Ja, das geht alles auch in Contao 4.4 so :). Nur der Pfad zu den Contao Config Dateien ist anders (
app/Resourcces/contao/
stattcontao/
). Es würder aber auch unter Contao 4.8 mit dem alten Pfad funktionieren.