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.
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());
}
Hab was entdeckt!!
Ich hab im ProduktionenModel ja folgendes:
/**
* abgelaufen
*
* @var boolean
*/
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;
}
Wenn ich die ersten Zeilen rausnehme - also protected $abgelaufen = FALSE; - dann seh ich im Debug, dass es gar keine Variable Abgelaufen mehr gibt. Spannenderweise funktioniert die Abfrage über Fluid aber einwandfrei. Also hier kann ich dennoch über <f:if condition="{produktion.abgelaufen}"> korrekt filtern.
Was mir jetzt nicht mehr logisch erscheint. Umso mehr scheint es mir logisch, dass so meine Schleife nicht funktioniert.
Wenn ich jetzt, des Spaßes halber, protected $abgelaufen = FALSE; auf protected $abgelaufen = TRUE; ändere, dann sind auch alle Datensätze einfach Abgelaufen = TRUE (im Debug).
Also scheint an der Variable Abgelaufen mein
/**
* 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;
}
absolut nichts zu ändern.
Mich verwirrt vor allem, dass es aber über Fluid dennoch funktioniert. Also wo ist der Fehler?! :/
Vorhin ging es mal um die PID.
Wenn hier die PID der Datensätze gemeint war - da ist alles aus der Datenbank in einem Systemordner.
glg M.
Huiuiuiuiui!
Eieieieiei!
Also... mir ist jetzt nicht ganz klar, was du am gesamten framwork extbase/fluid verstanden hast oder was nicht...
Wo fang ich da am besten an...?
Für jede deiner Properties - egal welchen Typs - sollte es ein Paar Get/Set-Methoden geben.
Das sieht dann im Model immer so aus:
/**
* foo
*
* @var <TYPDEKLARATION IST WICHTIG>
*/
protected $foo;
public function getFoo() {
return $this->foo;
}
public function setFoo(<TYP> $foo) {
$this->foo = $foo;
}
Das zum einen.
Zum anderen:
Wenn du folgendes fluid.html hast:
<f:anyviewhelper param="{foo.bar}">
...muss 1. dieses Skript die Variable (Objekt) foo kennen
und 2. dieses Objekt eine Methode getBar() haben.
Wenn du das soweit verstanden hast, sollte dir auch ein Licht aufgehen, warum trotz fehlerhaftem Code etwas 'richtiges' rauskommt.
Also entweder du hast Properties, die du in der get-Methode direkt returnst.
Oder z.B. eine Methode getAlter(), welche die Differenz zwischen Heute und Geburt liefert.
Ich hoffe, das war soweit verständlich.
Bis dann
Zu deinem Get/Set-Paar:
Was du gemacht hast, war...
1. Eine Property $abgelaufen defniert
2. Eine passende Set-Methode dazu.
3. Eine Get-Methode, die einen Wert völlig unabhängig von der eigentlichen Property ausgiebt.
Eventuell willst du get/Set für $endtag.
Hallo Harald.
Danke.
Ich denke, dass ich das alles verstanden hab. Und das ist mir ja auch alles klar.
Mein Ziel ist es ja eine Variable zu bekommen, die es im Grunde gar nicht gibt. Die heißt dann Abgelaufen.
Wenn ich mir aus der Tabelle Daten holen muss und dann ausgebe ist mir das System klar, aber hier will ich ja eigentlich nur eine Variable erstellen die direkt im Model eine Ausgabe anhand Prüfung mit anderen Variablen anstellt.
Und dann ist mir das System nicht mehr ganz klar.
Also rein mein Hausverstand sagt mir, dass der Getter mal sich Daten holt und anschließend der Setter die Daten dann in der Variablen ausgiebt. Wozu eigentlich Is dann ist ist mir hier nicht ganz klar.
Anhand meines Beispieles will ich im Getter Daten von einer anderen Variablen holen und mal mit dem aktuellen Datum vergleichen. Das dürfte funktionieren, sonst würde das ja im Fluid niemals funktionieren können.
So jetzt müsste ich das alles mit dem Setter an die Variable weitergeben, da scheint was nicht zu funktionieren.
Ich denke mal, dass mein Getter ganz ok ist, aber dann hackt es. Bin ich da mal auf dem richtigen Weg?
Jetzt gibt's wahrscheinlich was zu lachen..
Rein aus der Logik würde ich das ja so machen, aber so passiert genau das selbe wie bisher. :/
/**
* Returns the abgelaufen
*
* @return boolean $abgelaufen
*/
public function getAbgelaufen() {
$temp = $endtag < new \DateTime();
return $temp;
}
/**
* Sets the abgelaufen
*
* @param boolean $abgelaufen
* @return void
*/
public function setAbgelaufen($abgelaufen) {
$temp = $abgelaufen;
}
/**
* Returns the boolean state of abgelaufen
*
* @return boolean
*/
public function isAbgelaufen() {
return $temp;
}
Obwohl wohl $temp nicht über die Funktionen hinweg gültig sein wird...
Dann möglicherweise so...
/**
* Returns the abgelaufen
*
* @return boolean $abgelaufen
*/
public function getAbgelaufen() {
$temp = ($this->getEndtag() < new \DateTime());
return $temp;
}
/**
* Sets the abgelaufen
*
* @param boolean $abgelaufen
* @return void
*/
public function setAbgelaufen($abgelaufen) {
$this->getAbgelaufen() = $abgelaufen;
}
/**
* Returns the boolean state of abgelaufen
*
* @return boolean
*/
public function isAbgelaufen() {
return $this->abgelaufen;
}
Wobei ich ne Fehlermeldung bekomme...
Fatal error: Can't use method return value in write context in .../Classes/Domain/Model/Produktionen.php on line 660
Da ist aber einiges im Argen.
Nix für ungut...
Und dann ist mir das System nicht mehr ganz klar.
...aber war es das schon mal?
Du solltest dir mal die Grundlagen der objektorientierten Programmierung aneignen.
Sonst spreche ich hier gegen die Wand.
Du kannst doch keine Variable setzen, die du gar nicht hast.
.
Punkt 1: Es gibt Get+Set für alle Variablen = Properties, die es auch im Model gibt.
Dafür musst du sorgen!
Punkt 2: Alle Get-Methoden kannst du aus fluid aufrufen.
Zum Verständnis ein anderes Beispiel:
Person hat $vorname, $nachname
Du willst aber
<p>person.fullname</p>
Also schreibst du der Klasse Person eine Methode getFullname().
Diese kann dann noch prüfen, ob Herr oder Frau oder Prof. Dr. sonstwas zum Namen gehört und liefert das gewünschte Ergebnis.
.
Oben hab ich ein Beispiel getAlter() erwähnt.
.
Ich will die jetzt nicht deinen Code schreiben. Aber was heißt das jetzt für dich?
Du hast die property $endtag (glaub ich). Dafür machst du ein Paar Get/Set-Methoden.
Wenn getAbgelaufen() vom Verhältnis $endtag zu heute abhängt, prüfst du das in eben genau dieser Methode, und kannst dann diese aus fluid mit {objektname.abgelaufen} ansprechen.
Bei Boolschen Werte geht evtl. auch isAbgelaufen() - ohne Gewähr - probier's aus wenn du Lust hast.
Hi Harald.
Du hast natürlich voll recht. Ich kenn mich Nüsse aus.
Und dennoch hab ich das jetzt alles tatsächlich geschafft. Danke für deine Hilfe, du hast mir - auch wenn das sicher ur Mühsam war - absolut auf den richtigen Weg gebracht.
Danke dir!!
Einziges was ich noch nicht hab ist, dass ich in getEnddatum das Datum um einen Tag erweitern muss. Aber das werd ich auch noch hinbekommen 😉
glg M.