Zum Inhalt springen

Query richtig erstellen

Erstellt am 2. Mai 2015 · 27 Antworten · letzte Antwort am 14. Mai 2015 · Seite 1 von 2

Tags: Fluid, Frage

mbuchegger ·

Hi Leute,

das hat irgendwie mit meinem letzten Thema zu tun.

Einführung:
Ein Stück wurde bereits öfter mal produziert. Diese Produktionen sind aber nicht alle aktuell, manche sind natürlich schon vorbei.

Herausforderung:
Generell kann ich in einem Stück natürlich alle Produktionen ausgeben. Doch was, wenn ich das nun nach bestimmten Abfragen filtern will.

Ziel ist es einerseits aktuelle Produktionen und andererseits archivierte Produktionen extra zu bekommen.

Im Model von den Produktionen gibt es mal eine Definition die mir sagt ob die Produktion abgelaufen ist oder nicht. Das hängt allerdings mit dem Feld "endtag" zusammen. Hier gibt es jedoch Produktionen die kein Ende in Sicht haben, weshalb es ein boolean mit namen openend gibt.

Folgende Query hab ich mir gebaut:

$query = $this->createQuery();
$query->matching(
       $query->logicalOr(
           $query->equals('openend', '1'),
           $query->equals('abgelaufen', '0')
           )
       );
return $query->execute();

Das ist jetzt mal für die aktuellen Produktionen.

Doch mir ist nicht klar wie und wo ich das nun einbauen muss um über fluid dann ne Abfrage zu machen...
Also: <f:for each="{stueck.aktuelleProduktionen} as="{produktion}">

Das Endziel ist also folgende Abfragen über Fluid machen zu können:

Für alle Produktionen - <f:for each="{stueck.produktionen} as="{produktion}">
Für aktuelle Produktionen - <f:for each="{stueck.aktuelleProduktionen} as="{produktion}">
Für archivierte Produktionen - <f:for each="{stueck.archivierteProduktionen} as="{produktion}">

Bitte um Hilfe.
Danke.

mbuchegger ·

Ich weiß ja, die Frage ist wohl sehr dumm, wenn man sich auskennt, aber ich find für gerade solch banalen dinge kein how to... bzw. ne ganz einfache Übersicht wie so was funktioniert.

Bitte um dringende Hilfe.
Danke.

harald1972 ·

Moin,

zwar hab ich keine explizite Frage gefunden, aber ich versuch mal, dir zu helfen...
Da fang ich bei deinem Endziel an.

1. Dein stueck benötigt die Methoden getProduktionen, getAktuelleProduktionen, getArchivierteProduktionen.

2. Diese Methoden müssen ein Array oder einen ObjectStorage liefern.

3a) getProduktionen() sollte trivial sein, also ohne extra Query, mittels $this->produktionen
3b) Wenn du eine spezielle Abfrage also Query benutzen willst, sollte das über das entsprechende StueckRepository erfolgen. Dort muss dann die Query rein.

Gruß
Harald

mbuchegger ·

Hallo Harald.

Danke dir.

Soweit hab ich das mal verstanden. Das klingt ja auch alles sehr logisch und mittlerweile bin ich auch schon etwas weiter.

Mein ShowRepository hat man das bekommen: (Show = Stück)

    public function aktuelleProduktionen(Musicalplanet\MpDatenbank\Domain\Model\Show $show) {
        $query = $this->createQuery();
        $query->matching(
          $query->logicalAnd(
              $query->equals('show', $show->getUid()),
              $query->logicalOr(
                  $query->equals('openend', '1'),
                  $query->equals('abgelaufen', '0')
              )
          )
        );
        return $query->execute();
}

    public function archivierteProduktionen(Musicalplanet\MpDatenbank\Domain\Model\Show $show) {
        $query = $this->createQuery();
        $query->matching(
          $query->logicalAnd(
              $query->equals('show', $show->getUid()),
              $query->equals('abgelaufen', '1')
          )
        );
        return $query->execute();
}

