Zum Inhalt springen

Problem mit PersistenceManager

Erstellt am 18. August 2014 · 13 Antworten · letzte Antwort am 19. August 2014

Tags: Frage

sixx24 ·

Also meine editAction sieht so aus: (hab schon einges unwichtige rausgeworfen)

public function editAction() {
	$box = NULL;
		
	if ($this->request->hasArgument('box')) {
		$uid = $this->request->getArgument('box');
		if (is_array($uid)) {
			$uidFromArray = $uid['__identity'];
			$uid = $uidFromArray;
		}
		$box = $this->boxRepository->getBox($uid);
		
	} else {
		$this->redirect('managerView');
	}
	
	if ($this->request->hasArgument('save-form')) {
		$this->boxRepository->update($box);
		$this->persistenceManager->persistAll();		
		$this->redirect('managerView');
	}

	$this->boxRepository->storeBoxToSession($box, $box->getUid());

	$this->view->assignMultiple(array(
		'box' => $box,
		'defaultLanguages' => $defaultLanguages,
		'links' => $this->explodeLinks($box),
		'errors' => $this->errors,
		'maxFileSize' => $this->settings['imageConf']['maxSize'],
		'settings' => $this->settings
	));
}
denyo256 ·

Kommen den die Argumente 'box' und 'save-form' in einem Formular zur gleichen Zeit vor? Ansonsten ist nämlich beim update wirklich kein Objekt vom Typ Box vorhanden

sixx24 ·

Ja ich komme erst in die

if ($this->request->hasArgument('box')) {

Bedingung und danach in die

if ($this->request->hasArgument('save-form')) {

Ich kann mir ja sogar die $box ausgeben. Auch direkt bevor die Exception kommt.

Und wenn ich mir kurz vor der Exception die persistenceSession ausgeben lasse ist mein Objekt nicht drin. Drücke ich F5 lade die Seite der Excpetion also neu ist das Objekt drin und er speichert.

sixx24 ·

Das boxRepository erzeuge ich so:

	/**
	 * boxRepository
	 *
	 * @var \VENDORXYZ\EXTENSIONXYZ\Domain\Repository\BoxRepository
	 * @inject
	 */
	protected $boxRepository;

Muss ich das Domain\Model\Box auch noch irgendwie dem PersistenceManager bekannt machen?

sixx24 ·

Also es muss irgendwie an der Form und dem abschicken liegen. Denn ich habe auch noch eine Action um eine Box zu deaktivieren/aktivieren. Die sieht so aus:

	/**
	 * activates an box for public
	 *
	 * @return void
	 */
	public function activateBoxAction() {

		$box = NULL;
		if ($this->request->hasArgument('box')) {
			$uid = $this->request->getArgument('box');
			if (is_array($uid)) {
				$uidFromArray = $uid['__identity'];
				$uid = $uidFromArray;
			}
			$box = $this->boxRepository->getBox($uid);
		} else {
			$this->redirect('managerView');
		}

			// check permission
		if ($box->getFrontendUserUid() != $this->frontendUser->getUid()) {
			$this->forward('noAccess');
		}

		$box->setHidden(FALSE);
		$box->setCrdate(new \DateTime());
		$this->boxRepository->update($box);				
		$this->persistenceManager->persistAll();
		$this->redirect('managerView');
	}

Und das funktioniert - ohne Exception. 🙁

denyo256 ·

Eventuell hilft eine Verschachtelung der Bedingungen?

public function editAction() {
	$box = NULL;
 
	if ($this->request->hasArgument('box')) {
		$uid = $this->request->getArgument('box');
		if (is_array($uid)) {
			$uidFromArray = $uid['__identity'];
			$uid = $uidFromArray;
		}
		$box = $this->boxRepository->getBox($uid);
 
	        if ($this->request->hasArgument('save-form')) {
		        $this->boxRepository->update($box);
		        $this->persistenceManager->persistAll();		
		        $this->redirect('managerView');
	        }

	} else {
		$this->redirect('managerView');
	}
 
 
	$this->boxRepository->storeBoxToSession($box, $box->getUid());
 
	$this->view->assignMultiple(array(
		'box' => $box,
		'defaultLanguages' => $defaultLanguages,
		'links' => $this->explodeLinks($box),
		'errors' => $this->errors,
		'maxFileSize' => $this->settings['imageConf']['maxSize'],
		'settings' => $this->settings
	));
}

Dazu hat sich der Aufruf von persistAll() in 6.2 geändert, das sollte jetzt so passieren:

$this->objectManager->get('TYPO3\CMS\Extbase\Persistence\PersistenceManagerInterface')->persistAll();

Mit deinem redirect dürfte das aber keinen Unterschied machen.

sixx24 ·

Die Verschachtelung macht leider keinen Unterschied. 🙁

Das peristAll() kommt von dem hier:

	/**
	 * persistence manager
	 *
	 * @var \TYPO3\CMS\Extbase\Persistence\PersistenceManagerInterface
	 * @inject
	 */
	protected $persistenceManager;

das sollte doch 6.2 sein oder?

sixx24 ·

Und nochwas: wenn ich einfach folgendes aufrufe wenn ich das erste mal in die EditView komme

$box->setTitle('debug');
$this->boxRepository->update($box);
$this->persistenceManager->persistAll();

Wird das Object upgedatet. Das Object scheint irgendwie verloren zu gehen wenn ich den submit Button meiner EditForm betätige...

sixx24 ·

hmm sehr sehr seltsam. Das funktioniert auch nicht bei jedemmal. Ich werd noch verrückt...

Bei jedem 2ten mal klappts. Beim 1sten Aufruf -> Exception. Weiterer aufruf Object wird gespeichert.

sixx24 ·

HA!
Also ich weiß jetzt das es an folgender Zeile in meiner editAction liegt:

$this->boxRepository->storeBoxToSession($box, $box->getUid());

Wenn ich die auskommentiere funktioniert es wunderbar. Anscheinend wird das Object aus der persistenceSession geworfen wenn ich es in eine User Session schreibe. Wieso auch immer. Da muss ich noch weiter forschen!

denyo256 ·

Wie lässt du dir denn die persistenceSession ausgeben? Ich habe ein ähnliches Problem mit leeren Einträgen in der Datenbank.

sixx24 ·

Ich gebe mir in dieser Klasse:
/typo3/sysext/extbase/Classes/Persistence/Generic/PersistenceManager.php

mit

\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($this->persistenceSession);

die Session aus. Aktuell habe ich das in der Funktion isNewObject gemacht.