Zum Inhalt springen

Repository in User Function benützen

Erstellt am 24. Oktober 2014 · 2 Antworten · letzte Antwort am 25. Oktober 2014

Tags: Extbase, Datenbank, TYPO3 6.x, Frage

MichaelF ·

Hallo Freunde

Folgendes möchte ich machen: Wenn jemand sich über direct_mail_subscription anmeldet, möchte ich in seinem tt_address-Record einige Felder ändern (z.B. ein Datum setzen, override genügt nicht).

Folgendes habe ich probiert: ich setze meine eigene User Function bei plugin.feadmin.dmailsubscription.create.userFunc_afterSave.

Das klappt ganz gut so:

class AfterSaveUserFunction {
  public function main($config, $ref) {
    $GLOBALS['TYPO3_DB']->exec_UPDATEquery('tt_address','uid='.intval($config['rec']['uid']), array('city' => 'Rome'));
  }
}

Wenn ich das allerdings über ein Repository zu bewerkstelligen versuche, werden die Änderungen nicht gespeichert.

class AfterSaveUserFunction {
  public function main($config, $ref) {
    
    // get the recipient repository (injecting does not seem to work)
    $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('\TYPO3\CMS\Extbase\Object\ObjectManager');
    $repository = $objectManager->get('\XYZ\MeineExtension\Domain\Repository\RecipientRepository');
    
    // update recipient
    $recipient = $repository->findByUidOnAllPages($config['rec']['uid'], true)->getFirst();
    $recipient->setCity('Rome');
    $repository->update($recipient);
    
    // persist (does not work)
    $persistenceManager = $objectManager->get('\TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager');
    $persistenceManager->persistAll();
  }
}

Ich wäre Euch sehr dankbar, wenn Ihr mir sagen könntet, warum das nicht geht. Oder wie das mit Extbase zu machen ist.

jenses ·

Offtopic: Man kann an deinen beiden Beispielen sehr schön die "Vorteile" von dem so hochgelobten extbase sehen, daß ja angeblich alles so viel einfacher macht ( 7 Anweisungen vs. 1 ) 8-)

MichaelF ·

@jenses Sowas Ähnliches ging mir auch durch den Kopf. Es kann gut auch daran liegen, dass ich es einfach falsch gemacht habe.

Ich habe nun eine Variante gefunden, die funktioniert: Ich habe im Repository diese Methode hinzugefügt:

public function manuallyPersistAll() {
  $this->persistenceManager->persistAll();
}

Diese rufe ich dann auf in AfterSaveUserFunction::main:

$repository->manuallyPersistAll();

Dies ist eine Trial-and-Error-Lösung für ein Problem, das ich nicht verstanden habe. Ist das richtig so?