Nach meinem Wissen heißt es nun die Abfragen auch verwendbar zu machen.
Dazu wurde im ShowController folgendes hinzugefügt:

/**
	* action produktionen
	*
	* @param \Musicalplanet\MpDatenbank\Domain\Model\Show $show
	* @return void
	*/
	public function produktionenAction(\Musicalplanet\MpDatenbank\Domain\Model\Show $show) {
		$aktuelleProduktionen = $this->produktionenRepository->aktuelleProduktionen($show);
        $archivierteProduktionen = $this->produktionenRepository->archivierteProduktionen($show);
        $this->view->assign('aktuelleProduktionen', $aktuelleProduktionen);
        $this->view->assign('archivierteProduktionen', $archivierteProduktionen);
        $this->view->assign('show', $show);
	}

Da bin ich mir aber auch sicher, dass das so nicht funktionieren kann. Das sagt mir schon mal alleine die Fehlermeldung 😃

Ich bin aber auch von dem Query nicht ganz überzeugt, weil ich ja gar nicht deklariert habe, dass ich in PRODUKTIONEN suche. Das ist mir grad nicht ganz klar. Hatte jetzt etwas Hilfe aus einem anderen Forum, wodurch die neuen Zeilen entstanden.

Wie bekomm ich denn so was nun hin ://

Ich brauch das ganz oft, ich muss das System mal verstehen. Also was wo gemacht werden muss um eigene Abfragen zu generieren.

glg M.

harald1972 ·

Ich bin etwas verwirrt. o.O

Du sprichst hier von einem ShowController und einer produktionenAction...
Ääh... bist du dir deines Models sicher?
Das sollte genau andersrum gehen. Oder hast du da Entitäten der Klasse Show?
Normalerweise sollte die Produktion (alle Objekte, Substantive) ins Model. Jede dieser Entitäten erhält (normalerweise) einen Controller.
Und der Controller ruft die showAction() auf. Wenn du deine Aufgabe in Textform hast, werden also aus den Substantiven deine Model-Objekte. Jede Entität (also nicht die Value-Objekte) erhält einen entsprechenden Controller. Alle Verben in deinem Text werden zu Methoden, Funktionen, Actionen.
Aufruf einer Action wie z.B. showAction() erfordert desweiteren eine Show.html im entsprechenden Ordner... und einiges mehr.

Und was hast du denn eigentlich für ne Fehlermeldung?
...könnte hilfreich sein.

Gruß
Harald

mbuchegger ·

Hi.

Das ist alles klar.

Also Ausgangslage ist ja, dass in Tabelle Show eine Tabelle Produktionen untergeordnet ist.

Jetzt möchte ich die Produktionen vorab mit drei Varianten auslesen können.

Einmal geht ja jetzt schon ohne Probleme. Das ist die Listung aller Produktionen über Fluid.

Jetzt brauche ich aber eine Möglichkeit über for each aktuelleProduktionen zB alle Produktionen nach meinen Vorgaben aufzulisten. Und das nochmal für Archivierte.

Damit ist mir klar ich brauch irgendwo ne query. Nur hab ich eigentlich keine Ahnung wohin damit, dass mein gewünschtes Ergebnis bekomme.

Lg M

mbuchegger ·

Hab jetzt nochmal darüber nachgedacht...

Mein Ansatz:

Also um mal die Querys zu bekommen macht es nur sinn das ins ProduktionenRepository zu geben. Ich will ja Produktionen gelistet haben, die nach einem bestimmten Muster gefiltert werden.

    public function aktuelleProduktionen($show) {
        $query = $this->createQuery();
        $query->matching(
          $query->logicalAnd(
              $query->equals('show', $show->getUid()),
              $query->logicalOr(
                  $query->equals('openend', '1'),
                  $query->equals('abgelaufen', '0')
              )
          )
        );
        return $query->execute();
}

    public function archivierteProduktionen($show) {
        $query = $this->createQuery();
        $query->matching(
          $query->logicalAnd(
              $query->equals('show', $show->getUid()),
              $query->equals('abgelaufen', '1')
          )
        );
        return $query->execute();
}

