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

  • 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.

img_own-regex

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.