*Action korrekt instanzieren

  • Guten Tag,
    nachdem hier mal geschrieben worden ist, dass man die *Editor-Klassen vermeiden soll, da die ohnehin beim Instanzieren der *Action-Klassen aufgerufen werden, versuche ich nun zu verstehen, wie man letztere korrekt Instanziert. Dabei geht es mir darum, dass ich ein Objekt, das bereits in die Datenbank eingetragen ist zu ändern. Also habe ich mir zuerst einmal das Objekt an sich ausgeben lassen und bin dann immer einen Schritt weiter, bis ich letztendlich dort angekommen bin, wo ich hin wollte. So bin ich letztendlich an $eventObj->ovjectAction geblieben, darin möchte ich die returnValues verändern, die ich mit dem Aufruf von $eventObj->objectAction->getReturnValues() auch ausgegeben bekomme.

    Spoiler anzeigen


    Dannach habe ich mir die AbstractDatabaseObjectAction::__construct() angesehen um zu schauen, wie man eine Action-Klasse korrekt Instanziert. Allerdings scheine ich das falsch zu verstehen. Folgendermaßen habe ich versucht, die returnValues zu updaten.

    PHP
    $parameters = $eventObj->objectAction->getReturnValues();
    $data = array(
            'additionalMessage' => $this->additionalMessage,
            'additionalMessageColor' => $this->additionalMessageColor
        );
    
    $warningAction = new InfractionWarningAction(array($parameters['returnValues']), 'update', array($data));
    $warningAction->validateAction();
    $warningAction->executeAction();

    Und dessen Ergebnis

    Spoiler anzeigen

    Jetzt sind zwar alle vorhandenen Daten im var_dump enthalten, allerdings sind die parameter an falscher Stelle. Kann mir jemand helfen zu verstehen, wie man die Action-Klassen korrekt instanziert und welche Daten dafür wichtig und richtig sind?

    Mit freundlichen Grüßen
    Sebastian S.

  • So bin ich letztendlich an $eventObj->ovjectAction geblieben, darin möchte ich die returnValues verändern, die ich mit dem Aufruf von $eventObj->objectAction->getReturnValues() auch ausgegeben bekomme.


    Warum willst du die returnValues verändern? Das macht wenig Sinn.

    Was willst du denn erreichen? Also was ist dein Ziel?

    "A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP" — Leonard Nimoy

    • Offizieller Beitrag

    Das Array muss bei update() die Daten unterhalb des Keys data enthalten, in deinem Code wäre das array('data' => $data). validateAction() ist einzig und allein für die Validierung via AJAX ausgelegt, generell müssen als übergebenen Parameter bereits vollständig und validiert sein, daher ist ein Aufruf via PHP so nicht gewollt. (*)

    (*) Es gibt eine handvoll Methoden die sich ohne den Aufruf von validateAction() gar nicht benutzen lassen (etwa auf Grund von protected-Variablen), der Rest bleibt davon aber unberührt.

  • Ziel ist es, zusätzliche Felder in wcf\acp\form\WarningAddForm verfügbar zu machen. Die zusätzlichen Felder sind leider nur in den returnValues enthalten und ich rufe diesen code schon in der saved-Methode auf.

    Spoiler anzeigen

    @Alexander Ebert, ich sehe das, dass unterhalb des data-keys alles verfügbar ist, was ich benötige, allerdings steht mir das erst nach dem Instanzieren der WarningAction zur Verfügung, was bei mir für rege Verwirrung sorgt. Ich kann schlecht etwas instanzieren mit den Daten die mir nicht zur Verfügung stehen, oder verstehe ich die Logik dahinter falsch?

    Mit freundlichen Grüßen
    Sebastian S.

  • Ziel ist es, zusätzliche Felder in wcf\acp\form\WarningAddForm verfügbar zu machen.


    Dann solltest du die zusätzlichenTelder im Template einbinden (per template-Listener) und per Eventlistener auslesen und ins $data array reinschieben.

    Die zusätzlichen Felder sind leider nur in den returnValues enthalten


    ???

    Alternativ kannst du einfach nach der saved Methode noch einmal update aufrufen, um die Werte nachträglich anzupassen. Besser wäre es allerdings, die Werte von vorne herein zu verändern.

    Wenn du konkreter sagen könntest, was du erreichen willst, wäre dies hilfreich.

    "A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP" — Leonard Nimoy

  • TemplateListener und EventListener sind beide schon vorhanden.

    Ich habe in der WarningAddForm (auch in WarningEditForm) ein Formularfeld (additionalMessage) und einen Colorpicker (additionalMessageColor)
    Nun sollen pro vordefinierter Verwarnung in der Datenbank die vom Administrator angegebenen Daten gespeichert werden, damit diese später nach dem Verwarnen eines Beitrags zur Verfügung stehen - Mit ihnen soll je nach Fall der Beitrag editiert werden - weswegen mir auch wichtig ist zu verstehen, wie man die Action-Klassen korrekt instanziert.

    Ich hatte es eigentlich schon funktionsfähig gehabt, allerdings mit Hilfe der Editor-Klasse und von deren Verwendung wird abgeraten. Ich würde das $data array ja gerne erweitern, aber ich habe im $eventObj (spoiler Beitrag 4) nichts zur Verfügung - Es wird das WarningAdd-Objekt gezeigt, in dem direkt die Parameter für Titel, Punkte, Gültigkeitsdauer und -Typ vorhanden sind.

    Mit freundlichen Grüßen
    Sebastian S.

    • Offizieller Beitrag

    Alles was mit den Editor-Klassen geht, geht auch mit den DatabaseObjectActions, das ist eben der Sinn der Sache. Ignoriere doch einfach mal die zusätzlichen Daten aus den Rückgabewerten, dich interessiert nur das Objekt. Das kannst du selber verwenden um eine neue Instanz der Action zu erzeugen, dort führst du einfach ein update durch.

  • Kann mir jemand bitte eine verpassen? Ich hab mich so auf die returnValues versteift, dass ich vergessen hab, dass ich mir die nur zu Rate gezogen habe, um an die warningID ranzukommen.

    PHP
    $warningObject = $eventObj->objectAction->getReturnValues();
    $warningID = $warningObject['returnValues']->warningID;
    $data = array(
            'additionalMessage' => $this->additionalMessage,
            'additionalMessageColor' => $this->additionalMessageColor
        );
    
    $warningAction = new InfractionWarningAction(array($warningID), 'update', array('data' => $data));
    $warningAction->executeAction();

    Funktioniert jedenfalls. Wie schaut mit richtigkeit/validität aus?

    Mit freundlichen Grüßen
    Sebastian S.

  • Sieht doch in Ordnung aus, wobei du auch $warningObject['returnValues'] anstatt der $warningID übergeben kannst.

    Wie @Netzwerg allerdings schon schrieb, brauchst du keinen weiteren Aufruf der InfractionWarningAction durchführen, da du den Klassen-Member $additionalFields von AbstractForm um die Werte von $this->additionalMessage und $this->additionalMessageColor erweitern kannst.
    Wobei AbstractForm::$additionalFields bei mir im Infraction-Paket aus dem WBB 4.0.1 noch nicht in den Form-Klassen implementiert ist.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!