Jetzt muss eigentlich nur noch die Möglichkeit geschaffen werden dies auch in der "Show" abzurufen. Dazu noch im ShowController definiert:

    /**
	* action produktionen
	*
	* @param \Musicalplanet\MpDatenbank\Domain\Model\Show $show
	* @return void
	*/
	public function produktionenAction(\Musicalplanet\MpDatenbank\Domain\Model\Show $show) {
		$aktuelleProduktionen = $this->produktionenRepository->aktuelleProduktionen($show);
        $archivierteProduktionen = $this->produktionenRepository->archivierteProduktionen($show);
        $this->view->assign('aktuelleProduktionen', $aktuelleProduktionen);
        $this->view->assign('archivierteProduktionen', $archivierteProduktionen);
        $this->view->assign('show', $show);
	}

Es wird leider nichts augegeben, aber vielleicht ab ich auch einfach einen scheiß zusammengeschrieben.

In meinem Kopf funktioniert das so.

In Action Produtkionen sagt Fluid - liste mir alle aktuelleProduktionen.
jetzt greift das System auf das produktionenRepository zu wo auch die "Show-ID" übergeben wird.
Dort sucht die Query erstmals alle Produktionen die mit der UID der Show in Zusammenhang stehen.
Wenn dann noch openend true ist oder abgelaufen NULL, dann gibt er die Zeile auch als Array retour.

Das ist zwar nett gedacht, aber funktionieren tut es ganz offensichtlich nicht, weil sonst hätte ich ja ne Ausgabe. Fehlermeldung kommt so aktuell keine mehr.

glg M.

mbuchegger ·

Hab grad feststellen müssen, dass in der Datenbank der Bezug zu Show als Spalte tx_show benannt ist.

Damit müsste das wohl so funktionieren:

    public function aktuelleProduktionen($show) {
        $query = $this->createQuery();
        $query->matching(
          $query->logicalAnd(
              $query->equals('tx_show', $show->getUid()),
              $query->logicalOr(
                  $query->equals('openend', '1'),
                  $query->equals('abgelaufen', '0')
              )
          )
        );
        return $query->execute();
}

    public function archivierteProduktionen($show) {
        $query = $this->createQuery();
        $query->matching(
          $query->logicalAnd(
              $query->equals('tx_show', $show->getUid()),
              $query->equals('abgelaufen', '1')
          )
        );
        return $query->execute();
}

Tut aber natürlich genau so wenig. Wie sollte es auch anders sein :/

harald1972 ·

nochmal...

Da bin ich mir aber auch sicher, dass das so nicht funktionieren kann. Das sagt mir schon mal alleine die Fehlermeldung

Was hast du für ne Fehlermeldung?

Also...
das geht auch ohne umständliche Queries zu basteln. Wie mir scheint, willst du nicht eine bestimmte selektive Abfrage, sondern gleich mehrere. Dann kannst du imho auch anders zum Ergebnis kommen.

Dazu übergibt dein Controller nur das stueck/show (?) an die View, aber nicht 3 zusätzliche Listen, welche nur Teilmengen dieses stueck/show-Objektes sind.
Um in der View sowas auszuführen

<f:for each="{stueck.archivierteProduktionen} as="{produktion}">

benötigt dein Stueck (oder Show?) eine Methode getArchivierteProduktionen()
Dazu musst du nur $this.produktionen entsprechend aussieben und was bleibt, zurückliefern.

Wenn's denn mit dem Repository sein muss... geht schon... sieht auch ganz passabel aus, was du da hast - soweit ich das bisher sehe.

Aber erstens weiß ich nicht, was du sonst hast, was du für ne Fehlermeldung hast und zweitens ist es schon spät.

GN8

mbuchegger ·

Hallo erstmal.

Danke für die Antwort.

Also ich verstehe natürlich, dass man sicher über Fluid hier auch ne Lösung basteln kann.
Das macht auch voll Sinn, aber ist in dem Fall nicht perfekt zu realisieren.

