Joomla! Pagination funktioniert nicht mehr
Das Problem
Auf bestimmten Seiten wird unten eine Pagination eingeblendet, z.B. in Beitragsblogs mit vielen Artikeln, aber auch im Forum in der Beitragsübersicht, in der Downloadkomponente, wenn in einer Download-Kategorie sehr viele Downloads enthalten sind, in Visforms in der Datenansicht, usw.
Hat man sich mit Hilfe der Pagination ein mal von der 1. Seite entfernt, ist es nicht mehr möglich zu dieser Zurückzukehren. Während alle anderen Seiten beim Klick auf die jeweilige Seitenzahl korrekt angezeigt werden, tut sich beim Klick auf die 1 absolut nichts.
Während die Pagination bei Joomla! Komponenten funktioniert, tritt das Problem im Moment bei sehr vielen Thirdparty-Komponenten auf. Das Problem tritt nur auf, wenn die Suchmaschinenfreundlichen URL's angeschaltet sind, d.h. in der Joomla! Administration gibt es keine Probleme.
Die Ursache
Bislang wurde immer dann, wenn man die Pagination benutzt hat, an die SEF-URL ein Parameter angehängt, der angibt, welches der erste angezeigt Datensatz sein soll. Bei höheren Seiten lautete dieser Parameter ?start=20
(oder eine andere Zahl) bei der ersten Seite lautete er &limitstart=0
.
Mit dem Update zur Version 3.3.4 hat Joomla! die Schnittstelle zur Pagination im Model (library/legacy/model/legacy.php) dahingehend geändert, dass der URL Parameter jetzt für die erste Seite nicht mehr angehängt wird. Betroffen ist die Funktion _getListCount
.
Dies hat zur Folge, dass ohne zusätzliche Maßnahmen die Information, dass mit dem 1. Datensatz begonnen werden soll, nicht vorhanden ist und die erste Seite nicht aufgerufen weden kann.
Die Lösung
Die, aufgrund der geänderten Schnittstelle, fehlende Information muss vom Entwickler der Joomla! Erweiterung zur Verfügung gestellt werden. Dies kann sehr einfach im Model der Komponente erfolgen und zwar in der Funktion populateState
über den folgenden Code.
protected function populateState($ordering = 'ordering', $direction = 'ASC') { $app = JFactory::getApplication(); $value = $app->input->get('limit', $app->get('list_limit', 0), 'uint'); $this->setState('list.limit', $value); $value = $app->input->get('limitstart', 0, 'uint'); $this->setState('list.start', $value); }