Zum Inhalt springen

Extbase-Repository liefert keine Objekte von Unterklassen (Single Table Inheritance)

Erstellt am 22. März 2018 · 3 Antworten · letzte Antwort am 7. Juni 2018

Tags: TCA, Datenbank, Frage

jochen ·

Hallo zusammen,

ich versuche, aus einem Repository Objekte zurück zu bekommen, die Unterklassen repräsentieren. Diese wurden mit Single Table Inheritance definiert. Siehe https://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/5-modeling-the-class-hierarchy.html

Es ist das gleiche Problem wie hier beschrieben: https://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);
}

###################

pstranghoener ·

Hey jochen,
ich pinne mal deine Fragen oben als "wichtig" mit an, in der Hoffnung es kann dir jemand anderes fix helfen.

Grüße
Philipp

maik_tailor ·

Hi, ich hatte genau das gleiche Problem. Mir hat es geholfen, in die news-Extension zu gucken.
Ich habe dein Code nur überflogen, aber eine Sache, die mir sofort aufgefallen ist, ist der Identifier im record_type - ich hatte es anfangs auch so, aber wenn man mal im TCA unter config.tx_extbase.persistence.classes schaut, dann stehen dort die Vendor alle ohne vorangestelltes Backslash. Probiere es mal aus, bei mir hatte es komischerweise geholfen.

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
}....

Viel Erfolg