Die Struktur ist nochmal wie folgt:

Show (mit vielen Daten)
Produktionen (der Show mit vielen Daten)

Ich kann mir mittlerweile abgelaufene Produktionen anzeigen lassen, und auch aktuelle Produktionen kann ich mir über conditions per Fluid anzeigen lassen. Aber es wäre praktischer dazu eine Abfrage vorweg zu haben nach der per <f:for each... fragen kann.

Grund ist, dass die Überschriften zum jeweiligen Thema zB auch verschwinden soll. Damit brauch ich aber ein Array, welches auch ne klare NULL retour geben kann, wenn zB keine archivierte Vorstellung verfügbar ist.

Ob die Produktion nun aktuell oder archiviert ist ergibt sich rein aus der Tatsache, dass eine Produktion sowohl ein Start- wie auch ein Enddatum hat. Im Model gibt es hier ein boolean mit dem Namen abgelaufen, dass kontrolliert ob das Enddatum bereits in der Vergangenheit liegt. Das funktioniert alles. Es gibt auch Produktionen die zB noch kein Enddatum besitzen und dadurch "openend" sind, was direkt im Datensatz deklariert wird.

Daher kommen die Query(s).

Aktuell kann ich nur die Datensätze nach Richtlinien über Fluid ausgeben, was theoretisch auch funktioniert, allerdings hab ich keine Möglichkeit nen Text festzulegen, sollte mal keine archivierte Produktion vorhanden sein, oder eben vielleicht mal komplett die Überschrift wegnehmen, wenn gar keine Produktion in der jeweiligen Kategorie verfügbar ist.

Deshalb das Ganze.

Aktuell hab ich, nochmals zusammenfassend, einerseits im ProduktionenRepository Querys hinzugefügt

    public function aktuelleProduktionen($show) {
        $query = $this->createQuery();
        $query->matching(
          $query->logicalAnd(
              $query->equals('tx_show', $show->getUid()),
              $query->logicalOr(
                  $query->equals('openend', '1'),
                  $query->equals('abgelaufen', '0')
              )
          )
        );
        return $query->execute();
}

    public function archivierteProduktionen($show) {
        $query = $this->createQuery();
        $query->matching(
          $query->logicalAnd(
              $query->equals('tx_show', $show->getUid()),
              $query->equals('abgelaufen', '1')
          )
        );
        return $query->execute();
}

Und andererseits das im ShowController für die Ausgabe deklariert.

    /**
	* action produktionen
	*
	* @param \Musicalplanet\MpDatenbank\Domain\Model\Show $show
	* @return void
	*/
	public function produktionenAction(\Musicalplanet\MpDatenbank\Domain\Model\Show $show) {
		$aktuelleProduktionen = $this->produktionenRepository->aktuelleProduktionen($show);
        $archivierteProduktionen = $this->produktionenRepository->archivierteProduktionen($show);
        $this->view->assign('aktuelleProduktionen', $aktuelleProduktionen);
        $this->view->assign('archivierteProduktionen', $archivierteProduktionen);
        $this->view->assign('show', $show);
	}

Hier stimmt aber scheinbar etwas nicht, weil bei ner Ausgabe über Fluid per <f:for each="{show.aktuelleProduktionen}" as="produktion"> nichts angezeigt wird.

Fehlermeldung bekomme ich nun keine mehr!

LG M.

harald1972 ·

Moin,

Hab grad feststellen müssen, dass in der Datenbank der Bezug zu Show als Spalte tx_show benannt ist.

Das würde ich SOFORT! ändern. Convention over Configuration. Was per Convention nicht passt, muss extra configuriert werden. Je mehr also schon stimmt - durch Einhalten der Convention - umso weniger muss extra und umständlich nach- oder überkonfiguriert werden.
Und wenn die Namen nicht durchgängig sind, stößt du früher oder später immer wieder auf Probleme, oder derjenige, der deinen Code in ein paar Jahren weiterbearbeiten soll - eventuell bist du das selbst.

