Zum Inhalt springen

mappen einer tabel funktioniert nicht

Erstellt am 5. Februar 2018 · 3 Antworten · letzte Antwort am 6. Februar 2018

Tags: tx_news, Frage

Power-Poler ·

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.

<?php
namespace MiMa\Newmember\Hook;
use \TYPO3\CMS\Core\Utility\GeneralUtility;
use MiMa\Newmember\Domain\Model\News;
use MiMa\Newmember\Domain\Repository\NewsRepository;

class TCEmainHook {
	/**
	 * newsRepository
	 *
	 * @var \MiMa\Newmember\Domain\Repository\NewsRepository
	 */
	protected $newsRepository;
	
	public function __construct(){
		$objectManager = GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Object\\ObjectManager');
		$this->newsRepository = $objectManager->get('MiMa\\Newmember\\Domain\\Repository\\NewsRepository');
		
	}
	
	
	public function processDatamap_afterDatabaseOperations($status, $table, $id, array $fieldArray, \TYPO3\CMS\Core\DataHandling\DataHandler &$pObj){
		if($table == "tx_newmember_domain_model_newmember"){
			echo '<pre>';
			var_dump($status);
			var_dump($table);
			var_dump($id);			
			$newNews = new \MiMa\Newmember\Domain\Model\News();
			var_dump($this->newsRepository->countAll()); //Gibt 0 aus
$this->newsRepository->add($newNews);  //Ohne Wirkung
			echo '<pre>';
			die();
		}
	}
}

Kann mir das leider nicht erklären. Die „ext_typoscript_setup.txt“ beinhaltet:

# ==============================================
# Persistence object mapping configuration
# ==============================================
config.tx_extbase.persistence.classes {
	MiMa\Newmember\Domain\Model\News {
		mapping {
            tableName = tx_news_domain_model_news
            recordType = 0
            
		}
	}
}

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

freeatweb ·

Hallo,

kann sein, dass du das neue NewsObject persistieren musst.

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

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

Lg

Power-Poler ·

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

Power-Poler ·

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()

object(MiMa\Newmember\Domain\Model\Newmember)#1033 (12) {
  ["name":protected]=>
  string(4) "sdfs"
  ["place":protected]=>
  string(0) ""
  ["beginning":protected]=>
  int(1517924213)
  ["image":protected]=>
  string(0) ""
  ["newsid":protected]=>
  int(129)
  ["uid":protected]=>
  int(70)
  ["_localizedUid":protected]=>
  int(70)
  ["_languageUid":protected]=>
  NULL
  ["_versionedUid":protected]=>
  int(70)
  ["pid":protected]=>
  int(403)
  ["_isClone":"TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject":private]=>
  bool(false)
  ["_cleanProperties":"TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject":private]=>
  array(7) {
    ["name"]=>
    string(4) "sdfs"
    ["place"]=>
    string(0) ""
    ["beginning"]=>
    int(1517924213)
    ["image"]=>
    string(0) ""
    ["newsid"]=>
    NULL
    ["uid"]=>
    int(70)
    ["pid"]=>
    int(403)
  }
}

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:

		'newsid' => array(
				'label' => 'NewsID',
				'config' => array(
							'type' => 'passthrough',
							'eval' => 'int',
				)
		),

ARG
Hier noch der code Schnipsel :

                                $this->newsRepository->add($newNews);
$persistenceManager->persistAll();
				$newMember = $this->newmemberRepository->getCrdate($fieldArray["crdate"]);
				$newMember[0]->setNewsid($newNews->getUid());
				$this->newmemberRepository->add($newMember[0]);
				$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.