Zum Inhalt springen

Master/Detail Seite mit Abstract Value Object

Erstellt am 4. April 2016 · 7 Antworten · letzte Antwort am 13. April 2016

Tags: Frage

Unbekannter Benutzer ·

Hallo zusammen,

ich nutze Typo3 6.2.15.

Ich habe eine eigene Extension geschrieben, die mir von einer fremden Datenquelle über eine Schnittstelle JSON-Objekte liefert. Diese Objekte wandel ich in ein Array um und anschließend werden sie als Liste angezeigt. Das hat so weit alles geklappt.

Jetzt soll zu der Liste allerdings auch eine Detailansicht hinzukommen.
Dh. ich habe dasselbe Plugin mit verschiedenen Layouts erstellt. Ein Listen-Layout und ein Detail-Layout.
Im Listen-Layout verlinke ich auf eine Detail-Seite, die ich im BE angeben kann. Dort werden dann weitere Daten nachgeladen, etc.
Da es mit der Übergabe des Arrays an die Detailansicht nicht geklappt hat und ein Objekt ohnehin besser ist, habe ich ein \TYPO3\CMS\Extbase\DomainObject\AbstractValueObject Staffel erstellt, meine JSON-Objekte in diese Objekte umgewandelt und im Link zur Detailansicht übergeben.

Mein Abstract Value Object, das ich aus den JSON-Objekten erzeuge sieht so aus:

/**
 * Staffel
 */
class Staffel extends \TYPO3\CMS\Extbase\DomainObject\AbstractValueObject
{...}

Das hier ist der Link zur Detailseite:

<f:link.action action="show" pageUid="{detailPid}" arguments="{liga: liga, backPage:settings.backpage}">{liga.staffel}</f:link.action>

Das ist meine Show-Action im zugehörigen Controller:

/*
* action show
*
* @param \domain\myextension\Domain\Model\Staffel $liga
* @dontvalidate $liga
* @return void
*/
public function showAction(\domain\myextension\Domain\Model\Staffel $liga) {...}

Ich bekomme jedoch folgende Fehlermeldung:
Exception while property mapping at property path "":Table 'mydomain.tx_myextension_domain_model_staffel' doesn't exist

Statt dontvalidate vor der show-Action habe ich auch schon @ignorevalidation $liga ausprobiert. Ohne Erfolg.

Das Model Staffel habe ich auch schon als AbstractEntity statt AbstractValueObject versucht, auch das ging nicht.

Langsam weiß ich wirklich nicht mehr weiter. In Foren nach ähnlichen Problemen habe ich bereits ohne Erfolg gesucht. Kann mir jemand Tipps geben weshalb trotz allem versucht wird das Objekt auf eine Tabelle in der Datenbank zu mappen und wie das unterdrückt werden kann?
Oder gibt es einen viel besseren Ansatz für meine Master-Detail-Verlinkung?

Danke schon mal für eure Hilfe!

Viele Grüße

aemka ·

Meines Wissens nach wird bei dem ganzen Property Mapping immer auf Datenbank-Basis gearbeitet / versucht zu mappen. Daher würde ich es einfach machen, nur eine ID an die Detailansicht übergeben und dann dort noch mal die Schnittstelle ansprechen und den einen Datensatz ziehen. Oder alternativ, ziehe alle Daten aus der Schnittstelle in die Datenbank und arbeiten direkt mit der Datenbank.

Unbekannter Benutzer ·

Aber müsste es nicht möglich sein, das Mapping auf die Datenbank zu unterdrücken, wenn es nicht gewünscht ist?

Wenn ich nur die ID übergebe, bekomme ich einen anderen Fehler:
The argument type for parameter $liga of method mydomain\myextension\Controller\LigaController->showAction() could not be detected

Das scheint also leider auch keine Lösung zu sein.

Das ist der angepasste Link:

<f:link.action action="show" pageUid="{detailPid}" arguments="{liga: liga.staffelId}">{liga.staffel}</f:link.action>

Meine angepasste Show Action:

/*
* action show
*
* @param int $liga
* @return void
*/
public function showAction(int $liga) {...}

Wobei weder int noch mixed funktioniert. Und mit * @dontvalidate $liga kommt der Fehler auch trotzdem.

liga im Link ist immernoch ein AbstractValueObject und staffelId ein int Attribut. Der Typ von $liga sollte also bekannt sein. Oder nicht?

Hat jemand noch eine Idee zum Mapping oder zu dem neuen Fehler?
Ich weiß jetzt nämlich wirklich nicht mehr weiter...

Die Daten aus der Schnittstelle in der DB zu speichern ist leider in dem Fall keine Option.

Viele Grüße

aemka ·

> Aber müsste es nicht möglich sein, das Mapping auf die Datenbank zu unterdrücken, wenn es nicht
> gewünscht ist?

Müsste vlt., ist es aber derzeit m. W. nicht.

> Wenn ich nur die ID übergebe, bekomme ich einen anderen Fehler:
> The argument type for parameter $liga of method mydomain\myextension\Controller
> \LigaController->showAction() could not be detected

Hast du auch alle Caches gelöscht nachdem du die Annotation geändert hast?

Unbekannter Benutzer ·

Ja ich habe die Extension sogar neu installiert und alle Caches gelöscht...

Ich hatte gerade auch gelesen, dass man nur Objekte oder Strings übergeben kann. Keine Ahnung, ob das noch aktuell ist. Der Beitrag war schon älter.
Eine Änderung von $liga auf string statt int bringt aber auch kein anderes Ergebnis.

aemka ·

Man kann wunderbar auch ints übergeben. Ich glaube jetzt habe ich deinen Fehler gesehen:
public function showAction(int $liga)
Nimm hier mal das "int" raus. Sonst wird ein Objekt "int" versucht zu finden, dass es nicht gibt.

Unbekannter Benutzer · · Beste Antwort

Ich habe jetzt ein Workaround gefunden, das erstmal für mich funktioniert.
Dabei hat die Show-Funktion gar keine Parameter und ich hol mir die ID direkt aus den request arguments.

/*
* action show
*
* @return void
*/
public function showAction() {
if ($this->request->hasArgument('liga')) {
$staffel_id = $this->request->getArgument('liga');
}
...
}