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

  • jochen jochen
    R2-D2
    0 x
    113 Beiträge
    0 Hilfreiche Beiträge
    22. 03. 2018, 10:01

    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);
    }

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

  • Hilfreichster Beitrag

  • pstranghoener pstrangho...
    Die Macht
    1 x
    491 Beiträge
    22 Hilfreiche Beiträge
    23. 03. 2018, 11:48 - Hilfreichster Beitrag

    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


  • 1
  • pstranghoener pstrangho...
    Die Macht
    1 x
    491 Beiträge
    22 Hilfreiche Beiträge
    23. 03. 2018, 11:48

    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

  • jochen jochen
    R2-D2
    0 x
    113 Beiträge
    0 Hilfreiche Beiträge
    27. 03. 2018, 16:18

    Danke! :)

  • maik_tailor maik_tail...
    Typ im Roten Hemd
    0 x
    2 Beiträge
    0 Hilfreiche Beiträge
    07. 06. 2018, 13:52

    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

  • 1