Ok, ich bin das mal etwas durchgegangen, und bin mir nicht ganz sicher, ob ich das richtig verstanden habe.
In der compile-Funktion der NewsListe gibt es diesen Aufruf:
PHP-Code:
$objArticles = $this->fetchItems($this->news_archives, $blnFeatured, ($limit ?: 0), $offset);
Dabei ist blnFeatured die Boolean-Variable "Hervorgehoben", und limit und offset ergeben sich aus der maximalen Anzahl der anzuzeigenden Nachrichten und der Paginierung. Der Rückgabewert ist dann die Liste mit Nachrichten, die dann noch für das Template aufbereitet wird.
fetchItems sieht dann so aus:
PHP-Code:
protected function fetchItems($newsArchives, $blnFeatured, $limit, $offset)
{
// HOOK: add custom logic
if (isset($GLOBALS['TL_HOOKS']['newsListFetchItems']) && is_array($GLOBALS['TL_HOOKS']['newsListFetchItems']))
{
foreach ($GLOBALS['TL_HOOKS']['newsListFetchItems'] as $callback)
{
if (($objCollection = \System::importStatic($callback[0])->{$callback[1]}($newsArchives, $blnFeatured, $limit, $offset, $this)) === false)
{
continue;
}
if ($objCollection === null || $objCollection instanceof \Model\Collection)
{
return $objCollection;
}
}
}
return \NewsModel::findPublishedByPids($newsArchives, $blnFeatured, $limit, $offset);
}
Wenn ich das richtig sehe, wird erst der Hook aufgerufen, und dann - falls im Hook nichts sinnvolles passiert ist - wird die "normale" Methode angewandt (das letzte return), um die Liste mit News zu füllen.
Um das zu erreichen, müsste ich also das Nachrichten holen komplett selbst schreiben. Da in findPublishedByPids (der Standard-Methode) im Wesentlichen nur die Parameter in SQL-Syntax umgebaut werden, und ein "nur X hervorgehobene überspringen" eher nicht in diese Syntax hineinpasst (zumindest sehe ich nicht wie), bliebe nur folgendes für meinen Hook.
1.) findPublishedByPids wie im Standard aufrufen. Das liefert eine "Collection" von "Models". In einem protected Array sind dort die einzelnen Nachrichten als "Model" drin. Das wiederrum ist eine Abstraktion der Datenbank - wenn ich da die Methode delete zum löschen aufrufe, dann ist das auch in der DB weg.
2.) also hole ich mir mit next() und current() die einzelnen Models aus dem Array, und kopiere sie (je nach Bedarf) in ein neues Models-Array, indem ich selbst mitzähle, wieviele Hervorgehobene schon drin sind.
3.) Dann erzeuge ich eine neue Collection und gebe sie zurück mit
PHP-Code:
return new static collection($NeuErstelltesArray, $strTable)
(wobei strtable hier wohl eine dummy-Variable sein darf, normalerweise steht da die Tabelle der DB drin)
Das erscheint mir recht umständlich. Und natürlich funktioniert das nicht, sobald man eine Nachrichtenliste mit Paginierung hat und/oder generell einige Beiträge überspringt - dann kommt man mit den Offsets durcheinander. (Was für mich aber egal wäre.)
Gibt es da eine elegantere Methode, oder muss man das wirklich so machen?
Lesezeichen