Zum Inhalt springen

Zugriff auf aggregierte Unterobjekte

Erstellt am 30. Mai 2011 · 9 Antworten · letzte Antwort am 18. August 2012

Tags: Fluid, Frage

oliver_g ·

Hallo,

ich habe ein Objekt mit einer Relation zu einem anderen Objekt: z.B. Objekt A hat eine Auflistung von Objekten des Typs B. Rein Repositorymäßig ist schon alles da, wenn ich im Template via foreach durchiteriere, kommen meine Datensätze.

Meine Frage lautet nun: Wie kann ich direkt, also ohne foreach-Konstrukt auf den ersten Datensatz zugreifen? Ich habe schon viele Sachen probiert, wie z.B.:

{A.B.property} oder
{A.B.0.property} oder
{A.B[0].property} usw.

Nix führt zum Erfolg.

Vielen Dank für einen kurzen Tipp.

Gruß
Oliver

Unbekannter Benutzer ·

Habs grad selber mal versucht:

Der Platzhalter im View heißt bei mir allObjects bzw. {allObjects}.

Im Controller übergebe ich also so: $this->view->assign('allObjects', $allObjects);

$allObjects ist ein Array mit nummerischem Index (0,1,2,3,etc).

Im View kann ich dann darauf so zugreifen:

<p>{allObjects.0.name}</p>
<p>{allObjects.1.name}</p>

Da du schon erwähnt hast, dass innerhalb der foreach Schleife alles funktioniert, fällt mir grad auch nichts ein. Du kannst dir ja mal das übergebene Array im Controller ausgeben lassen (via t3lib_div::debug()) und schauen was du da an Daten hast. Vielleicht klemmts ja wo anders?

Gruß.

oliver_g ·

Erst mal danke für den Tipp!

Hmm, ich hätte vielleicht erwähnen sollen, dass es sich bei meinem Objekt um ein Repository Objekt handelt, also ich hole mir z.B. A, welches wiederum Objekte des Typs B enthält mit.

Ich könnte natürlich als extra View Variable auslagern, aber das wäre nicht so optimal.

Ich guck mal mit der Debug Funktion.

Unbekannter Benutzer ·

Hi,

hast du hierzu schon eine Lösung gefunden? Ich denke, dass ich gerade vor dem gleichen Problem stehe!

Ich muss in meinem Controller auf Daten eines StorageObjects innerhalb eines Domain Model Object zugreifen, aber irgendwie kann ich nicht drauf zugreifen. Das gefundene Storage Object sieht so aus:

<?php
Tx_Extbase_Persistence_ObjectStorage Object
(
    [storage:protected] => Array
        (
            [4ffb284a23993b06d4050aaad28eb5cc] => Tx_MyExt_Domain_Model_Partner Object
                (
                    [name:protected] => Partner1
                    [description:protected] => Blah
                    [image:protected] => 
                    [street:protected] => Musterstraße
                    [housenr:protected] => 123
                    [plz:protected] => 54321
                    [city:protected] => Musterstadt
                    [telefon:protected] => 098765431
                    [fax:protected] => 0987654321-1
                    [email:protected] => muster@domain.de
                    [url:protected] => www.domain.de
                    [_cleanProperties:private] => Array
                        (
                            [name] => Partner1
                            [description] => Blah
                            [image] => 
                            [street] => Musterstraße
                            [housenr] => 123
                            [plz] => 54321
                            [city] => Musterstadt
                            [telefon] => 098765431
                            [fax] => 0987654321-1
                            [email] => muster@domain.de
                            [url] => www.domain.de
                            [uid] => 3
                        )

                    [uid:protected] => 3
                    [isClone:private] => 
                )

        )

    [isInitialized:protected] => 1
)
?>

Das Domain Model Partner (Klasse des StorageObjects) verfügt z.B. über die Methode Tx_MyExt_Domain_Model_Partner::getUrl jedoch kann ich im Controller darauf so nicht zugreifen:

