Ergebnis 1 bis 18 von 18

Thema: Nachrichtenliste: Zuerst 4 "hervorgehobene" und dann den Rest

  1. #1
    Contao-Nutzer Avatar von Gausi
    Registriert seit
    04.09.2009.
    Beiträge
    149

    Standard 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?
    Geändert von Gausi (10.06.2016 um 09:15 Uhr)
    All of this has happened before - but the question remains: Does all of this have to happen again?

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.126
    Partner-ID
    10107

    Standard

    Da musst du dir vermutlich selbst etwas programmieren (lassen). Denn von Haus aus hat man ja nur die Möglichkeit eine Nachricht als hervorgehoben zu markieren oder nicht hervorgehoben. Du brauchst aber 3 States: "Hervorgehoben groß", "Hervorgehoben klein", "Nicht hervorgehoben".

    Oder du arbeitest einfach mit mehreren Archiven. Ein Archiv für "Hervorgehoben groß", ein Archiv für den Rest. Auf deiner Seite bindest du dann ein Modul ein, wo du aus dem Archiv "Hervorgehoben groß" die ersten x Nachrichten anzeigen lässt (alle, egal ob hervorgehoben oder nicht). Dann bindest du ein weiteres Modul ein, wo du aus dem anderen Archiv (oder allen restlichen Archiven) nur die ersten y hervorgehobenen Nachrichten anzeigen. Dann bindest du ein weiteres Modul ein, wo du aus dem anderen Archiv (oder allen restlichen Archiven) nur die nicht hervorgehobenen Nachrichten anzeigen lässt.

    Oder du verwendest die Erweiterung [news_categories] und steuerst die Ausgabe (ebenso mit 3 Modulen) stattdessen über Kategorien.

  3. #3
    Contao-Nutzer Avatar von Gausi
    Registriert seit
    04.09.2009.
    Beiträge
    149

    Standard

    Ist zwar nicht die Antwort, die ich hören wollte, aber danke trotzdem.

    Wenn ich das richtig überblicke, müsste ich mir dafür aber nur ein erweitertes Nachrichtenlisten-Modul schreiben, das die Funktion "X Hervorgehobene Beiträge überspringen" kennt. Drei Kategorien brauche ich eigentlich nicht. Denn in dem zweiten Teil soll keine Unterscheidung mehr zwischen Hervorgehoben und Nicht-Hervorgehoben gemacht werden.

    Muss ich mich mal reinfuxen, wie man das einfach (und halbwegs updatesicher) hinbekommen kann.
    All of this has happened before - but the question remains: Does all of this have to happen again?

  4. #4
    Contao-Fan Avatar von fusch
    Registriert seit
    25.03.2012.
    Ort
    München
    Beiträge
    498
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Hallo,
    schau mal hier:
    https://community.contao.org/de/show...uot-CSS-Klasse
    Mit der Templateanpassung kannst Du eine Klasse vergeben.
    Dann sollte es möglich sein die ersten vier über die Klasse und die Pseudo-Klasse :nth-of-type zu stylen, oder?
    Gruß
    Hella
    Mitglied des Contao User Treffen München
    Aktuelle Termine erfährst Du immer unter www.contao-bayern.de
    Komm' doch mal vorbei!

  5. #5
    Contao-Nutzer Avatar von Gausi
    Registriert seit
    04.09.2009.
    Beiträge
    149

    Standard

    Das hilft mir nicht weiter. "Featured" habe ich schon gefunden, ebenso die fortlaufende Nummerierung der News. Vielleicht mal als Beispiel, was ich erreichen möchte:

    In dem/den Nachrichtenarchiven sind - nach Datum sortiert - folgende Nachrichten drin (* bedeutet: Hervorgehoben)

    News 1
    * News 2
    * News 3
    News 4
    * News 5
    * News 6
    News 7
    * News 8

    Ausgabe soll so aussehen (fett bedeutet größeres Bild, Schrift, mehr Text, was auch immer)

    * News 2
    * News 3
    * News 5
    * News 6

    News 1
    News 4
    News 7
    * News 8
    All of this has happened before - but the question remains: Does all of this have to happen again?

  6. #6
    Contao-Nutzer Avatar von marq
    Registriert seit
    20.03.2010.
    Ort
    Göttingen
    Beiträge
    195
    User beschenken
    Wunschliste

    Standard

    Hi,
    so wie du das jetzt am Ende beschreibst - brauchst du doch nur zwei Ausgabe-Module angelegen. Einmal Nachrichtenliste mit nur hervorgehobene Beiträge und das zweite Ausgabemodul halt ohne hervorgehobene Beiträge. Platzierst die untereinander - und fertig.

  7. #7
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.126
    Partner-ID
    10107

    Standard

    Zitat Zitat von marq Beitrag anzeigen
    Hi,
    so wie du das jetzt am Ende beschreibst - brauchst du doch nur zwei Ausgabe-Module angelegen. Einmal Nachrichtenliste mit nur hervorgehobene Beiträge und das zweite Ausgabemodul halt ohne hervorgehobene Beiträge. Platzierst die untereinander - und fertig.
    Nein, dann würden News 2, News 3, News 5 und News 6 doppelt angezeigt werden.

  8. #8
    Contao-Fan Avatar von fusch
    Registriert seit
    25.03.2012.
    Ort
    München
    Beiträge
    498
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Löst das Dein Problem?
    http://codepen.io/hellschu/pen/xOZwBe
    Mitglied des Contao User Treffen München
    Aktuelle Termine erfährst Du immer unter www.contao-bayern.de
    Komm' doch mal vorbei!

  9. #9
    Contao-Nutzer Avatar von Gausi
    Registriert seit
    04.09.2009.
    Beiträge
    149

    Standard

    @Spooky. Entwder so, oder #8 würde fehlen.

    @fusch: Ja, das sieht sehr gut aus, auch wenn ich die Lösung per Script irgendwie unsauber finde....

    Danke für die rege Beteiligung - hätte ich ehrlich gesagt nicht erwartet. Jetzt habe ich auf jeden Fall ein paar mehr Denkansätze, wie ich das mal mittelfristig angehen kann. Top-Priorität hat das nämlich nicht, wäre nur ein Nice-To-have.
    All of this has happened before - but the question remains: Does all of this have to happen again?

  10. #10
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Es gibt da auch einen HOOK, den du benutzen kannst. newsListFetchItems. Er wird aufgerufen, wenn die Newslist die News holt. Er liefert dir eine Model-Collection, aus dieser kannst du die ersten 4 featured rausschmeißen und die Collection dann wieder zurück geben. Erfordert allerdings einiges an Entwickler KnowHow.
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  11. #11
    Contao-Nutzer Avatar von Gausi
    Registriert seit
    04.09.2009.
    Beiträge
    149

    Standard

    Das hört sich sehr gut an. Danke für den Namen des Hooks - denn den hätte ich wohl beim Suchen in meiner 3.4-Installation nicht gefunden (den gibt es wohl erst seit 3.5).

    Dann werde ich das mal zum Anlass nehmen, und das bislang aufgeschobene Upgrade auf die aktuelle LTS vornehmen.
    All of this has happened before - but the question remains: Does all of this have to happen again?

  12. #12
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Ja, der ist relativ neu. Update? Ja, gute Idee
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  13. #13
    Contao-Fan Avatar von dhe
    Registriert seit
    25.10.2010.
    Ort
    Esslingen a.N.
    Beiträge
    657

    Standard

    Hey, hast du inzwischen eine Lösung gefunden?
    ich stehe auch vor dem Problem, dass ich hervorgehobene Beiträge priorisiert ausgeben will / soll.

    Bsp: Startseite mit einem Nachrichtenliste-Modul, das die letzten 5 Nachrichten ausgeben soll. Hervorgehobene Beiträge sollen auf jeden Fall gezeigt werden, wenn weniger als 5 wird mit "normalen" News aufgefüllt...

    Hat jemand eine Idee?

    Mfg

  14. #14
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    In #10 steht eine Lösung.

    Eine Erweiterung kenne ich dafür nicht.

    Du kannst auch versuchen 2 Listen auszugeben, eine nur mit Featured zeige 5, und eine ohne Featured zeige 5. Dann die Featured in einer globalen Variable zählen und die Liste ohne F. im Template anpassen.
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  15. #15
    Contao-Nutzer Avatar von Gausi
    Registriert seit
    04.09.2009.
    Beiträge
    149

    Standard

    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?
    All of this has happened before - but the question remains: Does all of this have to happen again?

  16. #16
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Leider kenne ich mich mit dem Handling von solchen ModelCollections nicht aus, d.h. sortieren, rausschmeißen, zusammenfügen ...

    Wenn das mal jemand erklären könnte, dann wäre es einfach.

    Entweder du holst dann einfach alle News mit $blnFeatured=null
    Code:
    NewsModel 1
    NewsModel 2 *
    NewsModel 3 *
    NewsModel 4
    NewsModel 5 *
    NewsModel 6 *
    NewsModel 7
    NewsModel 8 *
    Und sotierst dann um nach
    Code:
    NewsModel 2 *
    NewsModel 3 *
    NewsModel 5 *
    NewsModel 6 *
    NewsModel 1
    NewsModel 4
    NewsModel 7
    NewsModel 8 *
    Oder du erzeugst eine Collection mit $blnFeatured=null und $limit=4
    Code:
    NewsModel 2 *
    NewsModel 3 *
    NewsModel 5 *
    NewsModel 6 *
    Und eine mit $blnFeatured=null wo du diejenigen, welche du in der ersten Collection schon hast, rausschmeißt.
    Code:
    NewsModel 1
    NewsModel 4
    NewsModel 7
    NewsModel 8 *
    Dann die beiden Collections fürs Return mergen.

    Wenn man diese Collections wie Arrays behandeln könnte, dann wüsste ich wie das geht. Aber das geht mit diesen Collections bestimmt auch, ich weiß nur nicht wie. Vielleicht habe ich da auch nur zu viel Respeckt vor und man kann einfach mit foreach-Schleifen über die Collections laufen.
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  17. #17
    Contao-Nutzer Avatar von Gausi
    Registriert seit
    04.09.2009.
    Beiträge
    149

    Standard

    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.
    Angehängte Dateien Angehängte Dateien
    All of this has happened before - but the question remains: Does all of this have to happen again?

  18. #18
    Contao-Fan Avatar von Kopfnuss
    Registriert seit
    05.09.2012.
    Ort
    Zwickau
    Beiträge
    324
    Partner-ID
    11375
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Hey Danke Gausi.

    Ich habe dein Skript etwas abgewandelt das jetzt "Hervorgehobenen Element überspringen" nicht überspringt sondern das es die Anzahl an Elementen angibt die ganz vorn stehen sollen und der Rest wird mit normalen Elementen aufgefüllt.
    Also wenn man bei "Gesamtzahl der Beiträge" 10 einstellt und bei "Hervorgehobenen Element überspringen" 2. Dann stehen die zwei hervorgehoben ganz vorn in der Liste und die restlichen 8 werden mit den normalen Elementen aufgefüllt.

    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
            {
                
    // get all the news
                
    $tmpNewsCollection = \NewsModel::findPublishedByPids($newsArchives$blnFeatured$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
                    
    $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)) {
                            
    // get all featured news till countLimit is reached
                            
    $countLimit $countLimit 1;
                            
    $wantedNews[] = $aNews;
                        }

                        
                    }
                    foreach(
    $allNews as $aNews) {    
                        
    // we need no more news when the limit is reached
                        
    $isWanted = ($countLimit $limit);

                        if ((
    $isWanted) and !($aNews->featured)) {
                            
    // get normal news if countLimit is not reached
                            
    $countLimit $countLimit 1;
                            
    $wantedNews[] = $aNews;
                        }

                        
                    }
                    return new \
    Model\Collection($wantedNews'tl_dummy');
                }
            } 
    // skipHighlight > 0    
        
    // FetchItemsSkipHighlight        


Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •