Nachrichtenliste: Zuerst 4 "hervorgehobene" und dann den Rest
Hallo zusammen,
ich steh da grade etwas auf dem Schlauch - ich möchte folgendes erreichen:
Ich habe eine Seite mit Nachrichten. Auf dieser möchte ich eine gewisse Anzahl hervorgehobener Nachrichten groß am Anfang der Liste haben, und danach ein paar weitere (hervorgehoben und nicht hervorgehoben) in kleinerer Darstellung.
Dabei möchte ich ausdrücklich die Möglichkeit haben, dass auch eine neu angelegt Nachricht (die aber nicht so wichtig ist) nicht groß am Anfang der Seite auftaucht, sondern dann "nur" als erste bei den kleineren Nachrichten.
Wie kriege ich das hin? "x Nachrichten überspringen" geht ja nicht, denn da werden ja X Nachrichten übersprungen, aber nicht unbedingt "X hervorgehobene Nachrichten".
Gibt es eine andere Möglichkeit als 2 Nachrichtenarchive mit regelmäßigem händischem Umsortieren, dass in dem einen Archiv immer nur genau/maximal 4 Nachrichten sind, die ich prominenter anzeigen möchte?
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich bin jetzt durch damit. Für die, die vor einem ähnlichen Problem stehen, hier mal meine Lösung.
Kernstück ist der Hook auf newsListFetchItems. Der sieht bei mir so aus
PHP-Code:
class NewslistSkipHighlighted extends Frontend
{
public function FetchItemsSkipHighlight($newsArchives, $blnFeatured, $limit, $offset, $newsList) {
if ($newsList->skipHighlighted == 0) {
// default way of getting news, just as in
// \news\modules\ModuleNewsList.php,
// ......protected function fetchItems($newsArchives, $blnFeatured, $limit, $offset)
return \NewsModel::findPublishedByPids($newsArchives, $blnFeatured, $limit, $offset);
} else
{
// Do some special stuff
// 1.) increase the number of news to get
$newLimit = $limit + $newsList->skipHighlighted;
// 2.) get all the news (including the ones we want to skip)
$tmpNewsCollection = \NewsModel::findPublishedByPids($newsArchives, $blnFeatured, $newLimit, $offset);
if (null === $tmpNewsCollection) {
return null;
} else {
// all news as an array
$allNews = $tmpNewsCollection->GetModels();
// init counters
$countLimit = 0;
$countSkipped = 0;
// create new NewsArray for the wanted news (without the skipped ones)
$wantedNews = array();
// and fill it
foreach($allNews as $aNews) {
// we need no more news when the $limit is reached
$isWanted = ($countLimit < $limit);
if (($isWanted) and ($aNews->featured)) {
$countSkipped = $countSkipped + 1;
// add this news only if we've skipped enough news
$isWanted = ($countSkipped > $newsList->skipHighlighted);
}
if ($isWanted) {
$countLimit = $countLimit + 1;
// add the current news into the array
$wantedNews[] = $aNews;
}
}
return new \Model\Collection($wantedNews, 'tl_dummy');
}
} // skipHighlight > 0
} // FetchItemsSkipHighlight
}
Der Rest ist dann Contao-Logik drumherum. Klasse registrieren, Hook registrieren, Feld im NewsList-Modul einfügen etc. pp.
Meinen gewünschten Effekt erziele ich jetzt mit 2 Listen - eine mit X hervorgehobenen News, und dann eine zweite mit X hervorgehobenen übersprungen.
Hab mal alles in den Anhang gepackt. Wirklich veröffentlichen will ich das nicht unbedingt - zumindest es noch Probleme gibt, wenn man Y News pro Seite arbeitet - so werden nämlich auf jeder neuen Seite die ersten paar hervorgehobenen News aussortiert.
@dhe: Vielleicht kommst du damit auf den Trichter, wie du deine Variante lösen kannst. :)