Hi,
ich hab nun mein Fallbeispiel von oben erfolgreich umgesetzt, bin mir aber nicht ganz sicher ob das ne gute Lösung ist. Könntet ihr mir bite sagen ob man das besser machen kann?
Nochmal kurz das Fallbeispiel: ich möchte herausfinden, welche Datensätze in den letzten vier Wochen angelegt wurden und diese dann als "NEU" kennzeichnen.
Also, in meinem Model (Object.php) hab ich eine Variable $new definiert (mit getNew() und setNew() Funktion). Diese Variable wird nur zur Laufzeit genutzt (hat also kein Datenbankfeld).
Das ObjectRepository habe ich um zwei Funktionen erweitert, die mir die neuen und alten Datensätze getrennt liefern. Hier passiert die Überprüfung des "Alters" der Datensätze:
<?php
class Tx_MyExt_Domain_Repository_ObjectRepository extends Tx_Extbase_Persistence_Repository {
/**
* Timeframe within a object will be marked as NEW (4 Weeks = 2419200 Seconds)
*
* @var int
*/
private $timeframe = 2419200;
/**
* Finds all objects that were created less than 4 weeks ago from now
*
* @return Tx_MyExt_Domain_Model_Object
*/
public function findNewObjects() {
$query = $this->createQuery();
$query->matching($query->greaterThanOrEqual('crdate', time() - $this->timeframe));
$query->setOrderings(array('crdate' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING));
return $query->execute();
}
/**
* Finds all objects that were created more than 4 weeks ago from now
*
* @return Tx_MyExt_Domain_Model_Object
*/
public function findOldObjects() {
$query = $this->createQuery();
$query->matching($query->lessThan('crdate', time() - $this->timeframe));
$query->setOrderings(array('crdate' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING));
return $query->execute();
}
}
?>
Im ObjectController durchlaufe ich dann beide Arrays und setze $new auf "1" bzw. auf "0":
<?php
/**
* List all objects
*
* @return string The rendered HTML string
*/
public function listAction() {
// $allObjects = $this->objectRepository->findAll();
$allObjects = array();
$newObjects = $this->objectRepository->findNewObjects();
foreach($newObjects as $object) {
$object->setNew(1);
}
$oldObjects = $this->objectRepository->findOldObjects();
foreach($oldObjects as $object) {
$object->setNew(0);
}
$allObjects = array_merge($newObjects, $oldObjects);
$this->view->assign('objects', $allObjects);
}
?>
Im View (list.html) prüfe ich den Wert der Variable $new und gebe, falls der Wert auf 1 steht, den Text "NEU" aus:
<f:if condition="{object.new}">
<span>NEU</span>
</f:if>
Geht das nicht einfacher? Ich bin diesen Weg gegangen, weil ich nicht weiß wie ich schon im Repository $new auf "1" bzw. auf "0" setzen kann. Wenn ich das wüsste könnte ich im Repository alles auf eine Datenbankabfrage reduzieren und der Controller müsste nichts weiter tun als das zurückgegebene Array an den View zu übergeben.
Wie kann ich das bewerkstelligen?