Eigener Text in UserInputException

  • Z. B. so innerhalb eines Eventlisteners:

    PHP
    public function execute($eventObj, $className, $eventName){
            if !($eventObj->user->getPermission){
                throw new NamedUserException(WCF::getLanguage()->get('wcf.user.profile.noprofileedit'));
            }

    Die aufgerufene Sprachvariable musst Du natürlich mitliefern.


    Gruß norse

    Zugang zu meinen Arbeiten und dem dazugehörigen Support bekommt Ihr bei Interesse hier und hier.

  • Hallo,

    norse NamedUserException macht nicht das gleiche wie die UserInputException. Das sind zwei völlig verschiedene Anwendungsfälle. Die UserInputException wird geworfen, wenn Formularfelder ungültig sind (zum Beispiel leer). Eine NamedUserException dort zu werfen wäre fatal, denn die Formular-Daten wären dann weg. Die Exception wird bspw. geworfen, wenn der Benutzer gesperrt wird (die Seite ist nicht mehr sichtbar, und der Benutzer bekommt nur die rote Meldung, dass er gesperrt wurde).

    Quatschecke Bei einem existierenden Feld, welches nicht dein Plugin beherrscht? Oder bei einem eigenem Feld? Und wenn bei einem existierendem Feld, welches? Welches Formular und welches Feld?

    Grüße

    Josh

  • Und wieder was gelernt, danke Josh. Mir kam nur der grundsätzliche Vorgang so bekannt vor, hätte wohl genauer lesen müssen.


    Gruß norse

    Zugang zu meinen Arbeiten und dem dazugehörigen Support bekommt Ihr bei Interesse hier und hier.

  • Hallo,

    norse NamedUserException macht nicht das gleiche wie die UserInputException. Das sind zwei völlig verschiedene Anwendungsfälle. Die UserInputException wird geworfen, wenn Formularfelder ungültig sind (zum Beispiel leer). Eine NamedUserException dort zu werfen wäre fatal, denn die Formular-Daten wären dann weg. Die Exception wird bspw. geworfen, wenn der Benutzer gesperrt wird (die Seite ist nicht mehr sichtbar, und der Benutzer bekommt nur die rote Meldung, dass er gesperrt wurde).

    Quatschecke Bei einem existierenden Feld, welches nicht dein Plugin beherrscht? Oder bei einem eigenem Feld? Und wenn bei einem existierendem Feld, welches? Welches Formular und welches Feld?

    Grüße

    Josh

    Es geht um folgendes (eigenes Feld vom Plugin):

    PHP
    if (!isset($this->parameters['productID'])) {
                throw new UserInputException('productID');
            }

    Die exception soll allerdings nur ausgelöst werden, wenn die productID 0 ist (ja dabei hapert es auch). Und dann als eigener Text, Bitte wähle ein Produkt aus.

    productID 0 ist (Keine Auswahl)

  • Hallo,

    die Exception hat drei Konstruktor-Parameter (siehe: https://github.com/WoltLab/WCF/bl…n.class.php#L38) , Mit dem ersten Parameter bestimmst du das Feld, wo der Fehler auftritt (bei dir im Feld productID). Mit dem zweiten Parameter bestimmst du den Typ der Exception. Wird dieser nicht ausgefüllt, übergibst du automatisch den Typ empty. Das ganze behandelst du dann ja entsprechend im Template. Dort hast du ja irgendwo sowas stehen (exemplarisch für die speziellen Trophäen, weil ich gerade die Datei dafür offen habe):

    In Zeile 15 prüfst du, ob das aktuelle Feld das „Error-Feld“ ist. Wenn ja, gibst du dort dein innerError aus (also das rote Kästchen mit der Fehlermeldung in Formularen). Dort drin könntest du jetzt eine Fall-Unterscheidung machen aufgrund des $errorType (also der zweite Parameter bei deiner Exception) und entsprechende Sprachvariablen ausgeben oder aber du nutzt den empfohlenen Weg und machst das wie oben und nutzt eine dynamische Sprachvariable. Wenn ich jetzt in einem Plugin bei der Validierung bspw. die UserInputException throw new UserInputException('specialTrophies', 'yada') werfe, sucht das System automatisch die Sprachvariable wcf.user.trophy.specialTrophies.error.yada und gibt diese aus.

    TL;DR: Wie du deinen eigenen Text ausgibst, hängt ganz an deinem Template.

    PS: Um das ganze noch einfacher zu haben, empfehle ich einfach mal den FormBuilder: https://docs.woltlab.com/php_api_form_builder.html Eine super API um einfacher Formulare zu programmieren.

  • Hallo,

    naja, einfach indem du prüfst:

    Code
    if ($this->parameters['productID'] == 0) {
        // throw exception here
    }

    Solltest du entsprechend aber unter dem isset oben prüfen.

    Vermutlich möchtest du aber eher validieren, ob das entsprechende Produkt existiert. Dafür erzeugst du einfach eine Instanz des Produktes (über die DBO-Klasse) und prüfst, ob das Objekt dann eine productID hat.

    Exemplarisch an einem Benutzer (ohne Namespace):

    Code
    $userObject = new User($this->parameters['userID']); 
    if (!$userObject->userID) {
        throw new UserInputException('user', 'invalid'); 
    }

    Grüße

    Josh

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!