Der Prefix tx_ deutet eher auf einen DB-Tabellennamen hin als auf eine Spalte.
Stimmt denn dein TCA diesbezüglich?

Nochmal zu diesem Punkt:

$this->view->assign('aktuelleProduktionen', $aktuelleProduktionen);
$this->view->assign('archivierteProduktionen', $archivierteProduktionen);
$this->view->assign('show', $show);

Wenn aktuelleProd und archivierteProd Teil der Show sind (so hab ich es verstanden),
dann reicht es, die show zu übergeben, weil du ja dann aus der View auch auf show.archivProd und show.aktuelleProd zugreifen kannst.
Dazu brauchst du im Show-Model die beiden Get-Funktionen (s.o. im thread), welche dir gesiebte Listen liefern.

Dann zu dem Punkt deiner Überschrift, die ausbleiben soll, wenn kein Element da ist:
Wenn du eine Liste aktuelleProduktionen hast, kannst du abzählen, wieviele Elemente drin sind ... count()
Wenn nicht, kannst du z.B. eine Methode in dein Model packen, namens hasAktuelleProduktionen() (ich bin kein Fan von Denglish, aber sei's drum)
Dort läufst du alle Prods durch und lieferst true, wenn es min. eine aktuelle gibt.

Da fällt mir noch was ein: Du hast schon den beschreibenden Kommentar über den Funktionen des Repository, oder ? Ich bin mir nicht sicher, wie wichtig dieser ist, aber schaden tut er auf keinen Fall.

mbuchegger ·

Ich hab das Gefühl, dass wir ab uns zu an einander vorbei reden. Nur nochmal die Strucktur, damit das ganz klar wird was hier überhaupt passiert. Ich nehme ein Beispiel... W.A. Mozart - Die Zauberflöte

Erste Tabelle der Datenbank...
SHOW (also Die Zauberflöte)
- Titel
- Autor
- Inhalt
- Personen der Handlung
- ...
- PRODUKTIONEN (Die Zauberflöte wird ja öfter mal wo aufgeführt, also sollen die Produktionen auch gelistet sein)
-- Produktionsname
-- Startdatum
-- Enddatum
-- Ensemble
-- Wichtige Vorstellungen

und noch vieles mehr.
Damit ist also Produktionen ein Child von Show.

Jetzt aber zu deinem letzten Post.
Warum die Spalte tx_show heißt weiß ich ehrlich gesagt nicht. Das hat der Extension-Builder so generiert. Hab daran einfach nichts geändert. Ist mir schon einmal aufgefallen, allerdings hab ich nichts daran geändert, weil alles funktioniert hat. Werde ich mir nochmal genauer ansehen.

Ich denke jetzt kommen wir der Sachen langsam näher, weil ich vorab auch immer davon ausgegangen bin, ich müsse im Model etwas machen. Also, wenn ich mir in Show Produktionen listen lassen muss, dann ist dies ja jetzt auch im Model per Get-Funktion geregelt. Die aktuelle Variante scheint mir eher eine für eine ListAction zu sein.

Und genau da brauch ich jetzt konkrete Hilfe. Wie muss ich es nun anstellen, dass ich eine funktionierende Get-Funktion im Model hinbekomme? Eine Query brauch ich natürlich schon, weil ich ja nicht, wie bisher natürlich schon möglich, alle, sondern nur Produktionen nach Richtlinien ausgegeben haben will. Nur wo genau kommt die Query dann hin, und wie konfiguriere ich das nun als Get-Funktion.

Ich will das einfach mal verstehen, damit ich es in Zukunft selbst umsetzen kann. Ich mach ja learning by doing. Für Programmierer ist das ja auch alles von Anfang an klar und ich muss mich da langsam vortasten. Ich bin echt für die Hilfe dankbar.

glg M.

harald1972 ·

...Damit ist also Produktionen ein Child von Show.

Soweit hab ich das schon verstanden.

Was der ExtensionBuilder so generiert... da musst du schon aufpassen!
Ich weiß nicht, welche Version du hast oder welche aktuell ist. Ich hab hier 2.5.2
Gerade bei 1:n Beziehungen erzeugt der ExtBuilder doppelte Einträge.
Du musst ja zwei Beziehungen aufbauen. Einmal 1:n von Show nach Produktion und einmal n:1 in der anderen Richtung.
Die Show muss ihre Produktionen kennen und die Prod. muss wissen, zu welcher Show sie gehört.

Die doppelten Einträge stehen in der ext_tables.sql und in den TCA-Dateien.
Die doppelten Columns sind die mit passthrough -> Löschen!

Die Klasse Produktion hat dann ein Show-Objekt und die Klasse Show hat dann eine Liste von Produktion(en). In der DB steht bei der N:1 die uid des entsrpechenden Objekts und bei der 1:n steht die Anzahl der referierten Objekte.
Das macht der ExtBuilder dann auch richtig.

...

mbuchegger ·

Genau so ist das. Das ist für mich auch alles klar und logisch.

Und ich möchte nun eben in der Show-Ansicht Produktionen auf drei Varianten listen können.

Einmal ganz normal - das geht jea jetzt auch schon. Also die Liste aller zugeordneten Produktionen.
Dann nochmal gefiltert nach aktuellen Produktionen.
Und eine dritte Variante für archivierte Produktionen.

Die Ausgabe soll jeweils über <f:for each... erfolgen.

Nur wohin platziere ich jetzt den Filter also die Query? Wie bekomme ich es hin, dass ich eben auch {aktuelleProduktionen} ausgeben kann.

harald1972 ·

...
Du willst also von deiner Klasse Show folgende Funktionen aufrufen:
1. getProduktionen()
2. getAktuelleProduktionen()
3. getArchivierteProduktionen()

1. ist trivial. Diese hat der ExtBuilder schon generiert, sollte genau das tun:
return $this->produktionen;

Für 2 und 3 fallen mir aber zwei Möglichkeiten ein:
i) Entweder du holst (analog zu Punkt 1) alle $this->produktionen, läufst das in einer Schleife durch, prüfst $produktion->getAbgelaufen(), packst diese in ein temporäres Array und lieferst dieses.
ii) Die zweite Möglichkeit ist übers Repository.
Afaik * gehört das aber nicht ins Model sondern in den Controller.
Edit: Das heißt nicht, daß es nicht machbar wäre.

