Zum Inhalt springen

Repository->update($object) in DB speichern

Erstellt am 24. Oktober 2011 · 5 Antworten · letzte Antwort am 25. November 2011

Tags: Frage

final6 ·

Hallo Zusammen,

ich versuche mich gerade an meiner ersten Extension mit Extbase und komme einfach nicht weiter. Ich bin mir nicht ganz sicher, ob ich das Repository-Konzept ganz richtig verstanden habe und hoffe, mir kann jemand auf die Sprünge helfen 😉
Um folgendes gehts: einem Film sollen Beteiligte($person) sowie deren Funktion($role) zugeordnet werden. Das löse ich über eine Zwischentabelle personRole mit 1:1-Relationen.
Das Anlegen und Speichern ist auch kein Problem. Wenn ich allerdings bestehende Datenbankeinträge bearbeiten will, werden zunächst auch die geänderten Werte aus dem Formular scheinbar richtig ins entsprechende Repository geschrieben
(var_dump($personRoleRepository) in der updateAction()), unter private '_cleanProperties' steht auch der gespeicherte Wert.
Das Formular wird also richtig ausgelesen und gemappt.

Beim Persistieren des Repositorys (redirect oder PersistenceManager->persistAll()), werden die geänderten Daten aber nicht in die Datenbank übernommen :o

Das Model PersonRole :

/**
	 * personId
	 *
	 * @var Tx_HtwkIptv_Domain_Model_Person
	 * @validate NotEmpty
	 */
	protected $personId;

roleId und clipId entsprechend..

TCA:

'person_id' => array(
			'exclude' => 0,
			'label' => 'LLL:EXT:htwk_iptv1/Resources/Private/Language/locallang_db.xml:tx_htwkiptv_domain_model_personrole.person_id',
			'config' => array(
				'type' => 'inline',
				'foreign_table' => 'tx_htwkiptv_domain_model_person',
				'minitems' => 0,
				'maxitems' => 1,
				'appearance' => array(
					'collapse' => 0,
					'levelLinksPosition' => 'top',
					'showSynchronizationLink' => 1,
					'showPossibleLocalizationRecords' => 1,
					'showAllLocalizationLink' => 1
				),
			),

und im Controller:

public function initializeAction() {

        $this->personRepository = t3lib_div::makeInstance('Tx_HtwkIptv_Domain_Repository_PersonRepository');
	
	$this->personRoleRepository = t3lib_div::makeInstance('Tx_HtwkIptv_Domain_Repository_PersonRoleRepository');
	$this->roleRepository = t3lib_div::makeInstance('Tx_HtwkIptv_Domain_Repository_RoleRepository');
}

public function updateAction(Tx_HtwkIptv_Domain_Model_PersonRole personRole = NULL) {
		if($personRole){
			$this->personRoleRepository->update($personRole);
		}
	$this->redirect('new', NULL, NULL, Array('clip'=>$clip));
	}

statt des redirects hab ich's auch schon mit

Tx_Extbase_Dispatcher::getPersistenceManager()->persistAll();

versucht, die neuen Werte erscheinen dann auch unter private '_cleanProperties'....
heißt das, das Repository-Object speichert den Wert und der Fehler liegt beim Auflösen des Objects in die Datenbank ??
Oder liegt der Fehler im Model oder der TCA und ich habe da was Grundlegendes nicht richtig kapiert??
Bin für jeden Hinweis dankbar !

Gruß f6

final6 ·

Nein, nur ein Plugin. Alle Formulare etc. sollen übers FE bedient werden.

Die Probleme beim Update treten auch NUR bei Fremdschlüsseln auf, alle normalen Properties werden ordnungsgemäß gespeichert.Hat niemand eine Idee?
Oder kann mir jemand einen Tipp geben, wie er/sie updates in Verknüfungstabellen umsetzt ?

Gruß F6

BFSven ·

Dann nur mal für mich zum Verständnis: Das TCA ist für eine FE-Ext doch gar nicht notwendig, oder?
Ich hatte nämlich auch Probleme mit dem Persistieren von Objekten als ich eine Extension selbst erstellt habe. Nachdem ich sie spaßeshalber nochmal mit dem Extension Builder erstellt habe, lief alles problemlos. Dieser hat aber gleich alles (also auch TCA) erstellt und meiner Meinung nach konnte es daran nicht liegen, weil die an sich ja nicht benutzt wird. Vielleicht hilft Dir das Erstellen mit dem Extension Builder weiter, wenn Du diesen Code mit Deinem vergleichst.
Ich hab bei mir leider auch nicht rausgefunden, warum das nicht geklappt hatte. Wenn Du es bei Dir rausfindest, wäre es nett wenn Du die Lösung posten könntest.
Gruß Sven

final6 ·

Mit dem Extension Builder hab ich schon rumgespielt und alle Einstellungen übernommen, ohne Ergebnis.
Bezüglich TCA hatte ich das so verstanden, dass die TCA zum Mappen der Objekte und Tabellen auch bei FE- Actions genutzt wird, aber das gehört in die Grauzone, die ich wahrscheinlich falsch verstanden habe.
Was auf jeden Fall funktioniert, ist das Update übers Back-End...das spricht dafür, das die TCA ok ist und der Fehler woanders liegt. Nur WO ???
#angry#

final6 ·

oh mann, jetzt läuft es. Und zwar weil ich im Model bei der betreffenden property '@lazy' eingetragen habe :o
Wenn mir jetzt noch jemand erklären kann, warum was lazyloading mit dem update zu tun hat, wäre ich überglücklich !