[Frage] m:n-Relation funktioniert über Controller nicht, wohl aber über Backend [Gelöst]

  • SabineW SabineW
    T3PO
    0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    04. 09. 2013, 18:12

    Mein Problem möchte ich anhand meiner "Übungs"-Extension schildern, die ich über den Extension Builder aufgebaut habe. (( Endlich mal wieder Cat Content im Web ;) ))

    Mein Model 'Cat' hat zwei Properties 'name' und 'color', wobei 'Color' ein eigenes Model ist. Jede Katze kann mehrere Farben haben. Über den Extension Builder habe ich das als m:n-Relation aufgebaut.

    Im Backend kann ich über einen bestimmten Katzen-Datensatz eine zusätzliche Farbe definieren, die dann als solche in der ..._color-Tabelle abgelegt wird. Außerdem werden die Tabellen ..._cat und ..._cat_color_mm passend aktualisiert. Sehr schön!

    Wenn ich das aber über eine 'createColorAction' aus dem Controller für Cat heraus durchführen will, funktioniert das leider nicht wie gewünscht. Die neue Farbe wird in der ..._color-Tabelle angelegt, aber die Verknüpfung von Katze zu Farbe nicht aktualisiert.

    Im Model Cat gibt es die vom Extension Builder eingerichtete Methode:

    1. /**
    2. * Adds a Color
    3. *
    4. * @param \TYPO3\Swcats\Domain\Model\Color $color
    5. * @return void
    6. */
    7. public function addColor(\TYPO3\Swcats\Domain\Model\Color $color) {
    8. $this->color->attach($color);
    9. }

    Wenn ich mir hier $this nach dem $this->color->attach($color) ausgeben lasse, sehe ich, dass alle Infos für die Properties alt / neu vorhanden sind. Aber die werden geschrieben.

    Hat jemand eine Idee, was hier noch fehlt? Für Hinweise wären wir sehr dankbar,

    Sabine
    - und ihre beiden Katzen ;-) -

  • kitsunet kitsunet
    Flash Gordon
    1 x
    2559 Beiträge
    27 Hilfreiche Beiträge
    05. 09. 2013, 19:53 - Lösung

    Yep, dir fehlt ein

    $this->catRepository->update($cat);

    (kommt vors redirect ziemlich am Ende)

    Sonst weiß Extbase nicht, dass Du deine Änderungen auch speichern willst.

    Das hier:
    $this->catRepository->findByUid($cat->getUid())->addColor($newColor);
    Ist übrigens unnötig kompliziert, du hast ja schon das Cat Objekt, d.h. das hier reicht auch:

    $cat->addColor($newColor);

    Viele Grüße
    Christian

    config.baseURL = http://www.kitsunet.com/
    TYPO3 Flow und Neos Community Contact
    Release Manager TYPO3 Neos 1.1
    Ich habe Probleme mit den PMs hier, also schreibt mir bitte eine Mail oder über Twitter!


  • 1
  • einpraegsam.net einpraegs...
    MacGyver
    0 x
    9340 Beiträge
    80 Hilfreiche Beiträge
    04. 09. 2013, 21:30

    Am besten postest du mal den Inhalt deines Controllers. Vor allem würde mich deine createColorAction() Methode interessieren. Wenn du die Datensätze über ein Formular generieren lässt, wäre auch noch das HTML-Template mit dem Formular interessant (z.B. New.html).

    in2code.de - Wir leben TYPO3
    - Möchtest du TYPO3 komplett verstehen? Eigene Erweiterungen erstellen? Bei uns gibt es auch Schulungen https://www.in2code.de/produkte/typo3-schulungen/
    - Die Arbeit mit TYPO3 macht dir Spaß? Du stehst auf Berge? Komm zu uns! https://www.in2code.de/agentur/karriere/

  • SabineW SabineW
    T3PO
    0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    05. 09. 2013, 07:26

    Danke für Deine Rückmeldung. Hier kommt mein CatController.php:

    1. <?php
    2. namespace TYPO3\Swcats\Controller;
    3.  
    4. /***************************************************************
    5.  * Copyright notice ....
    6.  ***************************************************************/
    7.  
    8. /**
    9.  *
    10.  *
    11.  * @package swcats
    12.  * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later
    13.  *
    14.  */
    15. class CatController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
    16.  
    17. /**
    18. * catRepository
    19. *
    20. * @var \TYPO3\Swcats\Domain\Repository\CatRepository
    21. * @inject
    22. */
    23. protected $catRepository;
    24.  
    25. /**
    26. * initializeAction
    27. *
    28. * @return
    29. */
    30. public function initializeAction() {
    31. $this->catRepository = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\Swcats\Domain\Repository\CatRepository');
    32. $this->colorRepository = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\Swcats\Domain\Repository\ColorRepository');
    33. }
    34.  
    35. /**
    36. * action list
    37. *
    38. * @return void
    39. */
    40. public function listAction() {
    41. $cats = $this->catRepository->findAll();
    42. $this->view->assign('cats', $cats);
    43. }
    44.  
    45. /**
    46. * action show
    47. *
    48. * @param \TYPO3\Swcats\Domain\Model\Cat $cat
    49. * @return void
    50. */
    51. public function showAction(\TYPO3\Swcats\Domain\Model\Cat $cat) {
    52. $this->view->assign('cat', $cat);
    53. }
    54.  
    55. /**
    56. * action new
    57. *
    58. * @param \TYPO3\Swcats\Domain\Model\Cat $newCat
    59. * @dontvalidate $newCat
    60. * @return void
    61. */
    62. public function newAction(\TYPO3\Swcats\Domain\Model\Cat $newCat = NULL) {
    63. $this->view->assign('newCat', $newCat);
    64. $this->view->assign('allColors', $this->colorRepository->findAll());
    65.  
    66. //\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($this->colorRepository->findAll());
    67. }
    68.  
    69. /**
    70. * action create
    71. *
    72. * @param \TYPO3\Swcats\Domain\Model\Cat $newCat
    73. * @return void
    74. */
    75. public function createAction(\TYPO3\Swcats\Domain\Model\Cat $newCat) {
    76. $this->catRepository->add($newCat);
    77. $this->flashMessageContainer->add('Your new Cat was created.');
    78. $this->redirect('list');
    79. }
    80.  
    81. /**
    82. * action newColor
    83. *
    84. * @param \TYPO3\Swcats\Domain\Model\Cat $cat
    85. * @param \TYPO3\Swcats\Domain\Model\Color $newColor
    86. * @dontvalidate $newColor
    87. * @return void
    88. */
    89. public function newColorAction(\TYPO3\Swcats\Domain\Model\Cat $cat, \TYPO3\Swcats\Domain\Model\Color $newColor = NULL) {
    90. $this->view->assign('cat', $cat);
    91. $this->view->assign('newColor', $newColor);
    92. }
    93.  
    94. /**
    95. * action createColor
    96. *
    97. * @param \TYPO3\Swcats\Domain\Model\Color $newColor
    98. * @param \TYPO3\Swcats\Domain\Model\Cat $cat
    99. * @return void
    100. */
    101. public function createColorAction(\TYPO3\Swcats\Domain\Model\Color $newColor, \TYPO3\Swcats\Domain\Model\Cat $cat) {
    102. $this->colorRepository->add($newColor);
    103. $this->catRepository->findByUid($cat->getUid())->addColor($newColor);
    104. $this->flashMessageContainer->add('Your new color was created.');
    105. //\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($this->merchantRepository->findByUid($merchant->getUid()));
    106. $this->redirect('list');
    107. }
    108.  
    109. /**
    110. * action edit
    111. *
    112. * @param \TYPO3\Swcats\Domain\Model\Cat $cat
    113. * @return void
    114. */
    115. public function editAction(\TYPO3\Swcats\Domain\Model\Cat $cat) {
    116. $this->view->assign('cat', $cat);
    117. $this->view->assign('allColors', $this->colorRepository->findAll());
    118. }
    119.  
    120. /**
    121. * action update
    122. *
    123. * @param \TYPO3\Swcats\Domain\Model\Cat $cat
    124. * @return void
    125. */
    126. public function updateAction(\TYPO3\Swcats\Domain\Model\Cat $cat) {
    127. $this->catRepository->update($cat);
    128. $this->flashMessageContainer->add('Your Cat was updated.');
    129. $this->redirect('list');
    130. }
    131.  
    132. /**
    133. * action delete
    134. *
    135. * @param \TYPO3\Swcats\Domain\Model\Cat $cat
    136. * @return void
    137. */
    138. public function deleteAction(\TYPO3\Swcats\Domain\Model\Cat $cat) {
    139. $this->catRepository->remove($cat);
    140. $this->flashMessageContainer->add('Your Cat was removed.');
    141. $this->redirect('list');
    142. }
    143.  
    144. }
    145. ?>

    Und hier kommt das Template NewColor.html:

    1. <f:layout name="Default" />
    2.  
    3. <f:section name="main">
    4. <h1>New Color</h1>
    5.  
    6. <f:flashMessages />
    7.  
    8.  
    9. <f:form action="createColor" name="newColor" object="{newColor}" arguments="{cat : cat}">
    10. <label for="identifier">
    11. <f:translate key="tx_swcats_domain_model_color.identifier" /> <span class="required">(required)</span>
    12. </label><br />
    13. <f:form.textfield property="identifier" /><br />
    14. <f:form.submit value="Create new" />
    15. </f:form>
    16. </f:section>

    Ich hänge auch den Dump der Cat nach dem $this->color->attach($color) aus dem Model an. Vielleicht muss ich irgendwo noch sagen, wie die veränderte color-Eigenschaft der Katze weggeschrieben werden soll?

    Sabine

    Anhänge (1)
    cat.txt text/plain 0,00 B 174 heruntergeladen
  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    05. 09. 2013, 14:27

    Wenn ich richtig verstanden habe, ist dein Datensatz da. Nur wird er nicht angezeigt.
    Daher tipp ich drauf, daß die entsprechende Action, die den aktualisierten Datensatz darstellt (list ?) noch auf non-cacheable gesetzt werden muss.

    Das wäre dann in der ext_localconf.php

  • SabineW SabineW
    T3PO
    0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    05. 09. 2013, 14:45

    Hallo Harald,

    Wenn ich richtig verstanden habe, ist dein Datensatz da. Nur wird er nicht angezeigt.

    Richtig, der Datensatz wird angelegt. Aber das Problem ist leider kein Anzeigeproblem. Es geht darum, dass die Verknüpfung zwischen Cat und Color nicht hergestellt wird. In der Tabelle tx_swcat_cat_color_mm erfolgt kein Eintrag und auch die Property color in der betreffenden Katze wird nicht hochgezählt.

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    05. 09. 2013, 15:50

    Vielleicht liegts daran, daß die Color, die du der Katze zuweisen willst, an der Stelle noch nicht existiert. Im colorRepository ist sie erst persistent, wenn du die Action verlassen hast (hier per redirect). An der Stelle addColor($newColor) besitzt diese noch keine uid und kann so nicht attached werden.

    Dann könnte das hier helfen...

    1. public function createColorAction(\TYPO3\Swcats\Domain\Model\Color $newColor, \TYPO3\Swcats\Domain\Model\Cat $cat) {
    2. $this->colorRepository->add($newColor);
    3.  
    4. //diese 2 Zeilen um die Color zu persistieren
    5. $persistenceManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance("TYPO3\\CMS\\Extbase\\Persistence\\Generic\\PersistenceManager");
    6. $persistenceManager->persistAll();
    7.  
    8. $this->catRepository->findByUid($cat->getUid())->addColor($newColor);
    9. $this->redirect('list');
    10. }

    Grad fällt mir noch was ein...
    Ist denn die Farbe (Color) eine Entität oder ein ValueObject?
    Bei VOs bin ich mir da nicht mehr so sicher.

  • SabineW SabineW
    T3PO
    0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    05. 09. 2013, 17:32

    Schade, schade, Harald,

    die zwei Zeilen sind's leider nicht.

    Color ist übrigens eine Entity.

    Vielleicht hat jemand noch eine Idee?

  • kitsunet kitsunet
    Flash Gordon
    1 x
    2559 Beiträge
    27 Hilfreiche Beiträge
    05. 09. 2013, 19:53

    Yep, dir fehlt ein

    $this->catRepository->update($cat);

    (kommt vors redirect ziemlich am Ende)

    Sonst weiß Extbase nicht, dass Du deine Änderungen auch speichern willst.

    Das hier:
    $this->catRepository->findByUid($cat->getUid())->addColor($newColor);
    Ist übrigens unnötig kompliziert, du hast ja schon das Cat Objekt, d.h. das hier reicht auch:

    $cat->addColor($newColor);

    Viele Grüße
    Christian

    config.baseURL = http://www.kitsunet.com/
    TYPO3 Flow und Neos Community Contact
    Release Manager TYPO3 Neos 1.1
    Ich habe Probleme mit den PMs hier, also schreibt mir bitte eine Mail oder über Twitter!

  • SabineW SabineW
    T3PO
    0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    06. 09. 2013, 08:27

    $this->catRepository->update($cat);
    ...
    Sonst weiß Extbase nicht, dass Du deine Änderungen auch speichern willst.

    Au weia - manchmal sieht man vor lauter Farben die Katze nicht mehr .... Genau das isses, Christian :)
    Und Dein zweiter Hinweis: ja, stimmt, das war noch ein Relikt aus meinen diversen Versuchen, das Problem einzukreisen. Danke!

    Ein dickes Danke an alle, die hier mitgedacht haben - merci!

    Sabine

  • 1