Willst du nach einer bestimmten Property filtern, nimmst du am besten die magic findByIrgendwas.
$this->produktionenRepository->findByAbgelaufen('1');
Ohne nachzuschauen, mein ich das Ergebnis ist ein QueryResult.
Ich glaube allerdings, daß so etwas _nicht_ geht...
$this->produktionenRepository->findByAbgelaufen('0')->findByOpenend('1');
... aber ohne Gewähr.
Vielleicht hilft das:
http://stackoverflow.com/questions/23501462/extbase-repository-findby-two-parameters
Du kannst ja mal findAll() ausprobieren. (Selbstredend, was das liefert)
Ebenso kannst du diese zählen mit countBy[Property].
Wenn du in der Richtung weitermachen willst, solltest du dir mal die magischen Funktionen eines Repository zu Gemüte führen.

Bin mir nicht sicher, aber ich denke, dein Problem lässt sich ohne Query-Objekt - allein durch findBy-Methoden lösen.

Gruß
Harald

mbuchegger ·

Danke Harald.

Ich bin wohl einfach zu blöd dafür :/

Also ich hab jetzt einiges ausprobiert.
Ich kann natürlich im Model getArchivierteProduktionen() hinzufügen und bekomme erneut alle Produktionen der Show über return $this->produktionen; heraus. Doch bringt mir das ja nicht viel, weil ich dadurch exakt das selbe Ergebnis wie bereits über getProduktionen() bekomme.

Im Model hab ich keine Filter-Funktion entdeckt, was natürlich besonders schlau wäre. Also zB return $this->produktionen->findByXxx('x'); das mag das System natürlich gar nicht und ich bekomme sofort eine Fehlermeldung.

