Contao-Camp 2024
Ergebnis 1 bis 16 von 16

Thema: addCustomRegexp Verständnisproblem

  1. #1
    Contao-Nutzer
    Registriert seit
    17.01.2020.
    Beiträge
    111

    Standard addCustomRegexp Verständnisproblem

    Hi,

    ich möchte mir gerne eine eigene Validierung für ein eigenes Formularfeld zusammenstellen, aber ich habe noch Verständnisprobleme und eine Fehlermeldung. Ich habe für das eigene Formularfeld ein zusätzliches Modul angelegt im Ordner system/modules mit den Unterordnern dca und languages/de. Im dca Ordner habe ich dann die Datei tl_member angelegt und dort mein Formularfeld mit der Angabe meiner eigenen Validierung "codeRgxp" unter Eval registriert. Im language Ordner habe ich dann ebenso eine tl_member.php angelegt und dort die den jeweiligen String hinterlegt, funktioniert auch alles soweit mit der Anzeige.

    Für die eigene Validierung habe ich unter system/modules einen config Ordner mit der Datei config.php angelegt, die den Inhalt
    PHP-Code:
    $GLOBALS['TL_HOOKS']['addCustomRegexp'][] = array('CodeRgxp''regexpHook'); 
    besitzt. Im Ordner dca habe ich nun die Datei codeRgxp.php mit
    PHP-Code:
    class codeRgxp extends Backend {
        public function 
    regexpHook($strRegexp$varValueWidget $objWidget) {
            if(
    $strRegExp == 'code') {
                if(
    $varValue != "00000") {
                    
    $objWidget->addError("Der eingegebene Code ist ungültig!");
                }

                return;
            }
        }

    angelegt.

    Ist das soweit in Ordnung oder gibt es da einfachere bzw. gängigere Vorgehensweisen, weil ich gerade bei der Erstellung der Dateien keine Klarheiten gefunden habe, wo diese angelegt werden sollen? Wenn ich nun mein Formularfeld befülle und abschicke, dann erhalte ich die Fehlermeldung:
    Code:
    app.CRITICAL: An exception occurred. {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\ClassNotFoundException(code: 0): Attempted to load class \"CodeRgxp\" from the global namespace.\nDid you forget a \"use\" statement? at C:\\xampp\\htdocs\\workspace\\mindup\\vendor\\contao\\core-bundle\\src\\Resources\\contao\\library\\Contao\\System.php:170)"} []
    Es wird sicherlich nur ein Problem mit der Registrierung der Klasse sein, aber wo genau ich dieses nun umsetzen soll, sofern dies das Problem ist, ist mir auch rätselhaft. Danke für die Hilfe!

  2. #2
    Contao-Nutzer
    Registriert seit
    17.01.2020.
    Beiträge
    111

    Standard

    Hat keiner einen richtungsweisenden Rat?

  3. #3
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.803
    Partner-ID
    10107

    Standard

    Bei der Registrierung des Hooks hast du CodeRgxp geschrieben. Deine Klasse heißt aber codeRgxp. Allerdings solltest du Klassen mit Großbuchstaben anfangen lassen. Siehe auch https://www.php-fig.org/psr/psr-1/

  4. #4
    Contao-Nutzer
    Registriert seit
    17.01.2020.
    Beiträge
    111

    Standard

    Danke für den Hinweis, leider taucht die Fehlermeldung immer noch auf

  5. #5
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.803
    Partner-ID
    10107

    Standard

    Du hast sehr wenig Informationen & Code gepostet. Du solltest dich auch an die gängigen Namespace Konventionen halten.

  6. #6
    Contao-Nutzer
    Registriert seit
    17.01.2020.
    Beiträge
    111

    Standard

    Was benötigst du denn noch für Informationen bzw. Code? Außer den obigen Code habe ich nichts geändert oder hinzugefügt, um mir eben eine eigene Validierung zu erstellen. Meine Vorgehensweise mit Anlegen der Ordnerstruktur etc. habe ich auch geschildert, so dass mir nix einfällt, was ich dem noch hinzufügen könnte.

    Rein aus Testzwecken habe ich die Klasse in "Test" und die Datei in test.php umbenannt und im Hook von "CodeRgxp" zu "Test" geändert, auch da erscheint die gleiche Fehlermeldung, sollte somit ja nicht an der Benennung der Klasse liegen oder?

  7. #7
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.803
    Partner-ID
    10107

    Standard

    Machst du das Ganze für eine wiederverwendbare Extension oder nur für eine einzelne Contao Installation?

  8. #8
    Contao-Nutzer
    Registriert seit
    17.01.2020.
    Beiträge
    111

    Standard

    Das ist nur für meine jetzige Contao Installation, in der ich lediglich ein zusätzliches Feld bei der Registrierung darstellen lasse und dieses eigens validieren möchte.

  9. #9

  10. #10
    Contao-Nutzer
    Registriert seit
    17.01.2020.
    Beiträge
    111

    Standard

    Okay, dann werde ich mich erstmal durch die Dokumentation arbeiten und gegebenenfalls wieder melden, falls Fragen aufkommen. Vielen Dank!

  11. #11
    Contao-Nutzer
    Registriert seit
    17.01.2020.
    Beiträge
    111

    Standard

    Habe mir deine Links durchgelesen. Ich sollte erwähnen, dass ich Contao 4.4 benutze und in meinem Vorgehen eventuell etwas Versionsabhängiges übersehen habe, da die Doku ja auch für höhere Versionen gedacht ist.

    Die folgende Fehlermeldung erhalte ich nun
    Code:
    app.CRITICAL: An exception occurred. {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\ClassNotFoundException(code: 0): Attempted to load class \"AddCustomRegexpListener::class\" from namespace \"App\\EventListener\".\nDid you forget a \"use\" statement for another namespace? at C:\\xampp\\htdocs\\workspace\\mindup\\vendor\\contao\\core-bundle\\src\\Resources\\contao\\library\\Contao\\System.php:170)"} []
    Meine Vorgehensweise:

    - Ich habe die Ordner src, app/Resources/contao, app/Resources/contao/dca, app/Resources/contao/languages, app/Resources/contao/config und app/config angelegt, da sie in meiner installierten Version nicht vorhanden waren (siehe https://docs.contao.org/dev/getting-...g-development/)

    - danach habe ich die parameters.yml nach app/config geschoben (siehe https://docs.contao.org/dev/getting-...g-development/)

    - Erstellung der tl_member.php in app/Resources/contao/dca
    PHP-Code:
    use Contao\CoreBundle\DataContainer\PaletteManipulator;

    $GLOBALS['TL_DCA']['tl_member']['fields']['code'] = array
    (
        
    'label'     => &$GLOBALS['TL_LANG']['tl_member']['code'],
        
    'exclude'   => true,
        
    'inputType' => 'text',
        
    'eval'      => array(
            
    'mandatory' => true,
            
    'rgxp'      => 'code',
            
    'minlength' => 5,
            
    'maxlength' => 5,
            
    'feGroup'   => 'login',
            
    'feEditable'=> true,
            
    'feViewable'=> false
        
    ),
        
    'sql'       => "varchar(5) NOT NULL default ''"
    );

    PaletteManipulator::create()->addField('code''username');
    PaletteManipulator::create()->applyToPalette('default''tl_member'); 
    - Erstellung der tl_member.php in app/Resources/contao/languages/de
    PHP-Code:
    $GLOBALS['TL_LANG']['tl_member']['code'] = array
    (
        
    'Code',
        
    'Bitte geben Sie den 5-stelligen Code ein.'
    ); 
    - dann habe ich den folgenden Code in der composer.json hinzugefügt (siehe https://docs.contao.org/dev/getting-...g-development/)
    PHP-Code:
    "autoload": {
            
    "psr-4": {
                
    "App\\""src/"
            
    }
        } 
    - Erstellung der config.php in app/Resources/contao/config
    PHP-Code:
    $GLOBALS['TL_HOOKS']['addCustomRegexp'][] = array('App\EventListener\AddCustomRegexpListener::class''onAddCustomRegexp'); 
    - und als letztes die Erstellung der AddCustomRegexpListener.php in src/EventListener
    PHP-Code:
    namespace App\EventListener;

    use 
    Contao\Widget;

    class 
    AddCustomRegexpListener
    {
        
    /**
         * @Hook("addCustomRegexp")
         */
        
    public function onAddCustomRegexp(string $regexp$inputWidget $widget): bool
        
    {
            if (
    $regexp === 'code') {
                if(
    $input!= "00000"$objWidget->addError("Der eingegebene Code ist ungültig!");

                return 
    true;
            }

            return 
    false;
        }

    Edit:
    Bin auf folgenden Forumpost gestoßen https://community.contao.org/de/show...-use-statement
    Im letzten Beitrag geht es genau um mein Problem. Die Lösung mit der autoload.php habe ich ja mit der Variante über den Code im composer.json gelöst oder?
    Geändert von asfga (20.02.2020 um 14:32 Uhr)

  12. #12
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.803
    Partner-ID
    10107

    Standard

    Du hast
    PHP-Code:
    $GLOBALS['TL_HOOKS']['addCustomRegexp'][] = array('App\EventListener\AddCustomRegexpListener::class''onAddCustomRegexp'); 
    geschrieben. Korrekt ist entweder
    PHP-Code:
    $GLOBALS['TL_HOOKS']['addCustomRegexp'][] = [\App\EventListener\AddCustomRegexpListener::class, 'onAddCustomRegexp']; 
    so wie in der Doku beschrieben, oder
    PHP-Code:
    $GLOBALS['TL_HOOKS']['addCustomRegexp'][] = ['App\EventListener\AddCustomRegexpListener''onAddCustomRegexp']; 
    (nicht empfohlen)

  13. #13
    Contao-Nutzer
    Registriert seit
    17.01.2020.
    Beiträge
    111

    Standard

    Danke für die Hinweis, glatt übersehen, aber ändert leider nichts an der Fehlermeldung.

    Was jetzt noch hinzugekommen ist, ist dass dieser Codeteil

    PHP-Code:
    namespace App\EventListener;

    use 
    Contao\Widget;

    class 
    AddCustomRegexpListener
    {
        
    /**
         * @Hook("addCustomRegexp")
         */
        
    public function onAddCustomRegexp(string $regexp$inputWidget $widget): bool
        
    {
            if (
    $regexp === 'code') {
                if(
    $input!= "00000"$objWidget->addError("Der eingegebene Code ist ungültig!");

                return 
    true;
            }

            return 
    false;
        }

    mir doppelt als plain text auf der Fehlerseite ausgegeben wird, bevor sich die Fehlerseite aufbaut..

  14. #14
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.803
    Partner-ID
    10107

    Standard

    Ist das wirklich der gesamte Quelltext der Datei? Wenn ja, dann hast du <?php vergessen.

  15. #15
    Contao-Nutzer
    Registriert seit
    17.01.2020.
    Beiträge
    111

    Standard

    Oh man, das war es...musste noch einen Variablennamen ändern und jetzt funktioniert es

    Vielen herzlichen Dank!

  16. #16
    Contao-Nutzer
    Registriert seit
    17.01.2020.
    Beiträge
    111

    Standard

    Kommando zurück...es erscheint jetzt keine Fehlermeldungsseite mehr, sondern das Formular erscheint blank wieder, wobei eigentlich Fehlermeldungen unter den Inputfeldern sein müssten.

    Edit: Hat sich erledigt, nochmal Danke Spooky!
    Geändert von asfga (21.02.2020 um 14:21 Uhr)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •