[Frage] Problem mit PersistenceManager

  • sixx24 sixx24
    T3PO
    0 x
    24 Beiträge
    0 Hilfreiche Beiträge
    18. 08. 2014, 13:50

    Hallo zusammen,

    ich habe mich drangemacht eine alte 4.5 Extension auf 6.2 upzudaten. Soweit so gut. Es handelt sich um eine Extension in der man im FE bestimmte Datensätze anlegen und verändern kann.
    Ich bin allerdings noch kein Typo3 Extbase Experte...

    Problem ist nun das ich beim abspeichern eines Datensatzes im FE (editAction update auf das repository) folgende Exception bekomme:
    [b]"The object of type "VENDORXYZ\EXTNAMEXYZ\Domain\Model\Box" given to update must be persisted already, but is new"[/b]

    Im PersistenceManager gebe ich mir mal die persistenceSession aus - und dort fehlt mein Model
    Wenn ich diese Seite allerdings mit F5 refreshe geht er ohne Exception weiter und hat meine Box gespeichert.

    Irgendein Anhaltspunkt wo ich mit der Suche anfangen soll. Was ich wo vergessen haben könnte? :)

    Vielen Dank


  • denyo256 denyo256
    Padawan
    0 x
    32 Beiträge
    0 Hilfreiche Beiträge
    18. 08. 2014, 17:36

    Wie sieht denn deine entsprechende Action aus?

  • sixx24 sixx24
    T3PO
    0 x
    24 Beiträge
    0 Hilfreiche Beiträge
    18. 08. 2014, 18:14

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

    1. public function editAction() {
    2. $box = NULL;
    3.  
    4. if ($this->request->hasArgument('box')) {
    5. $uid = $this->request->getArgument('box');
    6. if (is_array($uid)) {
    7. $uidFromArray = $uid['__identity'];
    8. $uid = $uidFromArray;
    9. }
    10. $box = $this->boxRepository->getBox($uid);
    11.  
    12. } else {
    13. $this->redirect('managerView');
    14. }
    15.  
    16. if ($this->request->hasArgument('save-form')) {
    17. $this->boxRepository->update($box);
    18. $this->persistenceManager->persistAll();
    19. $this->redirect('managerView');
    20. }
    21.  
    22. $this->boxRepository->storeBoxToSession($box, $box->getUid());
    23.  
    24. $this->view->assignMultiple(array(
    25. 'box' => $box,
    26. 'defaultLanguages' => $defaultLanguages,
    27. 'links' => $this->explodeLinks($box),
    28. 'errors' => $this->errors,
    29. 'maxFileSize' => $this->settings['imageConf']['maxSize'],
    30. 'settings' => $this->settings
    31. ));
    32. }

  • denyo256 denyo256
    Padawan
    0 x
    32 Beiträge
    0 Hilfreiche Beiträge
    18. 08. 2014, 19:14

    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 sixx24
    T3PO
    0 x
    24 Beiträge
    0 Hilfreiche Beiträge
    18. 08. 2014, 19:35

    Ja ich komme erst in die

    1. if ($this->request->hasArgument('box')) {
    Bedingung und danach in die
    1. 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 sixx24
    T3PO
    0 x
    24 Beiträge
    0 Hilfreiche Beiträge
    18. 08. 2014, 19:56

    Das boxRepository erzeuge ich so:

    1. /**
    2. * boxRepository
    3. *
    4. * @var \VENDORXYZ\EXTENSIONXYZ\Domain\Repository\BoxRepository
    5. * @inject
    6. */
    7. protected $boxRepository;

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

  • sixx24 sixx24
    T3PO
    0 x
    24 Beiträge
    0 Hilfreiche Beiträge
    18. 08. 2014, 20:08

    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:

    1. /**
    2. * activates an box for public
    3. *
    4. * @return void
    5. */
    6. public function activateBoxAction() {
    7.  
    8. $box = NULL;
    9. if ($this->request->hasArgument('box')) {
    10. $uid = $this->request->getArgument('box');
    11. if (is_array($uid)) {
    12. $uidFromArray = $uid['__identity'];
    13. $uid = $uidFromArray;
    14. }
    15. $box = $this->boxRepository->getBox($uid);
    16. } else {
    17. $this->redirect('managerView');
    18. }
    19.  
    20. // check permission
    21. if ($box->getFrontendUserUid() != $this->frontendUser->getUid()) {
    22. $this->forward('noAccess');
    23. }
    24.  
    25. $box->setHidden(FALSE);
    26. $box->setCrdate(new \DateTime());
    27. $this->boxRepository->update($box);
    28. $this->persistenceManager->persistAll();
    29. $this->redirect('managerView');
    30. }

    Und das funktioniert - ohne Exception. :(

  • denyo256 denyo256
    Padawan
    0 x
    32 Beiträge
    0 Hilfreiche Beiträge
    18. 08. 2014, 20:44

    Eventuell hilft eine Verschachtelung der Bedingungen?

    1. public function editAction() {
    2. $box = NULL;
    3.  
    4. if ($this->request->hasArgument('box')) {
    5. $uid = $this->request->getArgument('box');
    6. if (is_array($uid)) {
    7. $uidFromArray = $uid['__identity'];
    8. $uid = $uidFromArray;
    9. }
    10. $box = $this->boxRepository->getBox($uid);
    11.  
    12. if ($this->request->hasArgument('save-form')) {
    13. $this->boxRepository->update($box);
    14. $this->persistenceManager->persistAll();
    15. $this->redirect('managerView');
    16. }
    17.  
    18. } else {
    19. $this->redirect('managerView');
    20. }
    21.  
    22.  
    23. $this->boxRepository->storeBoxToSession($box, $box->getUid());
    24.  
    25. $this->view->assignMultiple(array(
    26. 'box' => $box,
    27. 'defaultLanguages' => $defaultLanguages,
    28. 'links' => $this->explodeLinks($box),
    29. 'errors' => $this->errors,
    30. 'maxFileSize' => $this->settings['imageConf']['maxSize'],
    31. 'settings' => $this->settings
    32. ));
    33. }

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

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

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

  • sixx24 sixx24
    T3PO
    0 x
    24 Beiträge
    0 Hilfreiche Beiträge
    18. 08. 2014, 20:55

    Die Verschachtelung macht leider keinen Unterschied. :(

    Das peristAll() kommt von dem hier:

    1. /**
    2. * persistence manager
    3. *
    4. * @var \TYPO3\CMS\Extbase\Persistence\PersistenceManagerInterface
    5. * @inject
    6. */
    7. protected $persistenceManager;
    das sollte doch 6.2 sein oder?

  • sixx24 sixx24
    T3PO
    0 x
    24 Beiträge
    0 Hilfreiche Beiträge
    18. 08. 2014, 21:35

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

    1. $box->setTitle('debug');
    2. $this->boxRepository->update($box);
    3. $this->persistenceManager->persistAll();

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