Ich muss sagen, dass ich das mit der Schleife nicht verstehe (also i) ), dazu fehlt mir wohl die Kenntnis was da genau gemacht werden muss. Hab hier auch nicht wirklich was im Netz gefunden.

Und dann Methode ii)
Das ist für mich ja alles logisch, aber ich bekomme niemals eine Ausgabe.

Mir ist bewusst, dass ich das im Controller angehen muss. Ich will jetzt einfach mal alle Produktionen in der Datenbank ausgeben. Also mit findAll().

Dazu muss ich mal im Controller das nötige Repository injecten:

	/**
     * produktionenRepository
     *
     * @var \Musicalplanet\MpDatenbank\Domain\Repository\ProduktionenRepository
     * @inject
     */
    protected $produktionenRepository;

Soweit so gut, nun muss ich zur korrekten Action und dort noch die Ausgabemöglichkeit definieren.

    /**
	* action produktionen
	*
	* @param \Musicalplanet\MpDatenbank\Domain\Model\Show $show
	* @return void
	*/
	public function produktionenAction(\Musicalplanet\MpDatenbank\Domain\Model\Show $show) {
        $archivierteProduktionen = $this->produktionenRepository->findAll();
        $this->view->assign('show', $show);
        $this->view->assign('archivierteProduktionen', $archivierteProduktionen);
	}

Nur bekomme ich damit rein gar nichts an Produktionen ins Fluid.

Hab mir dann irgendwann gedacht, dass wohl eine Listung über <f:for each="{show.archivierteProduktionen}" as="produktion"> nicht funktionieren wird, da ja dies gar nicht unter show läuft und hab die abfrage auf <f:for each="{archivierteProduktionen}" as="produktion"> geändert. Kein Ergebnis.

Und über den <f:debug> sehe ich auch keine Ausgabe mit archivierteProduktionen.

Es ist grad echt zum verzweifeln. :/

Wenn das mal klar ist, dann wir das System zu 99 % fertig. Ich werd nämlich öfter mal solche Filter benötigen. :/

lg M.

harald1972 ·

Na da sind wir doch endlich mal ein Stück weiter!

Hab mir dann irgendwann gedacht, dass wohl eine Listung über <f:for each="{show.archivierteProduktionen}" as="produktion"> nicht funktionieren wird, da ja dies gar nicht unter show läuft und hab die abfrage auf <f:for each="{archivierteProduktionen}" as="produktion"> geändert.

Soweit richtig.

findAll() liefert alle vorhandenen Objekte. Unabhängig wessen Kind sie sind.
Eventuell gilt es noch die pid zu beachten. Und selbverständlich müssen diese Objekte dann auch die entsprechnde pid haben. Überprüf doch mal in deiner DB, ob die pid überall stimmt!

Und achte auf deine Fehlermeldungen, wenn du sie mir schon nicht mitteilen willst.

Ich muss sagen, dass ich das mit der Schleife nicht verstehe (also i) ), dazu fehlt mir wohl die Kenntnis was da genau gemacht werden muss.

Du hast doch schon gesagt, was du machen willst. (Oder hab ichs gesagt?) Diesen Wunsch gilt es in PHP zu formen.
So aus der Hüfte raus geschossen würde ich das in etwa so machen:

Model/Show.php

/**
 *** geht glaub so nicht: @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Musicalplanet\MpDatenbank\Domain\Model\Produktion>
 *** aber so müsste es gehen:
 * @return array
 */
public function getArchivierteProduktionen() {
    $temp = array();
    foreach($this->produktionen as $p)
       if ($p->isArchiviert())
           $temp[] = $p;
    return $temp;
}

Model/Produktion.php

/**
 * @return boolean
 */
public function isArchiviert(){
  return $this->archiviert;
}

Entsprechend dazu das gleiche für die Aktuellen Prod.

Guten Morgen!

P.S.: Die magischen find-Methoden sind im Repository.
Auf ObjectStorage (oder gar Array) kannst du die nicht anwenden.

mbuchegger ·

