Zum Inhalt springen

Aus Flexforms überlieferte Indizes in korrespondierende Objekte umwandeln

Erstellt am 7. Januar 2012 · 4 Antworten · letzte Antwort am 28. Januar 2012

Tags: FlexForms, Frage

mmaedler ·

Hallo,

ich mache gerade meine ersten Gehversuche mit Extbase/Fluid und versuche einen kleinen Produktkatalog umzusetzen.
Dabei gibt es Offers (die ein Aggregat darstellen) und Types, wobei jede Offer zu einem Type gehört.
Ich habe mein Frontendplugin nun in soweit erweitert, als dass man mittels Flexforms im Backend einen Type wählen kann, der dann als Filter für die Ausgabe dienen soll. Zu diesem Zweck habe ich im OffersController eine listFilteredAction hinzugefügt, die als optionalen Parameter den Type nimmt. Ist kein Type gesetzt wird die Auswahl aus dem Backend-Flexform gesetzt.

Nun habe ich folgendes Problem: Wird im Backend ein Type vorausgewählt so übergebe ich eine Variable vom Typ String an die entspr. Funktion im Repository, anstatt korrekterweise das Modelobjekt zu übergeben. Nun meine Frage: kann ich irgendwie im Controller das entsprechende Model zur aus der Flexform übermittelten ID erhalten, um diese zum filtern dann an das Repo weiterzugeben?

Hier noch ein wenig Code (es gibt eigentlich 3 Typen, aber ich denke für meine Fragestellung ist die Anzahl eher irrelevant):

// OfferController.php
 /**
     * action to show a filtered list
     *
     * @param Tx_MmdevFos_Domain_Model_Type $maintype
     * @param Tx_MmdevFos_Domain_Model_Type $subtype
     * @param Tx_MmdevFos_Domain_Model_Type $category
     * @return void
    */
    public function filteredListAction( Tx_MmdevFos_Domain_Model_Type $maintype = NULL,
                                        Tx_MmdevFos_Domain_Model_Type $subtype = NULL,
                                        Tx_MmdevFos_Domain_Model_Type $category = NULL) {

       // check if args where null - if yes try to fetch from backendconf
       if ($maintype == NULL && $subtype == NULL && $category == NULL) {
           $maintype = $this->settings['maintype'];
           $subtype = $this->settings['subtype'];
           $category = 1;
       }
       $filteredOffers = $this->offerRepository->findFiltered($maintype, $subtype, $category);
       $this->view-assign('offers', $filteredOffers);
    }
// OfferRepository.php
/**
     * @param Tx_MmdevFos_Domain_Model_Type $maintype
     * @param Tx_MmdevFos_Domain_Model_Type $subtype
     * @param Tx_MmdevFos_Domain_Model_Type $category
     * @return Maybe an array of objects
     */
    public function findFiltered(Tx_MmdevFos_Domain_Model_Type $maintype,
                                    Tx_MmdevFos_Domain_Model_Type $subtype,
                                    Tx_MmdevFos_Domain_Model_Type $category) {
        $query = $this->createQuery();

        return $query->matching(
            $query->logicalAnd(
                $query->equals('maintype', $maintype),
                $query->equals('subtype', $subtype),
                $query->equals('category', $category)
            ))->execute();
    }

Vielen Dank!

stefan.​busemann ·

Hi mmaedler,

wenn Du ein Wert aus dem Flexform weiterverarbeiten möchtest hast Du ja erst mal einen Integerwert. Dies Wert würde ich nun an mein Respository übergeben mit der Methode findByUid und erhalte dann mein Objekt mit dem ich weiterarbeiten kann. Ich hoffe ich habe Dein Problem richtig verstanden.

mmaedler ·

Hallo Stefan,

vielen Dank für deine Antwort. Wenn ich sie richtig verstehe, muss ich aus ich aus Type ein Aggregat machen, damit ich dezidiert Abfragen gegen die Datenbank für Type machen kann?

Vielen Dank,

Moritz

mmaedler ·

Ok - das hat soweit alles geklappt.
Eine Frage/Unsicherheit habe ich noch:
Ich habe ja folgende (aus Designsicht nicht saubere, aber erst mal zum testen ausreichende) Konstellation:
Ich referenziere aus der Offerstabelle in drei Feldern auf die Type Tabelle (Maintype, Subtype, Category). Nun möchte ich gerne alle Categories ausgeben, für die es ein Offer gibt und bei dem Maintype = x und Subtype = y sind.

Erste Unklarheit: In welches Repository kommt diese Abfrage? Offer oder Type?
Zweite Unklarheit: Wie formuliere ich die obige Abfrage als Extbase-Query? In SQL würde das ja ungefähr so aussehen:

SELECT t.name
FROM  offers o, type t
WHERE t.uid = o.category AND o.maintype = x and o.subtype = y

Vielen Dank!