Ergebnis 1 bis 19 von 19

Thema: Listentemplate: Datensätze einschränken

  1. #1
    Contao-Nutzer
    Registriert seit
    05.01.2014.
    Beiträge
    40

    Standard Listentemplate: Datensätze einschränken

    Hallo,

    ich möchte auf der linken Seite die neuesten Kommentare anzeigen und bin nun so weit, dass ich die Kommentare in der Darstellung habe, so wie ich es möchte. Nun geht es um das Einschränken der Kommentare.

    Nur die - z.B. 3 - neuesten Kommentare sollen in die Liste. Ich habe gesehen, dass es im Backend-Modul ein "Bedingung"-Feld gibt. Aber dort kann ich meine Bedingung wahrscheinlich nicht unterbringen (wäre so was wie "Top 3" nach dem SQL Select).

    Im Listentemplate über PHP zu filtern würde ich gerne vermeiden, da umständlich und imperformant.

    Weiß jemand Rat?

    Gruß!

    Torsten

  2. #2
    Alter Contao-Hase
    Registriert seit
    20.03.2010.
    Ort
    Hannover
    Beiträge
    1.041

    Standard

    Hat die Lösung von Samson nicht geholfen?
    https://community.contao.org/de/show...late-erstellen

  3. #3
    Contao-Nutzer
    Registriert seit
    05.01.2014.
    Beiträge
    40

    Standard Hat geholfen. Und ich habe mich sehr darüber gefreut,...

    ... aber er filtert im Template. Das will ich nicht (siehe Post).

    Mein Template sieht aktuell übrigens so aus:

    PHP-Code:
    <div class="<?= $this->class ?> comments_last listing block"<?= $this->cssID ?><?php if ($this->style): ?> style="<?= $this->style ?>"<?php endif; ?>>

      <?php if ($this->headline): ?>
        <<?= $this->hl ?>><?= $this->headline ?></<?= $this->hl ?>>
      <?php endif; ?>
      
      <?php foreach ($this->tbody as $key=>$value): ?>
          <?php if($value['published']['content'] == 1): ?>
              <?php
                  
    /* show only first 100 characters of comment wihthout enclosing <p></p> */
                  
    $commentShort str_replace("</p>","",str_replace("<p>","",substr($value['comment']['content'], 0100)));
                  
                  if (
    strlen($commentShort) > 10)
                  {
                    
    $commentShort $commentShort "...";
                }
            
    ?>
              <p class="article">Zu: <a href="{{news_url::<?php echo $value['parent']['raw']; ?>}}">{{news_title::<?php echo $value['parent']['raw']; ?>}}</a></p>
              <p class="comment">"<?= $commentShort ?>"</p>
            <p class="author"><?= $value['name']['content'];?><?php echo $this->parseDate("d.m H:i"$value['date']['raw']);?></p>
          <?php endif; ?>
      <?php endforeach; ?>

    </div>
    Gruß!

    P.S.: Wenn nichts hilft, bräuchte ich wohl sowas (ist leider noch nicht verfügbar): https://www.fast-end-media.de/produk...ual-templates/
    Geändert von Feraud (28.03.2016 um 21:46 Uhr)

  4. #4
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Standard

    Bei der Bedingung im Auflistungsmodul kannst du schon ein bißchen SQL eintragen. LIMIT 0,3 würde es bei dir wohl heißen.

    Gesendet von meinem C6603 mit Tapatalk
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  5. #5
    Contao-Nutzer
    Registriert seit
    05.01.2014.
    Beiträge
    40

    Standard

    Hallo Frank, hallo Samuell,

    @Frank: Limit kann ich im Feld Bedingung nicht verwenden. Das ist ausschließlich für die Where-Klausel da. Contao produziert mir so ein SQL:

    SELECT COUNT(*) AS count FROM tl_comments WHERE (LIMIT 0,1)

    Ich sortiere jetzt nach Id (aufsteigend, da absteigend im Backend ja nicht festgelegt werden kann), drehe die Reihenfolge dann im Array um und breche die Schleife ab, so wie du es vorgeschlagen hast. Unschön, aber zu mehr reichen meine Kenntnisse hier nicht aus.

    Php sieht jetzt so aus:

    PHP-Code:
    <div class="<?= $this->class ?> comments_last listing block"<?= $this->cssID ?><?php if ($this->style): ?> style="<?= $this->style ?>"<?php endif; ?>>

        <?php if ($this->headline): ?>
            <<?= $this->hl ?>><?= $this->headline ?></<?= $this->hl ?>>
        <?php endif; ?>
      
          <?php 
              $orderedValues 
    array_reverse($this->tbodytrue);
              
              foreach (
    $orderedValues as $value):
                  
    $counter++;
                  
    /* Show first 3 comments only */
                  
    if($counter 3) break;
                  
                  if(
    $value['published']['content'] == 1):
                          
    /* show only first 100 characters of comment wihthout enclosing <p></p> */
                          
    $commentShort str_replace("</p>","",str_replace("<p>","",substr($value['comment']['content'], 0100)));                      
                          if (
    strlen($commentShort) > 10)
                          {
                            
    $commentShort $commentShort "...";
                        }
        
    ?>
              <p class="article">Zu: <a href="{{news_url::<?php echo $value['parent']['raw']; ?>}}">{{news_title::<?php echo $value['parent']['raw']; ?>}}</a></p>
              <p class="comment">"<?= $commentShort ?>"</p>
            <p class="author"><?= $value['name']['content'];?><?php echo $this->parseDate("d.m H:i"$value['date']['raw']);?></p>
          <?php 
                  
    endif;             
               endforeach; 
          
    ?>

    </div>
    Danke für die Hilfe und Gruß!

  6. #6
    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

    Schreibe in die Bedingung noch rein "published = 1".

    Setze "Elemente pro Seite" einfach auf die Anzahl der Datensätze, welche du ausgeben möchtest und entferne im Template dann das HTML für die Pagination und Einträge pro Seite.
    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

  7. #7
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Standard

    Zitat Zitat von Andreas Beitrag anzeigen
    Schreibe in die Bedingung noch rein "published = 1".

    Setze "Elemente pro Seite" einfach auf die Anzahl der Datensätze, welche du ausgeben möchtest und entferne im Template dann das HTML für die Pagination und Einträge pro Seite.
    published und das Zählen der Einträge kann ich mir ja dann auch im Template sparen...
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  8. #8
    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

    Zitat Zitat von Samson1964 Beitrag anzeigen
    published und das Zählen der Einträge kann ich mir ja dann auch im Template sparen...
    Ja, genau
    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

  9. #9
    Contao-Nutzer
    Registriert seit
    05.01.2014.
    Beiträge
    40

    Standard

    @Andreas

    Die Published Bedingung habe ich im Backend definiert, wo sie einfacher änderbar wäre als im PHP.

    Gute Idee mit dem Ausschalten der Pagination. Wäre wahrscheinlich weniger Aufwand gewesen, wobei ich trotzdem noch die Kommentare hätte sortieren müssen, damit die 3 neuesten Kommentare angezeigt werden. Das "Grundübel", dass alle Datensätze aus der Comment-Tabelle geladen werden, bleibt aber auch bei deinem Vorschlag bestehen, oder? Falls ja, bleibe ich für diesen Anwendungsfalls bei Franks Lösung, weil ich die einfach schon habe.

    @Frank: Freut mich, dass für dich auch noch was abgefallen ist

    Danke und Gruß!

  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

    Zitat Zitat von Feraud Beitrag anzeigen
    wobei ich trotzdem noch die Kommentare hätte sortieren müssen
    Nein, die sind ja bereits mit date DESC richtig sortiert, sodass bei einer Ausgabe von 3 comments die drei neuesten ausgegeben werden. Das hatte doch hier irgendjemand gezeigt, oder war das in dem anderen Thread?
    Soll sich die Aktualität auf das nachträgliche Bearbeiten im BE beziehen, dann musst du tstamp DESC sortieren.

    Zitat Zitat von Feraud Beitrag anzeigen
    ...dass alle Datensätze aus der Comment-Tabelle geladen werden, bleibt aber auch bei deinem Vorschlag bestehen, oder?
    Nein, in den Template-Variablen sind dann nur z.B. die 3 Datensätze vorhanden. Die anderen würden erst nachgeladen werden über die Pagination oder über Ergebnisse pro Seite.
    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-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Feraud Beitrag anzeigen
    Das "Grundübel", dass alle Datensätze aus der Comment-Tabelle geladen werden, bleibt aber auch bei deinem Vorschlag bestehen, oder?
    Mit dem setzen des Wertes "Elemente pro Seite" werden auch nur diese Anzahl an Datensätze geladen. Die Pagination arbeitet dann mit einem Offset, der dann auf der jeweiligen Seite nur wieder die Anzahl der Datensätze läd, die für die Seite benötigt werden.
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

  12. #12
    Contao-Nutzer
    Registriert seit
    05.01.2014.
    Beiträge
    40

    Standard

    @Urzeit-Eichhörnchen: Sehr gut! Dann werde ich mir doch die Zeit nehmen, um diese Lösung zu implementieren.

    Gruß!
    Geändert von Feraud (30.03.2016 um 20:49 Uhr)

  13. #13
    Contao-Nutzer
    Registriert seit
    05.01.2014.
    Beiträge
    40

    Standard

    @Urzeit-Hörnchen: That rocks!

    Und ganz toll: man kann im Backend bei "Sortieren nach" auch die Sortierreihenfolge festlegen. Z.B. "Id desc".

    Die Lösung sieht nun so aus:

    PHP-Code:
    <div class="<?= $this->class ?> ce_table listing block"<?= $this->cssID ?><?php if ($this->style): ?> style="<?= $this->style ?>"<?php endif; ?>>

        <?php if ($this->headline): ?>
            <<?= $this->hl ?>><?= $this->headline ?></<?= $this->hl ?>>
        <?php endif; ?>
      
        <?php          
            
    foreach ($this->tbody as $comment):             
                  if(
    $comment['published']['content'] == 1):
                          
    /* show only first 100 characters of comment wihthout enclosing <p></p> */
                          
    $commenthort str_replace("</p>","",str_replace("<p>","",substr($comment['comment']['content'], 0100)));                      
                          if (
    strlen($commenthort) > 10)
                          {
                            
    $commenthort $commenthort "...";
                        }
        
    ?>
            <p class="article">Zu: <a href="{{news_url::<?php echo $comment['parent']['raw']; ?>}}">{{news_title::<?php echo $comment['parent']['raw']; ?>}}</a></p>
            <p class="comment">"<?= $commenthort ?>"</p>
            <p class="author"><?= $comment['name']['content'];?><?php echo $this->parseDate("d.m H:i"$comment['date']['raw']);?></p>
        <?php 
                
    endif;             
            endforeach; 
        
    ?>

    </div>
    Gruß!

  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

    Mit "Id desc" meinst du wahrscheinlich "id DESC".

    Und die Bedingung mit dem published gehört auch nicht ins Template, sie kommt in die Moduleinstellungen. Andernfalls kannst du dich nicht auf die gewünschte Anzahl der auszugebenden Datensätze verlassen.

    (Habe dein Template jetzt nicht auf weitere Fehler überprüft.)
    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
    Registriert seit
    05.01.2014.
    Beiträge
    40

    Standard

    @Andreas: Gut gesehen, dass das "If" weg soll, danke!

    Damit wäre ich dann wunschlos glücklich.

    Kleine Frage am Rande: Was hat es in dem Moduleinstellungen mit dem "Individuellen Template" auf sich und welches "Standard-Template" wird denn standardmäßig genommen, wenn ich nichts eigenes auswähle?

    Gruß!

  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

    Zitat Zitat von Feraud Beitrag anzeigen
    Was hat es in dem Moduleinstellungen mit dem "Individuellen Template" auf sich und welches "Standard-Template" wird denn standardmäßig genommen, wenn ich nichts eigenes auswähle?
    Siehe hier https://github.com/contao/core/issues/8297

    Du kannst dein Template noch besser machen. Benutze die Contao Methoden, wenn es geht.

    1.
    Z.B. um ein Datum zu parsen - \Date::parse(...)
    https://github.com/contao/core/issues/8297

    2.
    Um Texte zu kürzen \StringUtil::substr($comment['comment']['content'], 100)
    https://github.com/contao/core/blob/...ngUtil.php#L29
    https://github.com/contao/core/blob/...ngUtil.php#L91

    3.
    Hole die zugehörige News als Model, dann hast du $myNews->title, $myNews->url usw. als Variablen zur Verfügung. Hintergrund: Benutze keine Insert-Tags in Templates.
    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
    Registriert seit
    05.01.2014.
    Beiträge
    40

    Standard

    Hallo Andreas,

    danke für deine Verbesserungsvorschläge. Inbesondere das mit den Models finde ich gut. Ich habe das ausprobiert und funktioniert so weit auch. Lediglich das Url-Property ist bei mir leer. Auch in der Datenbanktabelle steht nichts in dieser Spalte.

    Nach ein bisschen googeln habe ich die methode generateFrontendUrl gefunden. Die gibt mir aber nur einen Teil der Url aus. Nämlich "index.php/Zinseszins.html". Besser wäre "index.php/Blog/Zinseszins.html". Hat wohl damit zu tun, dass es sich hier um einen Newsbeitrag handelt und nicht um einen Artikel, oder?

    Gibt es dennoch eine Möglichkeit, die Url unter Verwendung von Models zu erzeugen?

    Momentan sieht das Php-Template so aus:

    PHP-Code:
    <div class="<?= $this->class ?> ce_table listing block"<?= $this->cssID ?><?php if ($this->style): ?> style="<?= $this->style ?>"<?php endif; ?>>

        <?php if ($this->headline): ?>
            <<?= $this->hl ?>><?= $this->headline ?></<?= $this->hl ?>>
        <?php endif; ?>
      
        <?php          
            
    foreach ($this->tbody as $comment):
            
                  
    $commenthort StringUtil::substr($comment['comment']['content'], 100);        
                    
    $news = \NewsModel::findByPk($comment['parent']['raw']);

                           
    /* Wert: index.php/Zinseszins.html */
                   
    $strUrl = \Controller::generateFrontendUrl($news->row());
        
    ?>
            <p class="headline">Zu: <a href="<?= $strUrl ?>"><?= $news->headline ?></a></p>
        
            <p class="article">Zu: <a href="{{news_url::<?php echo $comment['parent']['raw']; ?>}}">{{news_title::<?php echo $comment['parent']['raw']; ?>}}</a></p>
            <p class="comment">"<?= $commenthort ?>"</p>
            <p class="author"><?= $comment['name']['content'];?><?= $this->parseDate("d.m H:i"$comment['date']['raw']);?></p>
        <?php         
            
    endforeach; 
        
    ?>

    </div>
    Gruß und danke!
    Geändert von Feraud (02.04.2016 um 09:13 Uhr)

  18. #18
    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

    Stimmt, wenn url kein Feld von tl_news ist, dann kannst du damit auch nichts holen. Die URL herauszufinden ist evtl. etwas schwierig https://github.com/contao/core/blob/....php#L555-L562

    Deswegen würde ich dafür das hier benutzen.
    PHP-Code:
    <?= $this->replaceInsertTags('{{news_url::'.$myNews->id.'}}'?>
    <!-- oder -->
    <?= \Controller::replaceInsertTags('{{news_url::'.$myNews->id.'}}'?>
    Wenn du solche URLs hast "index.php/Blog/Zinseszins.html", dann solltest du im ROOT noch die .htaccess und in den Einstellungen die URL-Umschreibung aktivieren.
    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

  19. #19
    Contao-Nutzer
    Registriert seit
    05.01.2014.
    Beiträge
    40

    Standard

    Hi Andreas,

    ok, ich habe die von dir angebotene Alternative genommen und sie funktioniert.

    Ja, das mit der Url-Umschreibung habe ich noch auf dem Schirm. Muss mal schauen, wie das im IIS geht. Ich hoste nämlich unter Windows und bin eigentlich auch gar kein php-Mensch. Aber Contao an sich finde ich schon gut, und ich lerne ja gerne dazu.

    Gruß und noch mal Danke!

    Torsten

    Und fürs Protokoll:

    PHP-Code:
    <div class="<?= $this->class ?> ce_table listing block"<?= $this->cssID ?><?php if ($this->style): ?> style="<?= $this->style ?>"<?php endif; ?>>

        <?php if ($this->headline): ?>
            <<?= $this->hl ?>><?= $this->headline ?></<?= $this->hl ?>>
        <?php endif; ?>
      
        <?php          
            
    foreach ($this->tbody as $comment):             
                  
    /* show only first 100 characters of comment wihthout enclosing <p></p> */
                  
    $commenthort StringUtil::substr($comment['comment']['content'], 100);
                  
                  
    /* $commenthort = str_replace("</p>","",str_replace("<p>","",substr($comment['comment']['content'], 0, 100)));                   
                  if (strlen($comment['comment']['content']) > 100)
                  {
                    $commenthort = $commenthort . "...";
                }
                */
                
            
    $news = \NewsModel::findByPk($comment['parent']['raw']);
            
    $strUrl = \Controller::replaceInsertTags('{{news_url::'.$news->id.'}}');
        
    ?>

            <p class="article">Zu: <a href="<?= $strUrl ?>"><?= $news->headline ?></a></p>
            <p class="comment">"<?= $commenthort ?>"</p>
            <p class="author"><?= $comment['name']['content'];?><?= $this->parseDate("d.m H:i"$comment['date']['raw']);?></p>
        <?php         
            
    endforeach; 
        
    ?>

    </div>

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
  •