Hi Danke gleich mal.

Also zu den Fehlermeldungen muss ich sagen, dass ich auf Development bin, aber nicht wirklich Fehlermeldungen bekomme. Zumindest nicht dann wenn ich weiß, so sollte es funktionieren. Nur wenn ich dann mal herumprobiere kommt mal was - aber das ist auch klar. Hätte mich eher gewundert, wenn da ne Ausgabe erfolgt.

Das zweite schau ich mir mal gleich an, aber bei der ersten Sache verstehe ich das mit PID nicht so ganz.
Klar hab ich in meinem TS die PID für die jeweiligen Ausgaben deklariert. Doch dachte ich, dass das rein für Fluid interessant ist, weil ich hier bei Links die PID mitgebe, damit der Link auf die richtige Seite geroutet wird. Das ist in meinen Augen wichtig für die jeweiligen Einstellungen und auch realurl, der ja tw einen anderen pfad dadurch bekommt.

Hier verstehe ich nicht was die PID damit zu tun hat. Aber vielleicht redest du auch nicht von der PID im TS (settings) sondern von einer Einstellung die ich bisher noch nicht entdeckt habe, oder gerade nicht im Kopf habe.

glg M.

mbuchegger ·

Da ist irgendwo der Hund begraben.

Ich hab verstanden was das alles macht und hab jetzt etwas herum probiert. Wenn ich die Schleife für aktuelle Produktionen baue und mal einfach filtere nach Produktionen die Openend sind - was direkt in der Tabelle deklariert ist - funktioniert das.

Aber die Filterung nach Abgelaufen geht leider nicht.

Das hab ich in meinem ProduktionenModel

    /**
    * @return $abgelaufen
    */
    public function getAbgelaufen() {
        return ($this->getEndtag() < new \DateTime());
    }
    
	/**
	* Sets the abgelaufen
	*
	* @param boolean $openend
	* @return void
	*/
	public function setAbgelaufen($abgelaufen) {
		$this->abgelaufen = $abgelaufen;
	}

    /**
    * Returns the boolean state of abgelaufen
    *
    * @return boolean
    */
    public function isAbgelaufen() {
        return $this->abgelaufen;
    }

Im Fluid kann ich aber mit <f:if condition="{produktion.abgelaufen}==1"> filtern. Also funktioniert das da korrekt. Doch per $p->isAbgelaufen() findet die Schleife genau gar nichts. Irgendwas stimmt da nicht, ich seh aber keinen Fehler. :/

Da hab ich übrigens noch eine kleine Frage.

    /**
    * @return $abgelaufen
    */
    public function getAbgelaufen() {
        return ($this->getEndtag() < new \DateTime());
    }

Gibt mir TRUE wenn der Endtag kleiner ist als das aktuelle Datum. Da aber natürlich nur ein Datum eingegeben wird, verschwindet die Produktion schon, wenn der heutige Tag ist. Meine Theorie - das geht ja alles in Sekunden. Also ist Endtag Mitternacht. \DateTime ist aber natürlich die jetzige Zeit auch in Minuten und Sekunden, weshalb gleich mal nach Mitternacht Abgelaufen zu TRUE wird, auch wenn die Vorstellung - für gewöhnlich - erst am Abend stattfindet. Mein Ansatz war, bin ja nicht blöd, dann müssen wir hald nen Tag dran hängen, weil eigentlich hätte ich gerne, dass immer am darauf folgenden Tag Abgelaufen TRUE wird. Also getEndtag + 86400 (Tag in Sekunden). Nur hab ich nirgends gefunden wie ich so was bauen kann. Ich hoffe das ist nicht wieder mal komplizierter als es scheint.

glg M.

mbuchegger ·

Zu dem unteren Thema dachte ich es funktioniert irgendwie so... aber bekomm es nicht hin:

    /**
	* Returns the abgelaufen
	*
    * @return boolean $abgelaufen
    */
    public function getAbgelaufen() {
        $folgetag = $this->getEndtag() + 86400;
        return ($folgetag < new \DateTime());
    }