Controller -> ShowAction: Zugriff auf Attribute des ermittelten Datensatzes [Gelöst]

  • fan66766 fan66766
    T3PO
    0 x
    23 Beiträge
    0 Hilfreiche Beiträge
    12. 02. 2013, 18:06

    Hallo Community,

    ich schaffe es mir ein Datensatz "Thema" mittels UID im URL-Aufruf zu holen und diesen anzuzeigen mit all seinen Attributen.

    Die Tabelle Thema hat aber noch andere Beziehungen zu anderen Themen. Ich schaffe es auch im gleichen Controller andere Repositories einzubinden und mir deren Tabelleninhalte ausgeben zu lassen.

    Was ich mir aber vorstelle ist den aktuellen Namen (Attribut) des Themas (Datensatzes) geben zu lassen, und folglich jene Bücher zu laden, die jenes Thema haben.

    Das scheint wohl nicht so einfach zu sein. Angefangen mit den Attibuten. Auf das geladene Objekt kann ich ein print_r() machen und die Informationen sehe ich auch, aber bei direkten Zugriff über $this->thema->name eine Fehlermeldung erhalte, dass diese protected sind.

    Könnt Ihr mir da weiterhelfen? Wie macht ihr das?

    Danke und Gruss


  • 1
  • fan66766 fan66766
    T3PO
    0 x
    23 Beiträge
    0 Hilfreiche Beiträge
    13. 02. 2013, 12:32

    Hat keiner eine Antwort parat?

  • beo6 beo6
    Padawan
    0 x
    45 Beiträge
    1 Hilfreiche Beiträge
    13. 02. 2013, 15:29

    Ich verstehe leider noch nicht so ganz was dein Problem ist.

    Du hast Themen die wieder weitere Themen enthalten?
    Sind die anderen Themen ein eigenes Repository?

    Wo kommen auf einmal die Bücher her?

    Willst du einfach nur Büchern bestimmte Themen zuweisen?

    Dann würde ich Bücher als Model definieren und die Themen als Referenz.

    dann könntest du doch einfach ein $this->BuecherRepository->findAllByThema($themauid);
    machen um alle Bücher über dieses Thema zu erhalten.

    Und um auf bestimmte Parameter in deinem Model zuzugreifen gibt es ja die Getter und Setter.
    Du kannst also auf den "name" mit $this->thema->getName(); zugreifen.

    Hoffe ich konnte helfen.
    Sonst gib doch ein paar mehr Informationen oder ein wenig Code.

  • fan66766 fan66766
    T3PO
    0 x
    23 Beiträge
    0 Hilfreiche Beiträge
    13. 02. 2013, 17:14

    Naja, ich bin schon etwas weiter gekommen.

    Also ganz simpel an einem Beispiel gehalten:

    1. class Tx_BlogExample_Domain_Repository_BuchRepository
    2. extends Tx_Extbase_Persistence_Repository {
    3.  
    4. public function findByThema(Tx_BlogExample_Domain_Model_Thema $thema) {
    5. $query = $this->createQuery();
    6. $query->matching($query->contains('thema', $thema));
    7. $buecher = $query->execute();
    8. return $buecher;
    9. }
    10. }

    Ich hole mir vorerst ein Thema, habe es als Objekt, übergebe es an diese Funktion um zu schauen welche Bücher diese Themen führen. Da bekomme ich passende Bücher raus.

    Nun habe ich aber den Fall das mir ein Array von Objekten geliefert wird, also mehrere Themen. Dafür habe ich die Funktion etwas abgewandelt:

    1. class Tx_BlogExample_Domain_Repository_BuchRepository
    2. extends Tx_Extbase_Persistence_Repository {
    3. public function findByThemen(Tx_BlogExample_Domain_Model_Thema $themen) {
    4. $query = $this->createQuery();
    5. $first = true;
    6.  
    7. foreach($themen as $thema):
    8. if($first){
    9. $query->matching($query->contains('thema', $thema));
    10. }else{
    11. $query->logicalOr(matching($query->contains('thema', $thema)));
    12. }
    13. endforeach;
    14.  
    15. $buecher = $query->execute();
    16. return $buecher;
    17. }
    18. }

    Übergebe ich diese an meine Funktion findByThemen() meckert er selbstverständlich, dass er mit dem Parameter nicht anfangen kann, weil es nicht ein Objekt vom Typ "Tx_BlogExample_Domain_Model_Thema" ist.

    Wie bekomme ich das hin? Danke

  • beo6 beo6
    Padawan
    0 x
    45 Beiträge
    1 Hilfreiche Beiträge
    13. 02. 2013, 18:23

    Ok.

    schau mal was du denn überhaupt für ein Objekt-Typ übergibst.

    Übergibst du nicht vielleicht ein Tx_Extbase_Persistence_ObjectStorage ?

    Dann versuch mal:

    1. <?php
    2. public function findByThemen(Tx_Extbase_Persistence_ObjectStorage $themen) {
    3. //...
    4. }

    dann dürftest du eigentlich direkt übergeben können was du bei $this->BuchRepository->getThemen(); erhältst.

    Du musst vermutlich in der foreach schleife noch
    $thema->getUid(); verwenden um nicht das ganze Objekt an die SQL-Abfrage anzuhängen.

    Habe sowas noch nicht versucht und ist ungetestet.

    Wobei ich mich gerade frage wieso du nicht einfach ein Array der IDs übergibst statt das ganze Objekt.

  • kitsunet kitsunet
    Flash Gordon
    0 x
    2559 Beiträge
    27 Hilfreiche Beiträge
    13. 02. 2013, 20:13

    Den Argumenttyp zu ändern dürfte reichen, entweder wie unten beschrieben auf ein ObjectStorage oder eben ein Array wenn du ein solches hast. Das mit dem getUid() sollte nicht nötig sein.

    config.baseURL = http://www.kitsunet.com/
    TYPO3 Flow und Neos Community Contact
    Release Manager TYPO3 Neos 1.1
    Ich habe Probleme mit den PMs hier, also schreibt mir bitte eine Mail oder über Twitter!

  • fan66766 fan66766
    T3PO
    0 x
    23 Beiträge
    0 Hilfreiche Beiträge
    14. 02. 2013, 14:32

    Hallo vielen Dank für die Hinweise. Jedoch klappt es noch nicht so ganz.

    Habe es mit folgendem versucht:

    1. public function findByThemen(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $themen) {

    Ich erhalte folgenden Fehler:
    1. Call to undefined function TYPO3\[MEINE EXTENSION]\Domain\Repository\matching()

    Es gibt auch keine getThemen() Funktion, nur eine Tabelle thema mit einer vom System generierten Funktion get Thema().

    Das Objekt-Array erhalte ich deshalb, weil ich vorher mir eine bestimmte Lektion geben lasse (Lektion kann mehrere Themen haben). Ich bekomme also ein Objekt-Array von Themen wieder, die ich gerne in einem Abwasch mit ner query machen will.

  • beo6 beo6
    Padawan
    0 x
    45 Beiträge
    1 Hilfreiche Beiträge
    14. 02. 2013, 15:00

    Hallo.

    Erstmal bin ich etwas verwirrt.
    Welche Typo3 version nutzt du? Am anfang sieht es aus wie Typo3 v4.5. Jetzt sieht es mehr wie 4.7 oder 6.0 mit namespaces aus.

    gibt denn die generierte Methode getThema() einen ObjectStorage zurück oder nur ein einzelnes Objekt?

    Du hast also auch ein Model namens "Lektion" ?
    Gibt es da die Methode getThema() die du nutzt?

    Zeig doch mal wie du dieses Themen Objekt-Array bekommst oder generierst?

  • fan66766 fan66766
    T3PO
    0 x
    23 Beiträge
    0 Hilfreiche Beiträge
    14. 02. 2013, 15:29

    Ja Sorry.
    Ich habe mir ein Beispiel aus dem Internet herausgesucht und es umgeschrieben und benutze die Typo3-Version 6.0 mit namespaces.

    Ich habe ein Model Lektion, da gibt es auch die getThema(), aufgrund der m:n Relation.

    Ich bekomme bei einer Lektion nun mehrere Themen. Bei Ausgabe mit Debug im Frontend sieht es so aus:

    1. thema => TYPO3\CMS\Extbase\Persistence\ObjectStorage prototype object (3 items)
    2. 000000001ca31c7b00000000027116f2 => TYPO3\[MEINE EXTENSION]\Domain\Model\Thema prototype persistent entity (uid=2, pid=18-)
    3. 000000001ca31f3b00000000027116f2 => TYPO3\[MEINE EXTENSION]\Domain\Model\Thema prototype persistent entity (uid=1, pid=18-)

    Im BuchRepository habe ich wie zuvor schon erwähnt eine Methode implementiert, die ich im Lektion-Controller aufrufe.

    Gehe ich nun dieses Thema-Array durch mit foreach(), bekomme ich die einzelnen Objekte und kann die Funktion im BuchRepository wunderbar aufgerufen mit Ergebnissen. Aber eine Übergabe mit "Gibt mir alle Bücher, die eventuell das Thema, das Thema und das Thema haben."

  • fan66766 fan66766
    T3PO
    0 x
    23 Beiträge
    0 Hilfreiche Beiträge
    20. 02. 2013, 17:10

    Hallo Leute,

    alles in bester Ordnung. Es läuft genau so wie ich es mir gedacht habe. Jedoch gab es einen Aufruf-Fehler:

    Das hier wurde nix

    1. $query->logicalOr(matching(

    So wird was draus:

    1. $query->logicalOr($query->matching(

    Vielen Dank an alle, die mitgemacht haben und viel Erfolg.

  • 1