Hallo alle miteinander!
Nachdem ich nun langsam am Verzweifeln bin und mir die Suchmaschine keine hilfreichen Ergebnisse mehr auswirft, dachte ich mir: ich wende mich an nette Leute, die mit vielleicht helfen können.
Ich bin gerade dabei, mich in die Extension-Entwicklung mit Extbase und Fluid rein zu arbeiten (vorher habe ich immer den "alten" Kickstarter mit seinen pi-Ordnern etc. genutzt). Dazu nutze ich das video2brain "Extbase & Fluid", was einige vielleicht schon kennen. Da ich Typo3 6.2beta1 nutze und die Videos schon etwas älter sind, stimmt die Hälfte schon wieder nicht mehr. Bis jetzt habe ich alles irgendwie hinbekommen, aber nun komme ich nicht weiter.
Ziel ist es, im Frontend-Plugin einer eigenen Extension speichern zu können, ob der angemeldete Benutzer einen Newsletter abonnieren will oder nicht (die Action dafür wird per Link übergeben). Dazu wurde die Tabelle "fe_users" um das Feld "tx_gallery_subscribed" erweitert. Der Fronend-Benutzer muss sich erstmal einloggen und dann erscheint auf der Seite mit dem Plugin ein Link zum an- oder abmelden (je nachdem, wie sein aktueller Status diesbezüglich ist). Das Auslesen des aktuellen Standes im Feld "tx_gallery_subscribed" funktioniert. Nur das Speichern der Änderung funktioniert nicht. Ich erhalte zwar keine Fehlermeldung, aber der Wert, den ich in der Aktion für das Feld setze, wird nicht in der Datenbank gespeichert (im Video2Brain-Video funktioniert das aber wunderbar...).
Hier seht ihr den Auszug aus meiner Extension für das Mapping der Tabelle / Felder in TypoScript-Setup:
plugin.tx_gallery{
persistence{
classes{
TYPO3\Gallery\Domain\Model\FrontendUser{
mapping{
tableName = fe_users
columns{
tx_gallery_subscribed.mapOnProperty = subscribed
}
}
}
}
}
}
Und hier der Auszug für die Aktion in meinem Controller (die Anmelden-Funktion sieht genau so aus, nur mit anderem Name und dem Wert "true" für die subscription):
/**
* action unsubscribe
*
* @param \TYPO3\Gallery\Domain\Model\Gallery $gallery
* @return void
*/
public function unsubscribeAction() {
$feuserId = $GLOBALS['TSFE']->fe_user->user['uid'];
$frontendUser = $this->frontendUserRepository->findByUid($feuserId);
$frontendUser->setSubscribed(0);
$this->redirect('list');
}
Ich weiß nicht genau, ob die Zeile @param \TYPO3\Gallery\Domain\Model\Gallery $gallery hier rein muss oder nicht - wenn ich sie weg lasse, gibt es das selbe Ergebnis. Die Aktionen sind auch in der ext_localconf.php bekannt und ungecached.
Das FrontendUser-Objekt sieht nach dem Setzen mit "setSubscribed(false)" wie folgt aus:
TYPO3\Gallery\Domain\Model\FrontendUser Object
(
[subscribed:protected] => 0
[uid:protected] => 1
[_localizedUid:protected] => 1
[_languageUid:protected] =>
[pid:protected] => 24
[_isClone:TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject:private] =>
[_cleanProperties:TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject:private] => Array
(
[subscribed] => 1
[uid] => 1
[pid] => 24
)
)
Vor dem Setzen ist der Wert [subscribed:protected] = 1. Die Setter-Methode selbst funktioniert also.
Die Funktion "unsubscribeAction()" wird definitiv aufgerufen - das habe ich getestet. Die neuen Werte für den Frontend-User sind auch im Objekt gesetzt nach dem Aufruf der Setter-Methode (siehe letztes Code-Beispiel). Nur die Speicherung erfolgt nicht, obwohl das Skript ohne Fehler durchläuft und die Funktion $this->redirect('list'); aufgerufen wird...
Ich habe versucht, eine TCA-Datei für den FrontendUser anzulegen (hatte ich irgendwo gelesen), aber das hat nichts gebracht.
Ich habe auch schon versucht, die Funktion "persistAll()" vom Persistence-Manager aufzurufen nach dem Setzen, aber auch das blieb erfolglos (auch keine Fehlermeldungen). Davon abgesehen sollte das Speichern ja auch automatisch erfolgen oder habe ich das aus den Videos falsch verstanden? Das Auslesen der Wertes geht - wie gesagt - problemlos. Habt ihr vielleicht eine Idee? Kann es vielleicht daran liegen, dass ich Typo3 6.2beta1 verwende? (Vielleicht ist hier extbase noch fehlerhaft...)
Übrigens: auch wenn ich versuche, einen Wert von einem Objekt aus meiner eigenen Extension zu setzen, wird dieser nicht gespeichert. Es hat also scheinbar auch nichts damit zu tun, dass ich einen Wert in einer Tabelle ändern will, die nicht von meiner Extension kommt.
Was mir auch aufgefallen ist: wenn ich in einer Aktion im Controller folgende Zeile aufrufe:
$galleries = $this->galleryRepository->findAll();
und mir anschließend die Variable $galleries via var_dump oder print_r ausgeben lassen möchte, erhalte ich nach langem Warten nur eine weiße Seite - ebenfalls keine Fehlermeldung (trotz error_reporting(E_ALL) und display_errors on). Kann das damit zusammenhängen oder ist das Objekt so komplex, dass es nicht geschafft wird anzuzeigen?! Die Ausgabe des Objektes im Template funktioniert problemlos.
Ich bin mit meinem Rat am Ende und hoffe, dass ihr mir vielleicht weiter helfen könnt.