Best-Practice für die Abbildung von n:m Beziehungen in ACP forms?

  • Hallo zusammen,

    ich arbeite mich aktuell Stück für Stück durch die Woltlab Welt um ein eigenes Plugin zu bauen. Die Tutorials waren schon super, aber wie es in der Natur der Sache liegt, deckt es nicht alles ab. In meinem Beispiel habe ich einen Hauptdatentypen mit mehreren Subdatentypen, die sich in Beziehung zum Hauptdatentyp verhalten sollen (n:m). Alle Datentypen werden ganz normal im ACP gepflegt, wobei die Relationen im Hauptdatentyp eingepflegt werden. Für 1:n ist das in der Umsetzung denkbar einfach.

    Nutze folgenden Pseudo-Code

    install_foo_bar.php

    Folgenden Code habe ich in meinem ACP Form:

    Das funktioniert für Single-Select auch ganz wunderbar. Allerdings bräuchte ich das ganze mit Multi-Select.

    Dafür wäre jetzt mein nächster Schritt eine N:M Tabelle á la wcf1_foo_to_bar anzulegen. So weit, so simpel.

    Womit ich mich gerade schwerer tue, ist die Umsetzung im Controller. Wenn ich die AbstractFormBuilderForm richtig deute, wird über Naming-Conventions ermittelt in welche Tabelle, default-seitig geschrieben wird. Das muss ich ja irgendwo aushebeln, da ich zumindest eine Teilmenge der Daten in der N:M Tabelle speichern muss.

    Da ich mir gut vorstellen kann, dass das eine mehr als regelmäßige Aufgabe ist, die es bei der Plugin-Entwicklung zu entwickeln gibt und nicht nicht die halbe AbstractFormBuilderForm überlagern will mit irgendwelchem Axt-Code, frage ich daher, ob jemand einen Best-Practice Ansatz empfehlen kann?

    EDIT: PS: Ich hoffe, dass ein paar von euch wiederum meinen Ansatz als Mini-Snippet für eine Single-Select Relation nutzen können.

  • Ich habe überlegt, die save Methode in der AbstractFormBuilderForm zu überschreiben und dort die Daten für die n:m Tabelle abzufangen und gesondert weg zu schreiben.

    Klingt für mich etwas rabiat, im core scheint man aber ähnlich vorzugehen.

  • Wenn ich die AbstractFormBuilderForm richtig deute, wird über Naming-Conventions ermittelt in welche Tabelle, default-seitig geschrieben wird.

    Jain. In der Form-Klasse gibst du die Action-Klasse an. Die Action-Klasse erbt von AbstractDatabaseObjectAction.

    Prinzipiell wird erst mal alles, was du im FormBuilder an Daten erhältst an die Action-Klasse weitergereicht. Alles in $formData['data'] / AbstractDatabaseObjectAction::$parameters['data'] repräsentiert tatsächliche Spalten in der Datenbank. Hier muss man entsprechend ggf. aussortieren oder Daten in der Action-Klasse konvertieren, damit sie speicherbar sind.

    Ein MultipleSelectionFormField schreibt die ausgewählten Daten in $formData['fieldId'] / AbstractDatabaseObjectAction::$parameters['fieldId']. Das heißt du kannst in deiner Action-Klasse (in der Regel vor der Ausführung der geerbten Funktionen / super::xyz()) die Parameter aufbereiten.

    In deinem Fall kannst du beispielsweise so ansetzen:

    Alternativ kannst du über die Form-Klasse die Daten bereits aufbereiten, verarbeiten oder was auch immer damit machen:

    Validation and Data - WoltLab Suite Documentation

    Interessante Lektüre bei Bedarf:

    Database Objects - WoltLab Suite Documentation

    Database Objects - WoltLab Suite Documentation

  • Hat alles wunderbar geklappt. Danke. Was garnicht berücksichtigt wurde ist, wie man das MultipleSelectionFormField mit den Selected-values befüllt dahe für die Nachwelt noch folgende Ergänzung:

    In der createForm in etwa folgendes:

Participate now!

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