[Frage] mappen einer tabel funktioniert nicht

  • 0 x
    97 Beiträge
    3 Hilfreiche Beiträge
    05. 02. 2018, 13:04

    Mojen,
    Versuche derzeit mittels Hook auf dem Save Botton im backend eine News erzeugen zu lassen.
    Leider scheint das mappen der Tabel nicht zu funktionieren, da ich keine Fehlermeldung bekomme, kann ich das aber nicht genau sagen.
    Ich habe bereits eine Extension geschrieben, die auf die gleiche Tabel zugreift. Wenn ich auf das Repository countAll() ansetzte, bekomme ich auch die Anzahl der auf Sichtbar stehenden News angezeigt.
    Wenn ich allerdings, bei genau gleicher Konfiguration in einer weiteren Extension countAll() ausführe, bekomme ich 0 angezeigt. Somit gehe ich davon aus, dass die Extension keinen Zugriff auf die Tabel hat.

    1. <?php
    2. namespace MiMa\Newmember\Hook;
    3. use \TYPO3\CMS\Core\Utility\GeneralUtility;
    4. use MiMa\Newmember\Domain\Model\News;
    5. use MiMa\Newmember\Domain\Repository\NewsRepository;
    6.  
    7. class TCEmainHook {
    8. /**
    9. * newsRepository
    10. *
    11. * @var \MiMa\Newmember\Domain\Repository\NewsRepository
    12. */
    13. protected $newsRepository;
    14.  
    15. public function __construct(){
    16. $objectManager = GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Object\\ObjectManager');
    17. $this->newsRepository = $objectManager->get('MiMa\\Newmember\\Domain\\Repository\\NewsRepository');
    18.  
    19. }
    20.  
    21.  
    22. public function processDatamap_afterDatabaseOperations($status, $table, $id, array $fieldArray, \TYPO3\CMS\Core\DataHandling\DataHandler &$pObj){
    23. if($table == "tx_newmember_domain_model_newmember"){
    24. echo '<pre>';
    25. var_dump($status);
    26. var_dump($table);
    27. var_dump($id);
    28. $newNews = new \MiMa\Newmember\Domain\Model\News();
    29. var_dump($this->newsRepository->countAll()); //Gibt 0 aus
    30. $this->newsRepository->add($newNews); //Ohne Wirkung
    31. echo '<pre>';
    32. die();
    33. }
    34. }
    35. }

    Kann mir das leider nicht erklären. Die „ext_typoscript_setup.txt“ beinhaltet:
    1. # ==============================================
    2. # Persistence object mapping configuration
    3. # ==============================================
    4. config.tx_extbase.persistence.classes {
    5. MiMa\Newmember\Domain\Model\News {
    6. mapping {
    7. tableName = tx_news_domain_model_news
    8. recordType = 0
    9.  
    10. }
    11. }
    12. }

    Diese wird von Typo3 auch geladen.
    Wie gesagt, bei einer zweiten Extension, die genau gleich aufgebaut ist (außer das alles im Controller stattfindet, weil Frontend).
    Es dürfte doch keinen Unterschied machen, ob ich in Hook oder Controller meine PHP ablege? Geladen wird sie ja schließlich.
    Vielleicht habt ihr noch eine Idee.
    Schon mal Danke für eine Antwort
    Mfg
    Power-Poler

    Update:
    habe die "ext_typoscript_setup.txt" jetzt abgeändert und die Storage PID angegeben. jetzt findet er zwar die Einträge, kann aber keine Anlegen. Keine Fehlermeldung, kein Error, einfach nichts.
    Update2:
    Hab jetzt einen PersistenceManager herangezogen.
    Kann mir bitte jemand erklären, warum ich diesen an der stelle brauche, und was der genau tut?
    http://blog.teamgeist-medien.de/2014/09/extbase-repository-update-persistiert-nicht-nimm-den-vorschlaghammer.html


  • 1
  • freeatweb freeatweb
    Jedi-Meister
    0 x
    267 Beiträge
    4 Hilfreiche Beiträge
    06. 02. 2018, 10:19

    Hallo,

    kann sein, dass du das neue NewsObject persistieren musst.

    [code]$this->newsRepository->add($newNews);
    $objectManager->get('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\PersistenceManager')->persistAll();
    [/code]

    Sonst prüfen, ob an die newsRepository->add() function der richtige Object type übergeben wird, ob alle Pflichtfelder im Object einen Wert enthalten.

    Lg

  • 0 x
    97 Beiträge
    3 Hilfreiche Beiträge
    06. 02. 2018, 12:23

    Das Erzeugen und Speichern der News funktioniert jetzt.
    Habe jetzt aber ein anderes Problem damit.
    Und zwar, muss ich die ID der neu erstellten News, in die Table von newMember bekommen.
    Dies dient dazu, bei späterer Änderung eines Members, die zugehörige News wieder zu finden, und diese ebenfalls automatisch zu aktualisieren.

    Die ID der News habe ich bereits gefunden.
    Nach dem Persistieren:
    $newNews->getUid();

    Nur ich bekomme den automatisch erstellen Eintrag nicht, der über den save Button erzeugt wird.
    Ich habe jetzt bereits versucht, über die eindeutige crdate im array field an das Model ran zu kommen. Er meckert allerdings, dass ich keine leere Instants davon erzeugen dürfte, oder so ähnlich.
    Stehe gerade völlig auf dem Schlauch, wie ich das Model ausgelesen, geändert, und wieder in die DB bekomme.
    Auch:
    $query->statement('UPDATE tx_newmember_domain_model_newmember SET newsid = "'.$id.'" WHERE crdate = "'.$crdate.'"');
    Will nicht Updaten.
    Wie könnte ich, nach dem alles gespeichert wurde, die ID der News in das Feld newsid der newmeber Tabelle mit dem crdate schreiben?
    Schon mal Danke für eure Hilfe
    Mfg
    Power-Poler

  • 0 x
    97 Beiträge
    3 Hilfreiche Beiträge
    06. 02. 2018, 14:42

    Update:
    Ok, hab das Model Endlich "gefunden". Bekomme auch keine Fehlermeldungen mehr. Aber leider ist das Update ohne Wirkung. Soll heißen, ich ändere die newsid ($newMember[0]->setNewsid($newNews->getUid());), update ($this->newmemberRepository->update($newMember[0]);), kann so viel persistAll ($persistenceManager->persistAll();) anhängen wie ich will. In der Datenbank bleibt der Wert für newsid NULL.

    Wenn ich mir das Objekt anschaue:
    var_Dump($newMember[0]);
    vor und nach dem setzen der newsid, ist vor dem setzen dieser Wert NULL, und nach dem setzen $newNews->getUid()

    1. object(MiMa\Newmember\Domain\Model\Newmember)#1033 (12) {
    2. ["name":protected]=>
    3. string(4) "sdfs"
    4. ["place":protected]=>
    5. string(0) ""
    6. ["beginning":protected]=>
    7. int(1517924213)
    8. ["image":protected]=>
    9. string(0) ""
    10. ["newsid":protected]=>
    11. int(129)
    12. ["uid":protected]=>
    13. int(70)
    14. ["_localizedUid":protected]=>
    15. int(70)
    16. ["_languageUid":protected]=>
    17. NULL
    18. ["_versionedUid":protected]=>
    19. int(70)
    20. ["pid":protected]=>
    21. int(403)
    22. ["_isClone":"TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject":private]=>
    23. bool(false)
    24. ["_cleanProperties":"TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject":private]=>
    25. array(7) {
    26. ["name"]=>
    27. string(4) "sdfs"
    28. ["place"]=>
    29. string(0) ""
    30. ["beginning"]=>
    31. int(1517924213)
    32. ["image"]=>
    33. string(0) ""
    34. ["newsid"]=>
    35. NULL
    36. ["uid"]=>
    37. int(70)
    38. ["pid"]=>
    39. int(403)
    40. }
    41. }

    so ganz weiß ich zwar nicht was das Feld „_cleanProperties“ ist, weil dort ist er noch NULL, aber das Objekt sieht für mich richtig aus. Und dadurch das Update nicht meckert, sollte es auch doch vom Typ her stimmen?
    Was mache ich falsch?
    Edit:
    var_Dump($newMember[0]);
    var_Dump($this->newmemberRepository->findByUid($newMember[0]->getUid()));
    Liefern beide die gleichen ergebnisse, mit geänderter Newsid. In der Datenbank ändert sich aber nichts.
    UPDATE2:
    Soooo, endlich geht das auch... puhh...
    Ich depp habe vergessen, Typo3 zu sagen, dass es die Spalte in der Tabelle gibt...
    In ext_tables.php vergessen:

    1. 'newsid' => array(
    2. 'label' => 'NewsID',
    3. 'config' => array(
    4. 'type' => 'passthrough',
    5. 'eval' => 'int',
    6. )
    7. ),

    ARG
    Hier noch der code Schnipsel :
    1. $this->newsRepository->add($newNews);
    2. $persistenceManager->persistAll();
    3. $newMember = $this->newmemberRepository->getCrdate($fieldArray["crdate"]);
    4. $newMember[0]->setNewsid($newNews->getUid());
    5. $this->newmemberRepository->add($newMember[0]);
    6. $persistenceManager->persistAll();

    ich verwände hier add, anstelle von update, weil:
    https://docs.typo3.org/typo3cms/ExtbaseFluidBook/3-BlogExample/4-and-action.html
    und es damit auch geht, ich will es nicht mehr ändern.

  • 1