Teaser für Top-Ten der neuesten Seiten in Typo3 einbinden

Wer eine Webseite betreibt und regelmäßig Artikel online stellt, der möchte dem Leser natürlich zeigen, dass die Webseite stets aktuell ist. Hier bietet es sich an, auf der Startseite eine Liste mit Links zu generieren, welche auf die zuletzt angelegten Seiten verweisen. Hier spricht man von einem so genannten Teaser, welcher dem Leser auf einen Blick verraten soll, welche Seiten zuletzt online gestellt wurden.

Typo3 - TopTen / Neueste Artikel / Teaser
Ein Teaser für die TopTen der neuesten Seiten / Artikel
informiert den Leser direkt über die aktuellsten Inhalte

 

Umgangssprachlich spricht man auch von "Neueste Artikel", "Letzte Seiten" oder "TopTen der aktuellsten Seiten". Letztendlich verfolgen alle Begriffe ein und dasselbe Ziel, nämlich den Leser auf die zuletzt angelegten Seiten aufmerksam zu machen.

 

In Typo3 gibt es zum heutigen Zeitpunkt keine richtige Extension, welche die zuletzt angelegten Seiten anzeigt. Zwar gibt es Extensions wie gst_topcontent, welche die Seiten anzeigt, dessen Inhaltselemente das letzte Mal modifiziert wurden. Dies hat aber zur Folge, dass immer wieder Seiten in den TopTen erscheinen, an denen man Änderungen vorgenommen hat.

 

Korrigiert man beispielsweise einen Rechtschreibfehler auf einer Seite, die man vor einigen Monaten angelegt hat, so erscheint diese Seite wieder in den "TopTen". Ursache dafür ist, dass sich die Extension auf die letzte Änderung in der Typo3-Tabelle tt_content und nicht in der Tabelle pages bezieht.

How-To TopTen der neuesten Seiten

Um nur die zuletzt angelegten Webseiten in Typo3 anzeigen zu lassen, kann mit einem kleinen PHP-Skript die entsprechenden Werte direkt aus der Datenbank lesen und die gewünschten Links generieren. Dazu legen wir zuerst eine PHP-Datei im fileadmin-Verzeichnis an. In diesem Beispiel lautet die Datei artikel-top5.php und befindet sich im Verzeichnis fileadmin/php-skripte. Der PHP-Code lautet wiefolgt:

 

<?php
    $sql = "    SELECT uid, title, crdate, hidden, doktype
                        FROM pages
                        WHERE hidden=0 AND doktype <=3
                        ORDER BY crdate DESC
                        LIMIT 10
                    ";

     $result = mysql_query($sql) OR die(mysql_error());
     $temp_platz = 1;
          while($row = mysql_fetch_assoc($result)) {
        
        echo '
        <div style="margin-bottom: 3px;">
        <a href="index.php?id='.$row['uid'].'" target="_self" class="box_re_topic">'.$row['title'].'</a><br>';
       
        echo 'Datum: '.date("d.m.Y", $row['crdate']).'</div>';
        }
?>

Erläuterung: Die Tabelle, in der die Werte für die einzelnen Seiten beinhaltet, lautet pages. Das PHP-Skript liest die UID (die eigentlich ID der Seite), TITLE (Seitentitel), CRDATE (das Erstellungsdatum der Seite), HIDDEN (Ist die Seite versteckt oder online?) und DOKTYPE (Standard, Erweitert, Nicht im Menü, usw) aus. Es werden nur Werte ausgelesen, die nicht versteckt (hidden = 0) und die vom Typ Standard (1), Erweitert (2) und Externe URL (3) sind. Alle anderen Typen wie Nicht im Menü, Abstand, etc. werden nicht angezeigt. Sortiert wird nach dem Erstellungsdatum der Seite (ORDER BY crdate) und maximal 10 Werte werden angezeigt (LIMIT 10). Die nächsten drei Zeilen führen den MySQL-Query aus. Anschließend wird der HTML-Code generiert.

Einbinden des PHP-Skripts in Typo3

Eigentlich sollte es ohne Probleme möglich sein, mittels des Include-Befehls das PHP-Skript in Typo3 einzubinden. Dazu legt man einen Marker im HTML-Template an und fügt folgenden Code in das TSetup ein:

    ArtikelTop5 = TEXT
    ArtikelTop5.value = <?php include ("fileadmin/php-skripte/artikel-top5.php"); ?>

Leider hat dies auf diesem hier benutzten System nicht funkioniert, so dass man sich eines Tricks behelfen musste. Es gibt bekanntlich die Extension "page_php_content", mit dessen Hilfe man PHP-Code direkt als Inhaltselement einbinden kann. Gibt man hier den Include-Befehl an, wird das PHP-Skript in die Typo3-Seite eingebunden:

Typo3 - TopTen / Neueste Artikel / Teaser

 Anschließend erscheinen die zuletzt angelegten Seiten auf der Typo3-Webseite. Natürlich kann man das Skript noch erweitern oder anpassen.

Diese Anleitung wurde mit einer Typo3 4.0, Apache 2, MySQL 5 Installation durchgeführt.

Update: Sprechende URLs einbinden

Die Funktionsweise dieses Skripts zeigt dem Leser die neuesten Seiten einer Webseite an. Eine wichtige Funktion fehlt aber: die Suchmaschinenoptimierung, da alle Links nach dem Prinzip https://www.pc-erfahrung.de/index.php?id=745 verlinkt werden. Das ist für Google & Co. nicht gerade förderlich.

Wer die Extension RealURL in Typo3 installiert, der kann mit folgender Code-Erweiterung den sprechenden URL-Pfad auslesen und anschließend einen suchmaschinenfreundlichen Link generieren:

$sql2 = mysql_query (" SELECT pagepath FROM tx_realurl_pathcache WHERE page_id=".$row['uid']." ") ;
$result2 = mysql_fetch_row($sql2);

echo '<div style="margin-bottom: 3px;"><a href="'.$result2['0'].'.html" target="_self" class="box_re_topic">'.$row['title'].'</a><br>';

Dieses PHP-Skript liest mithilfe der Seiten-ID den passenden Pfad aus der Tabelle tx_realurl_pathcache und generiert den passenden URL-Pfad. Die Links lauten nun beispielsweise www.pc-erfahrung.de/software/mysql-certification-study-guide/mysql-cma-kapitel-7.html

Hier das komplette Skript:

<?php

    $sql = "    SELECT uid, title, crdate, hidden, doktype
                        FROM pages
                        WHERE hidden=0 AND doktype <=3
                        ORDER BY crdate DESC
                        LIMIT 10
                    ";

     $result = mysql_query($sql) OR die(mysql_error());
     $temp_platz = 1;
          while($row = mysql_fetch_assoc($result)) {
       
     $sql2 = mysql_query (" SELECT pagepath FROM tx_realurl_pathcache WHERE page_id=".$row['uid']." ") ;
     $result2 = mysql_fetch_row($sql2);

        echo '<div style="margin-bottom: 3px;"><a href="'.$result2['0'].'.html" target="_self" class="box_re_topic">'.$row['title'].'</a><br>';
        echo 'Datum: '.date("d.m.Y", $row['crdate']).'</div>';
 
        }
?>