Zum Inhalt springen

Model mit Funktion erweitern

Erstellt am 14. Mai 2015 · 2 Antworten · letzte Antwort am 15. Mai 2015

Tags: Frage

mbuchegger ·

Hi,

das ist jetzt auch Teil des letzten Posts, aber so kann man es vielleicht auch besser finden, wenn man mal gezielt danach sucht.

Folgende Herausforderung:
Das Model hat bereits ein Startdatum und Enddatum, welches über Backend angegeben werden kann.
Jetzt möchte ich, dass man herausfinden kann ob der Datensatz noch aktuell ist oder nicht. Also, ob das Enddatum bereits in der Zukunft liegt, oder nicht.

Dazu folgender Ansatz:

	/**
	* abgelaufen
	*
	* @var boolean $abgelaufen
	*/
	protected $abgelaufen = FALSE;

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

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

In meinem Kopf hätte das ja schon funktionieren sollen. Tut es aber nicht. Zumindest nicht ganz.
Sehr spannend ist nämlich, dass Fluid zwar über eine abfrage <f:if condition="{datensatz.abgelaufen}"> wohl unterscheiden kann ob das Enddatum nun vorbei ist oder nicht, allerdings lt DEBUG Abgelaufen immer FALSE liefert.

Jetzt stellt sich die Frage... was ist hier verkehrt.

Mein Verständnis würde sagen - irgendwas stimmt da beim Setter nicht, $this->abgelaufen wurde doch nicht deklariert?! Hab aber nicht geschafft das zu korrigieren.

Da kommt noch eine weitere Herausforderung hinzu...
Was ich nicht so bedacht habe ist, dass bei $this->getEndtag() < new \DateTime() ein Datum mit einer aktuellen Tageszeit verglichen wird. Das bedeutet aber, dass bei einem Endtag 13.05.2015 natürlich Mitternacht gemeint ist, aber Abgelaufen doch erst nach dem 13.05. also am 14.05. TRUE sein soll. Das bedeutet Endtag + 86400 (sekunden eines tages). Hab da einiges herumprobiert aber bin nicht dahinter gekommen, vielleicht hat da auch jemand einen Tipp.

Hier mein Ansatz:

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

Lg M.

harald1972 · · Beste Antwort

Es wird nicht wichtiger, wenn du dreimal das gleiche postest.

Und wie mir scheint, willst du gar nicht wissen, wie das funktioniert. Du willst einfach nur eine Lösung, die tut.
Nimm dir meine Worte zu Herzen! Lies nochmal, was ich dir geschrieben habe! Mir scheint, du hast davon nicht die Hälfte verstanden - oder einfach nur überlesen.
Man möge mich korrigieren, wenn ich irgendwo was falsches gesagt habe.
Ich wiederhole mich nur ungern. Zumal du hier nicht zuhören musst, sondern alles nachlesen kannst.
Also sag ich dir NICHT NOCHMAL, was du zum x-ten Mal falsch gemacht hast.
Scheinbar weißt du immer noch nicht, was eine Member-Variable (= property) ist, und was die Aufgabe von get/set-Methoden ist.
Das war aber auch nicht deine Frage.

In der Hoffnung, daß dann mal gut ist und unter der Prämisse, daß ich alles weitere noch richtig im Kopf hab...
Du hast eine Member-Variable namens $endtag;
$abgelaufen gibt es nicht als Member-Variable.

.
Deine Model/Produktion.php

/**
 * endtag ... letzter Tag der Vorstellung
 *
 * @var \DateTime
 */
protected $endtag;

/**
 * function getEndtag
 * liefert den Wert von $endtag
 * 
 * @return \DateTime
 */
 public function getEndtag() {
        return $this->endtag;
    }

/**
 * function setEndtag
 * setzt den Wert von $endtag
 * 
 * @param \DateTime $endtag
 * @return void
 */
 public function setEndtag( $endtag) {
        $this->endtag = $endtag;
    }

/**
 * function getAbgelaufen
 * liefert true, wenn $endtag in der Vergangenheit liegt, sonst false;
 * 
 * @return \boolean
 */
 public function getAbgelaufen() {
    // such dir eins aus !
        return ($this->endtag < time() );
        return ($this->endtag < new DateTime() );
        return ($this->endtag <= new DateTime() );
        return ($this->endtag < new DateTime('tomorrow') );
    }

Ungetestet, aber sollte funktionieren.

mbuchegger ·

Hi Harald.

Danke, wie ich vor deinem Post bereits geschrieben hab, klappt alles bereits. Danke dir.

Der dreifache Post war leider ein Systemfehler von hier. Hab das gar nicht drei mal gepostet. Hab ich aber sofort gemeldet. War nicht in meinem Interesse.

Und danke für die Info mit dem Datum. Das ja cool, dass das mit DateTime('tomorrow') funktioniert.

glg M.