[Frage] Zugriff auf originales Objekt beim Bearbeiten (nicht mit den modified-Werten)

  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    15. 04. 2014, 10:34

    Hallo, ich bräuchte mal wieder eure Hilfe :-)

    Ich habe ein komplexes Objekt (erbt von den fe_users), welches ich in einem Formular bearbeiten und anschließend speichern möchte. Nun bin ich auf ein "Problem" gestoßen - zumindest stellt es für mich eines dar - für andere ist es evtl. so gewollt...:

    Wenn ich das Formular absende, wird mir das modifizierte Objekt an die aufzurufende Action übergeben - das ist auch in Ordnung so. Nun benötige ich aber in dieser Action noch das originale (nicht modifizierte) Objekt.
    Grund 1: ich möchte wissen, wie der alte Wert lautete, um die Änderung selbst dokumentieren zu können
    Grund 2: es gibt Felder, die nur geändert werden sollen, wenn bestimmte Bedingungen erfüllt wurden (z.B. gibt es Passwortfelder, die standardmäßig leer sind und im Objekt beim Speichern nur überschrieben werden sollen, wenn das Feld!=leer und das Wiederholungsfeld gefüllt ist)

    Mein Problem ist nun, dass ich keinen Zugriff mehr auf das nicht bearbeitete Objekt erhalte. Wenn ich es mir in der Action aus dem Repository lade (mit findByUid()), erhalte ich hier nur das modifizierte Objekt, wie es auch im Parameter an die Action übergeben wird. Wie also komme ich an das originale Objekt ran?
    Ich habe dazu leider nichts in der Suche gefunden und hoffe, dass ihr mir hier weiter helfen könnt.


  • 1
  • freshman17 freshman1...
    Sternenflotten-Admiral
    0 x
    218 Beiträge
    2 Hilfreiche Beiträge
    18. 04. 2014, 22:38

    Das neue bzw. veränderte Objekt ist ja noch nicht gespeichert wenn es in der Action ankommt, wieso bekommst du dann die neuen Werte aus der DB? Da muß irgendwo ein Aufruf der Repository-Update-Methode erfolgen.

    Wie auch immer, ein Workaround wäre z.B.:
    1. frisches Objekt instanziieren und mit den Werten des Originals füllen

    1. $bar = $this->objectManager->get('Tx_MyExt_Domain_Model_FeUser');
    2. $bar->initialize($buz);
    3. $this->view->assign('bar', $bar);
    4. $this->view->assign('buz', $buz);
    2. die neue Instanz inkl. der "alten" UID als Argument an das Formular binden
    1. <f:form action="foo" name="bar" object="{bar}" arguments="{buz : buz}">
    2. ...
    3. </f:form>
    3. in der Action die beiden Ojbekte, die als Parameter übergeben werden vergleichen
    1. /**
    2.  * @param Tx_MyExt_Domain_Model_FeUser @bar
    3.  * @param Tx_MyExt_Domain_Model_FeUser @buz
    4.  */
    5. public function fooAction ($bar, $buz) {
    6. $bar->compare($buz);
    7. }

    alles ungetestet und wie gesagt, im Normalfall ist das nicht notwendig da Werte im Regelfall nie ohne einen expliziten Aufruf gespeichert werden.

  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    19. 04. 2014, 09:12

    Danke für die Antwort. Ich wünsche erstmal schöne Ostern :-)

    Die Änderung wird ja nich in der Datenbank gespeichert (so lange ich selbst kein update() durchführe, bleibt der Datensatz unverändert).
    Ich habe eher das Gefühl, dass das Objekt wie ein Singleton verarbeitet wird - sprich: das Objekt wird durch das Formular erstellt mit den modifizierten Werten und wenn ich das Objekt mit der selben uid nochmal über das Repository ermittel, wird es nicht aus der Datenbank gelesen, sondern es wird mir das Objekte zurück gegeben, was bereits existiert.
    Ich kann aber leider erst nächste Woche prüfen, ob es sich wirklich so verhält. Aber wenn es intern in Extbase so abläuft, würde es die Sache zumindest erklären. Ich weiß ja nicht, ob Extbase die Objekte als Singleton verwaltet, damit zur Laufzeit ein Objekt nur einmal existiert.

    Sollte es so sein, bleibt mir wohl nichts anderes übrig, als das originale Objekt entweder vorher in die Session zu nehmen oder - wie du es vorschlägst - mit ins Formular.

  • freshman17 freshman1...
    Sternenflotten-Admiral
    0 x
    218 Beiträge
    2 Hilfreiche Beiträge
    19. 04. 2014, 23:05

    Danke, auch dir frohe Ostern!

    Das wäre denkbar und ist sogar sehr wahrscheinlich das intern gecached wird. Würde an deiner Stelle einen Blick in die zugehörigen Klassen machen evtl. ist dieses Verhalten abschaltbar.

    Ein Versuch wäre noch die Abfrage durch die $query->statement, ist zwar nicht empfohlen aber manchmal sehr hilfreich.

    1. public function findRaw(){
    2. $query = $this->createQuery();
    3. $query->getQuerySettings()->setReturnRawQueryResult(TRUE);
    4. $query->statement('SELECT * FROM tx_myext_domain_model_feuser');
    5. return $query->execute();
    6. }

    Edit: schon mal mit clone versucht?

  • 1