<?php
/**
 * 
 * Display Detail View
 * 
 * @param int $partnerId
 * 
 * @return string The rendered HTML string
 */
public function detailAction($partnerId) {
	$allDiscounts = $this->discountRepository->findAll();
	foreach($allDiscounts as $key => $discount) {
		$partner = $discount->getPartner();
		t3lib_div::debug($partner->getUrl(), '$partner->getUrl()');
	}
	...
}
?>

Discount ist die Klasse, welche ein Object vom Typ Partner als StorageObject instanziert:

<?php
/**
 * 
 * @var Tx_Extbase_Persistence_ObjectStorage<Tx_MyExt_Domain_Model_Partner>
 */
protected $partner;


/**
 * 
 * @return Tx_Extbase_Persistence_ObjectStorage<Tx_MyExt_Domain_Model_Partner>
 */
public function getPartner() {
  return clone $this->partner;
}
?>

Fehlermeldung beim Versuch getUrl() aufzurufen (Zeile 60 ist in diesem Fall der Aufruf von getUrl()):

Fatal error: Call to undefined method Tx_Extbase_Persistence_ObjectStorage::getUrl() in /httpdocs/typo3conf/ext/vvs_myext/Classes/Controller/PartnerController.php on line 60

Bin für jeden Tipp dankbar! 🙂

Unbekannter Benutzer ·

Ich habs (denk ich) 🙂

$partner = $discount->getPartner(); liefert das StorageObject vom Typ Tx_Extbase_Persistence_ObjectStorage. Bevor ich aber an die Daten des StorageObjects rankomme muss ich Tx_Extbase_Persistence_ObjectStorage:current aufrufen, damit ich an das eigentliche Objekt herankomme, welches dann vom gewünschten Typ Tx_MyExt_Domain_Model_Partner ist.

<?php
$partner = $discount->getPartner(); // hier erhalten ich das StorageObject
$partner = $partner->current(); // Originalkommentar aus der Klasse ObjectStorage: Returns the current value of the storage array
t3lib_div::debug($partner->getUrl()); // erst jetzt kann ich die Methoden des Domain Models Partner ansprechen
?>

Coole Sache! 🙂

schmidtpublic ·

Hallo,

die Lösung von Typo3Cuckoo macht aber nur bei Show- und Edit-Views Sinn, denn dann kann ich für das eine Objekt das erste Unterobjekt ziehen.
Aber was ist mit Listen?

Wenn ich also in einer Liste von allen Mitgliedern die zugehörige Gruppe darstellen will, komme ich mit
{member.group.title} nicht weiter, weil group ein Unterobjekt ist, auf dass ich wieder mit current zugreifen müsste (was ich aber in der Fluidausgabe nicht kann?).

Natürlich geht's immer mit for-each-Schleifchen, aber das ist doch zu umständlich, wenn es eigentlich sowieso nur ein Unterobjekt (also hier: eine Gruppe) geben darf?

schmidtpublic ·

Doch natürlich, die durchlaufe ich für alle Mitglieder und zeige die Daten des Mitglieds an.
Aber für die Gruppe des Mitglieds (wo's ja nur eine geben soll) hab ich dann wieder ein Unterobjekt, dass heißt hier müsste ich nun wieder eine Schleife einlegen, denn member.group.title bringt mich ja nicht weiter...

Versuche gerade irgendwas im Model zu stricken, so dass ich da direkt die current Row bekomme - aber das will noch nicht.
Vielleicht bin ich da aber auch auf einem ganz falschen Zweig...

tantebootsy ·

@Typo3Cuckoo: Vielen Dank für's Teilen deiner Lösung – genau danach habe ich soeben gesucht. 🙂

Hier nochmals ein Beispiel in Kurzform:

public function mailSendAction(Tx_Playerbay_Domain_Model_Request $request) {
   $playerRepos = $request->getPlayer();
   $player = $playerRepos->current();
   $recipient = $player->getUsername();
}