[Frage] SQL-Abfrage um ein Feld erweitern das die Tage zwischen Start- und Enddatum berechnet [Gelöst] TYPO3-Version: 6.1.1

  • jochla jochla
    Jedi-Ritter
    0 x
    128 Beiträge
    0 Hilfreiche Beiträge
    25. 11. 2013, 17:39

    Hallo,

    über die list action erhalte ich alle Felder die über das List-Template aufbereitet und ausgegeben werden, u. a. auch ein Start- und ein Enddatum. Nun möchte ich zusätzlich noch die Tage zwischen Start und Ende berechnen und über das Template ausgeben. Dafür gibt es sicher mehrere Vorgehensweisen. Ich habe vor, dies direkt bei der SQL-Abrage zu machen, z. B. in der Form

    1. SELECT startdatum, enddatum, feldx, (enddatum - startdatum) as tage FROM tabelle

    Die Methode findAll() liefert ja alle Datensätze und ist abgeleitet aus der Standardklasse:

    1. $cruises = $this->cruiseRepository->findAll();

    Weil ich meine erste Extension entwickle weiß ich nicht so genau wo und wie ich hier eingreifen muss. Wer kann mir hier bitte weiterhelfen? Oder gibt es einen besseren Lösungsweg?

  • jochla jochla
    Jedi-Ritter
    0 x
    128 Beiträge
    0 Hilfreiche Beiträge
    30. 11. 2013, 13:00 - Lösung

    Hier ist meine Lösung!

    Neue Methode im Model extension\Classes\Model\Crusie.php:

    1. /**
    2.  * Returns the calculated days
    3.  *
    4.  * @return \string $cruiseDays
    5.  */
    6. public function getCruiseDays() {
    7.  
    8. $cruiseDays = 0;
    9. $cruiseDays = $this->cruiseEndDate->diff($this->cruiseStartDate);
    10.  
    11. return $cruiseDays->format('%a');
    12. }

    Damit direkter Zugriff im Template möglich:

    1. <td class="td-1">{cruise.cruiseDays}</td>

  • Hilfreichster Beitrag

  • Schweriner Schwerine...
    Jedi-Ratsmitglied
    1 x
    554 Beiträge
    60 Hilfreiche Beiträge
    26. 11. 2013, 09:50 - Hilfreichster Beitrag

    Anstatt eine SQL Query in deinem Repository zu schreiben, würde ich dein Model um ein Attribut "vergangen" o.Ä. erweitern und dafür eine getVergangen() Methode schreiben, in der die Berechnung stattfindet und die den Wert zurückgibt.

    Ich glaube, nur so kannst Du auch in Fluid via {item.vergangen} auf diesen Wert zugreifen, außer dein Repository liefert Dir ein Array mit den DB Feldern anstatt eines ObjectStorage zurück.


  • 1
  • Schweriner Schwerine...
    Jedi-Ratsmitglied
    1 x
    554 Beiträge
    60 Hilfreiche Beiträge
    26. 11. 2013, 09:50

    Anstatt eine SQL Query in deinem Repository zu schreiben, würde ich dein Model um ein Attribut "vergangen" o.Ä. erweitern und dafür eine getVergangen() Methode schreiben, in der die Berechnung stattfindet und die den Wert zurückgibt.

    Ich glaube, nur so kannst Du auch in Fluid via {item.vergangen} auf diesen Wert zugreifen, außer dein Repository liefert Dir ein Array mit den DB Feldern anstatt eines ObjectStorage zurück.

  • jochla jochla
    Jedi-Ritter
    0 x
    128 Beiträge
    0 Hilfreiche Beiträge
    26. 11. 2013, 12:11

    Danke für Deine Antwort. Ich bin gedanklich schon davon ausgegangen, dass mir mit dem modifizierten SELECT das berechnete Feld im Repository zur Verfügung steht. Aber dein Vorschalg mit der eigenen getVergangen() Methode ist natürlich eine Alternative. Nur auch hier stellt sich mir die Frage: wo und wie?

    Meinst du mit "...dein Model um ein Attribut "vergangen" o.Ä. erweitern" die entsprechende .php-Datei im Verzeichnis Classes\Domain\Model ? Und wird die Funktion dort mit einer Get- und Set-Function implementiert, z.B. so:

    1. * Returns the cruiseDays - Difference between startdate and enddate
    2. *
    3. * @return \string cruiseDays
    4. */
    5. public function getCruiseDays() {
    6.  
    7. ...hier der Code zum Berechnen der Differenz...
    8.  
    9. return $this->cruiseDays;
    10. }
    11.  
    12. /**
    13.  * Sets the cruiseDays - Difference between startdate and enddate
    14.  *
    15.  * @param \string cruiseDays
    16.  * @return \string cruiseDays
    17.  */
    18. public function setCruiseDays($cruiseDays) {
    19. $this->cruiseDays = $cruiseDays;
    20. }

    Wie übergebe ich "Startdatum" und "Enddatum", oder hole ich die mir mit getCruiseStartDate() bzw. mit getCruiseStartDate()? Mir fehlt da noch ein bisschen der "Durchblick" ;-) Es wäre schön, wenn du mir hier vllt. noch wenig weiterhelfen könntest. Im voraus schon mal ein dickes DANKE !

    Gruß, Johannes.

  • Schweriner Schwerine...
    Jedi-Ratsmitglied
    0 x
    554 Beiträge
    60 Hilfreiche Beiträge
    26. 11. 2013, 13:19

    Ich gehe mal davon aus, dass es kein Feld dafür in der Datenbank gibt, in den du den Wert schreibst, also wäre ein Setter eigentlich überflüssig.

    Und ja, mit Model meine ich das Model für das Objekt, welches auch über ein Repository verfügt und eigene Datenbanktabellen hat. Dein Getter sieht schon recht gut aus, und eigentlich solltest du einfach via $this->start und $this->ende auf die Werte zugreifen können, sofern die Attribute in Deinem Model auch existieren.

  • jochla jochla
    Jedi-Ritter
    0 x
    128 Beiträge
    0 Hilfreiche Beiträge
    26. 11. 2013, 13:51

    Du hast richtig vermutet, die zu berechnenden Tage werden nicht in der Datenbank gespeichert. Und klar, dann braucht's auch keinen Setter, das habe ich nicht zu Ende gedacht ;-) StartDate und EndDate sind Attribute im Modell, also werde ich es mal so versuchen. Vielen Dank für deine bisherige Hilfe, ich würde mich ggf. hier wieder melden ;-)

    Johannes.

  • jochla jochla
    Jedi-Ritter
    0 x
    128 Beiträge
    0 Hilfreiche Beiträge
    30. 11. 2013, 13:00

    Hier ist meine Lösung!

    Neue Methode im Model extension\Classes\Model\Crusie.php:

    1. /**
    2.  * Returns the calculated days
    3.  *
    4.  * @return \string $cruiseDays
    5.  */
    6. public function getCruiseDays() {
    7.  
    8. $cruiseDays = 0;
    9. $cruiseDays = $this->cruiseEndDate->diff($this->cruiseStartDate);
    10.  
    11. return $cruiseDays->format('%a');
    12. }

    Damit direkter Zugriff im Template möglich:

    1. <td class="td-1">{cruise.cruiseDays}</td>

  • 1