[TYPO3-german] Extbase-Repository liefert keine Objekte von Unterklassen (Single Table Inheritance)
Jochen Fröhlich
jochen.froehlich at typo3.org
Thu Mar 22 05:57:36 CET 2018
Hallo zusammen,
ich versuche, aus einem Repository Objekte zurück zu bekommen, die Unterklassen repräsentieren. Diese wurden mit Single Table Inheritance definiert. Siehe docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/5-modeling-the-class-hierarchy.html
Es ist das gleiche Problem wie hier beschrieben: forum.typo3.org/index.php?t=msg&goto=736175
Bisher funktioniert folgendes:
Um die verschiedenen Unterklassen unterscheiden zu können, habe ich ein Feld "record_type" definiert.
Im Backend kann man den RecordType in einem Dropdown auswählen, die Formularfelder ändern sich entsprechend der definierten Unterklassen.
Der RecordType wird richtig im Datenbankfeld record_type gespeichert.
Das funktioniert nicht:
Wenn das Repository im Controller abgefragt wird, dann liefert es nur Objekte des Typs BaseClass (die alle Unterklassen erweitern / extenden).
Unten findet Ihr meine aktuelle Konfiguration. TYPO3 / Extbase 8.7.11.
Was mache ich falsch? Falls weitere Informationen benötigt werden, bitte sagen.
Danke schon jetzt für Hinweise in die richtige Richtung.
Viele Grüße,
Jochen
###################
Verzeichnisstruktur:
[ExtName]
-- [Classes]
---- [Domain]
------ [Model]
-------- BaseClass.php
-------- [Base]
---------- SubClassA.php
---------- SubClassB.php
------ [Repository]
-------- BaseClassRepository.php
###################
TypoScript-Setup von EXT:ExtName:
config.tx_extbase.persistence.classes {
\VendorName\ExtName\Domain\Model\BaseClass {
mapping {
tableName = tx_extname_domain_model_baseclass
recordType = \VendorName\ExtName\Domain\Model\BaseClass
}
subclasses {
\VendorName\ExtName\Domain\Model\Base\SubClassA = \VendorName\ExtName\Domain\Model\Base\SubClassA
\VendorName\ExtName\Domain\Model\Base\SubClassB = \VendorName\ExtName\Domain\Model\Base\SubClassB
}
}
\VendorName\ExtName\Domain\Model\SubClassA {
mapping {
tableName = tx_extname_domain_model_baseclass
recordType = \VendorName\ExtName\Domain\Model\SubClassA
}
}
\VendorName\ExtName\Domain\Model\SubClassB {
mapping {
tableName = tx_extname_domain_model_baseclass
recordType = \VendorName\ExtName\Domain\Model\SubClassB
}
}
}
plugin.tx_extname_extname {
view { ... }
settings { ... }
}
###################
TCA von tx_extname_domain_model_baseclass:
'types' => [
'\VendorName\ExtName\Domain\Model\Base\SubClassA' => [
'showitem' => 'record_type, name, ...'
],
'\VendorName\ExtName\Domain\Model\Base\SubClassB' => [
'showitem' => 'record_type, name, ...'
],
]
###################
SubClassA:
namespace VendorName\ExtName\Domain\Model\Base;
use VendorName\ExtName\Domain\Model\BaseClass;
class SubClassA extends BaseClass { ... }
###################
BaseClassController.php: (liefert nur Objekte des Typs BaseClass)
public function listAction() {
$records = $this->baseClassRepository->findAll();
$this->view->assign('records', $records);
}
###################
More information about the TYPO3-german
mailing list