Eingabemaske: eigene RegEx-Prüfung
Benötigt man eine eigene RegEx-Validierung für ein Text-Eingabefeld in einer Eingabemaske, so kann das über den folgenden Event-Listener eingebaut werden.
Um diesen einzubauen bzw. für das Feld in der Eingabemaske zu aktivieren, muss die Prüfung mit „Contao-Boardmitteln“ zunächst zur Verfügung stehen.
Dafür wird der Hook „addCustomRegex“ wie folgt angelegt - siehe API: addCustomRegex
Bemerkung
Die folgende Beschreibung ist noch für Contao 4.4 - aktuelle Implementierungen sollten im Ordner src/ angelegt werden
einen Ordner für das eigene Modul unter /system/modules anlegen - z.B. „/metamodels_mycustoms“
in dem Ordner metamodels_mycustoms zwei weitere Ordner „/config“ und „/classes“ anlegen
im Ordner /classes die Datei „MyClass.php“ anlegen wie in der Contao API beschrieben
im Ordner /config die Datei „config.php“ anlegen wie in der Contao API beschrieben
zusätzlich im Ordner /config die Datei „event_listeners.php“ - der Key des Arrays $options muss identisch dem Wert bei der Prüfung von $strRegexp in /MyClass sein (‚plz‘)
wenn alle Dateien angelegt und mit Quelltext gefüllt sind, kann über die Entwickler-Tools im Contao-Backend im Punkt „Autoload-Creator“ die „autoload.php“ erstellt werden
In den Einstellungen eines Eingabefeldes eines Attributes vom Typ „Text“ sollte anschließend bei der Auswahl der RegEx-Prüfung der Eintrag „PLZ“ zur Verfügung stehen. Sollte das nicht der Fall sein, ggf. alle Caches im Backend löschen und die Dateien kontrollieren.
Quelltexte
In den Dateien gefindet sich der folgende Quelltext:
Datei /system/modules/metamodels_mycustoms/classes/MyClass.php
1<?php
2class MyClass
3{
4 public function myAddCustomRegexp($strRegexp, $varValue, Widget $objWidget)
5 {
6 if ($strRegexp == 'plz')
7 {
8 if (!preg_match('/^[0-9]{4,6}$/', $varValue))
9 {
10 $objWidget->addError('Feld ' . $objWidget->label . ' sollte eine gültige PLZ enthalten.');
11 }
12
13 return true;
14 }
15
16 return false;
17 }
18}
Datei /system/modules/metamodels_mycustoms/config/config.php
1<?php
2$GLOBALS['TL_HOOKS']['addCustomRegexp'][] = array('MyClass', 'myAddCustomRegexp');
Datei /system/modules/metamodels_mycustoms/config/event_listeners.php
1<?php
2use ContaoCommunityAlliance\DcGeneral\Contao\View\Contao2BackendView\Event\GetPropertyOptionsEvent;
3
4// Event-Listener mit Priorität "-1"
5return array
6(
7 GetPropertyOptionsEvent::NAME => array(
8 array(
9 function (GetPropertyOptionsEvent $event) {
10 if (($event->getEnvironment()->getDataDefinition()->getName() !== 'tl_metamodel_dcasetting')
11 || ($event->getPropertyName() !== 'rgxp')) {
12 return;
13 }
14
15 $options = $event->getOptions();
16
17 // Key "plz" gleich $strRegexp-Prüfung aus myAddCustomRegexp
18 $options['plz'] = 'PLZ';
19
20 $event->setOptions($options);
21 },
22 -1
23 )
24 )
25);
Die autoload.php in /system/modules/metamodels_mycustoms/config sollte nach der Erzeugung wie folgt sehen
1<?php
2ClassLoader::addClasses(array
3(
4 // Classes
5 'MyClass' => 'system/modules/metamodels_mycustoms/classes/MyClass.php',
6));
Hinweis: die RegEx-Prüfung wurde aus dem Contao-Handbuch übernommen und stellt für deutsche Postleitzahlen nur eine sehr einfache Überprüfung dar. Im Internet findet man genauere RegEx-Überprüfungen oder man könnte hier auch eine Prüfung gegen eine Liste mit in Deutschland vergebenen PLZ einbinden.