Zum Inhalt springen

Extbase: Nur eine Property von Fremd-Tabelle mappen

Erstellt am 31. August 2016 · 3 Antworten · letzte Antwort am 2. September 2016

Tags: Frage

Bjoelin ·

Hallo in die Runde,

ich programmiere gerade eine Extension, die Touren verwaltet. Dazu hier erst einmal mein Model:

    /**
     * @var int
     */
    protected $pid;

    /**
     * @var string $tourName
     */
    protected $tourName;

    /**
     * "Inquire now" button displayed?
     *
     * @var bool
     */
    protected $hasReservationOption;

    /**
     * "Book now" button displayed?
     *
     * @var bool
     */
    protected $hasBookingOption;


    /**
     * tour's date(s)
     *
     * @var string
     */
    protected $tourDate;

    /**
     * startTime
     *
     * @var string
     */
    protected $startTime;

    /**
     * endTime
     *
     * @var string
     */
    protected $endTime;

    /**
     * ticketPriceNormal
     * @var float
     */
    protected $ticketPriceNormal;

    /**
     * ticketPriceLeipzigCardCarrier
     * @var float
     */
    protected $ticketPriceLeipzigCardCarrier;

    /**
     * ticketPriceStudent
     * @var float
     */
    protected $ticketPriceStudent;

    /**
     * ticketPriceDisabled
     * @var float
     */
    protected $ticketPriceDisabled;

    /**
     * ticketPriceChild
     * @var float
     */
    protected $ticketPriceChild;

Dazu gibt es natürlich die entsprechende Tabelle tx_extensionname_domain_model_tour, in der die Datensätze abgespeichert werden, mit Ausnahme des Tournamens (1. Property), für diese gibt es entsprechend auch keine TCA-Definition.

Die Touren werden als ganz normale Seite im Seitenbaum des Backends angelegt auf diesen Seiten jeweils die Datensätze für die Tourtermine (gem. Model) hinterlegt. Das Repository liefert bei Abfrage einer bestimmten Tour für (beispielsweise) einen bestimmten Tag das hier:

 0 => NG\ExtensionName\Domain\Model\Tourprototypepersistent entity (uid=2219, pid=216)
      pid => 216 (integer)
      tourName => NULL
      hasReservationOption => TRUE
      hasBookingOption => FALSE
      tourDate => '2016-08-31' (10 chars)
      startTime => '2016-08-31 15:30:00' (19 chars)
      endTime => '2016-08-31 17:00:00' (19 chars)
      ticketPriceNormal => 14 (double)
      ticketPriceLeipzigCardCarrier => 12 (double)
      ticketPriceStudent => 12 (double)
      ticketPriceDisabled => 12 (double)
      ticketPriceChild => 5 (double)
      uid => 2219 (integer)
      _localizedUid => 2219 (integer)modified
      _languageUid => NULL
      _versionedUid => 2219 (integer)modified

Alles ok soweit, natürlich fehlt der TOurname. Meine Frage ist, wie ich mir nun per Repository den Namen der Seite aus der "pages"-Tabelle holen kann, als Identifier würde ja die "pid" dienen.

ich habe es bereits mit einem Table Mapping versucht:

persistence {
storagePid = 20 (wird durch das Repository ignoriert)
classes{
NG\ExtensionName\Domain\Model\Tour{
mapping{
tableName = pages
columns{
tourName.mapOnProperty = title
#pid.mapOnProperty = uid
}
}
}
}
}

Problem ist nun wieder, dass Extbase auch alle anderen Spalten auf die pages-Tabelle mappen will, die es dort nicht gibt.

Meine Frage ist nun: Wie schaffe ich es, ein einzelnes Property auf eine fremde Tabelle zu mappen bzw. welchen Trick gäbe es, damit sich das Repo anderweitig den Seitennamen beschafft?

Danke im Voraus

Björn

Julian.​Hofmann ·

Hallo Björn.

Würde überlegen, obs klappt statt des Tournamen eine Relation zur Seite zu setzen. Dann hättest Du Zugriff auf alle Properties der Page.
Im Backend dürfte sich das auch bauen lassen, dass automatisch Relationa uf die aktuelle Seite gewählt wird, d.h. der Redakteur nix auswählen muss.

Viele Grüße
Julian

Bjoelin ·

Hallo Julian,

danke für den Hinweis. Deinen Ansatz hatte ich bereits, und zwar, dass sich die TCA per Relation den Namen zieht (foreign_table_where ...) und diesen (für den Redakteur gar nicht editierbar) hinterlegt.

Das klappt aber nur dann, wenn die Tourdatensätze per Backend hinterlegt und gespeichert werden .. und das werden Sie eher nicht, sondern gleich 5000 Datensätze per csv-Upload direkt in die Datenbank geschmissen.

hmm ...

Julian.​Hofmann ·

Hm, ok, aber wenn es eh importiert wird, wäre dann nicht ein kleines Import-Skript (BE-Modul, Task odgl.) nützlich, dass am Ende einfach noch ausführt:
UPDATE tx_extensionname_domain_model_tour SET tour=pid

Die Relation zur Tour/Page ist ja identisch mit der pid des Tourendatensatzes, da dieser auf den jeweiligen tourenseite gespeichert ist.