Neulich stand ich vor der eigentlich recht simplen Aufgabe aus einer Extbase Extension heraus auf die erzeugten Daten einer anderen Extbase Extension zuzugreifen. Im Web gibt es auch einige Tutorials, welche beschreiben wie man dieses macht, aber fast alle zeigen, wie man auf die Tabellen
fe_users und
fe_groups zugreift, welche beide schon als Domain-Model bei Extbase mitgeliefert werden. Ein funktionierendes Praxisbeispiel für den Zugriff auf eigene Datenstrukturen konnte ich leider nicht finden.
In diesem Beitrag zeige ich deshalb, wie man aus
einer Extbase Extension heraus auf die Daten einer
anderen Extbase Extensions zugreifen kann.
Ausgangssituation:
In einer TYPO3 Installation wurden 2 Extbase Extensions (
testext1 und
testext2) eingerichtet, welche jeweils eigene Repositories und Storagefolder haben. Die Typoscript Constants der Extensions sind wie folgt eingerichtet:
plugin.tx_testext1 {
persistence {
storagePid = 5
}
}
plugin.tx_testext2 {
persistence {
storagePid = 6
}
}
Die Datensätze von
testext1 werden also im Sysordner mit der Pid 5 abgelegt und die Datensätze von
testext2 im Sysordner mit der Pid 6. In
testext1 gibt es ein Domainmodel mit dem Namen Testext1Table und in
testext2 gibt es ein Domainmodel mit dem Namen Testext2Table.
Ziel ist es nun, aus einem
Controller in
testext2 auf die angelegten Daten von
testext1 zuzugreifen.
Vorgehensweise:
Als erstes muss in
testext2 ein
Domainmodel angelegt werden, welches das Domainmodel von
textext1 extended. Also wird in textext2\Classes\Domain\Model\ die Datei Testext1Table.php angelegt.
class Tx_Testext2_Domain_Model_Testext1Table extends Tx_Testext1_Domain_Model_Testext1Table {
}
Somit wurde der
testext2 schon mal das Domainmodel aus
testext1 bekannt gemacht. Damit wir auf die Daten aus
testext1 zugreifen können, wird noch ein entsprechendes
Repository benötigt. Dieses wird in textext2\Classes\Domain\Repository\Testext1TableRepository.php definiert.
class Tx_Testext2_Domain_Repository_Testext1TableRepository extends Tx_Extbase_Persistence_Repository {
}
Nun kennt die Extension
testext2 das Domainmodel und hat auch ein entsprechendes Repository. Das neue Repository wird in einem Controller von
testext2 per Dependency Injection implementiert.
/**
* testext1TableRepository
*
* @var Tx_Testext2_Domain_Repository_Testext1TableRepository
*/
protected $testext1TableRepository;
/**
* injectTestext1TableRepository
*
* @param Tx_Testext2_Domain_Repository_Testext1TableRepository $testext1TableRepository
* @return void
*/
public function injectTestext1TableRepositoryRepository(Tx_Testext2_Domain_Repository_Testext1TableRepository $testext1TableRepository) {
$this->testext1TableRepository = $testext1TableRepository;
}
Wer an dieser Stelle jetzt schon erste Ergebnisse aus dem implementierten Repository erwartet, wird enttäuscht und bekommt beim Versuch Daten aus dem Repository abzufragen/anzuzeigen eine Exception vom Typ
Tx_Extbase_Persistence_Storage_Exception_SqlError, welche besagt, dass eine Tabelle nicht existiert.
Die Extension
testext2 weiß also anscheinend noch gar nicht, aus welcher Tabelle die Daten des neuen Repositories abgefragt werden sollen. Um dieses einzurichten, muss man im Typoscript Setup von
testext2 ein
Mapping einrichten.
config.tx_extbase {
persistence {
classes {
Tx_Testext2_Domain_Model_Testext1Table {
mapping.tableName = tx_testext1_domain_model_testext1table
}
}
}
}
An dieser Stelle ist es wichtig, dass das Mapping direkt auf den
Tabellennamen in der Datenbank stattfindet.
Auch jetzt erhalten wir über das neue Repository in
testext2 noch keine Daten, da die
testext2 noch nicht weiß, in welcher
StoragePid die Datensätze von
testext1 liegen. Hierzu ergänzt man lediglich die Typoscript Constants von
testext2 wie folgt.
plugin.tx_testext2 {
persistence {
storagePid = 6,5
}
}
Die StoragePid von
testext1 wurde hinter der StoragePid von
testext2 angehängt. Nun kann das neue Repository in
testext2 angesprochen und die erwarteten Daten erfolgreich zurückgeliefert werden.