Dependencies auf UiItemList-Felder fehlerhaft

  • Affected Version
    WoltLab Suite 5.4
    PHP
    UserFormField::create('userID')
        ->label('')
        ->nullable(),
    AddressSelectionFormField::create('addressID')
        ->label('')
        ->addDependency(
            NonEmptyFormFieldDependency::create('userID')
                ->fieldId('userID')
        )
        ->required(),


    Ist das Feld (initial) leer, funktioniert die Abhängigkeit korrekt:



    Während dem Tippen funktioniert die Abhängigkeit korrekt.


    Nach der Auswahl eines Items, ist das Resultat zwar der Logik nach richtig, aber faktisch ist das Feld leer:


    Entferne ich das Item nun wieder, bleibt das abhängige Feld angezeigt:


    Der Bug dahinter ist, dass das Feld nicht mit den entsprechenden Werten gesynct wird, sondern nach der Auswahl des items wieder leer ist. Würde hier wie eigentlich erforderlich DependencyManager.checkDependencies() ausgeführt, würde das abhängige Feld direkt wieder verschwinden.

    Die korrekte Lösung wäre ein eigenes Input-Element zu erstellen, das die aktuelle Benutzer-Eingabe handelt und im eigentlichen Input-Element stets alle (ausgewählten) Elemente vorzuhalten. Wird der Abhängigkeitscheck dann getriggert - durch welches Element auch immer - verschwinden nicht fälschlicherweise Teile des Formulars.

    • Official Post

    Hallo,


    ich habe jetzt einmal einen genaueren Blick darauf geworfen: Ich würde dir empfehlen, dass du für den Einsatz im Shop vorerst eine eigene Dependency-Klasse mit der passenden Logik erstellst.


    Möglicherweise wird das am Ende auch die offizielle Empfehlung, denn spätestens mit der ValueFormFieldDependency wird das Verhalten auch auf PHP-Seite äußerst merkwürdig: Die Dependency verwendet den Rückgabewert von ->getValue() und der ist bei dem UserFormField der Username und nicht die UserID wie man intuitiv vermuten würde.


    Felder mit komplexerem Verhalten lassen sich manchmal nur äußerst generisch behandeln – ist einfach so. Im WebAuthn-Paket haben wir beispielsweise ein AuthenticationFormField, das ist der Knopf zur Kommunikation mit dem Security Key bei der Authentifizierung über WebAuthn. Da fallen die Dependencies sofort um, weil das Element mit der Feld-ID im HTML ein <div> und kein <input> ist. Empty bzw. NonEmpty wäre aber zumindest umgangssprachlich wohldefiniert.


    Erstelle im Shop einfach eine UserNotEmptyDependency in irgendeinem passenden Namespace (shop\system\form\dependency). Die PHP-Implementierung kannst du einfach aus EmptyFormFieldDependency kopieren und den templateName anpassen.


    Die JavaScript/TypeScript-Implementierung kann in checkDependency dann ganz simpel spezifisch auf das UserFormField zugeschnitten werden. Kopier das TypeScript aber nicht: Du willst export default … statt export = … und das enableLegacyInheritance kann entfallen.

  • Die Dependency verwendet den Rückgabewert von ->getValue() und der ist bei dem UserFormField der Username und nicht die UserID wie man intuitiv vermuten würde.

    Das ist meine ich nicht ganz korrekt. Es wird (von ItemList) ein Objekt mit den Properties objectId, type und value ausgegeben:


    Dann werde ich das im Shop selbst bauen. :)

Participate now!

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