Zum Inhalt

Pagination

Mit der Pagination können Sie große Listen von Items (Tabelleneinträge, News-Beiträge, Artikel-Reviews) auf mehrere Seiten aufteilen, durch die der Betrachter blättern kann. Dabei können ihm Einstellungen zur Seitengröße und zur Sortierung angeboten werden. Alle festgelegten Einstellungen werden in der Admin-SESSION festgehalten.

Die Pagination kann auf zwei verschiedene Arten verwendet werden:

  • Sie übergeben der Pagination ein fertiges Array als Eingabe. Dieses wird sortiert und der momentan anzuzeigende Bereich wird ausgeschnitten.
  • Sie übergeben der Pagination die Gesamtanzahl der Einträge als Eingabe. Das Paginations-Objekt liefert dann lediglich anhand der gewählten Optionen eine SQL LIMIT- und eine ORDER BY-Klausel, die Sie in Ihre eigene SQL-Abfrage einbauen können.

Dateien der Pagination

Datei Funktion
includes/src/Pagination/Pagination.php Paginations-Klasse
admin/templates/bootstrap/tpl_inc/pagination.tpl Template-Datei für das Backend
templates/NOVA/snippets/pagination.tpl Template-Datei für das Frontend (NOVA-Template)

Quick-Start

Erzeugen Sie eine Instanz der Pagination. Weisen Sie der neuen Pagination einen ID-String zu, mit dem diese Pagination und ihre in der SESSION gespeicherten Einstellungen von anderen Instanzen unterschieden werden können.

$oPaginationStandard = new Pagination('standard');

Übergeben Sie der Pagination ein Array aller Items, durch die geblättert werden soll: |br| (Für Daten-Listen, die sich rein aus Datenbankabfragen erzeugen lassen, siehe: Eigene SQL-Abfrage.)

$oPaginationStandard = (new Pagination('standard'))
    ->setItemArray($oKuponStandard_arr)
    ->setSortByOptions([
        ['cName', 'Name'],
        ['cCode', 'Code'],
        ['nVerwendungenBisher', 'Verwendungen'],
        ['dLastUse', 'Zuletzt verwendet']
    ]);

Wie hier zu sehen ist, sind alle Methoden der Pagination chainable. |br| Zum Schluss stellen Sie die Pagination mit assemble() fertig:

$oPaginationStandard = (new Pagination('standard'))
    ->setItemArray($oKuponStandard_arr)
    ->setSortByOptions([
        ['cName', 'Name'],
        ['cCode', 'Code'],
        ['nVerwendungenBisher', 'Verwendungen'],
        ['dLastUse', 'Zuletzt verwendet']
    ])
    ->assemble();

Important

Danach sollten keine Setter mehr aufgerufen werden!

Übergeben Sie nun das Paginations-Objekt an Smarty.

$smarty->assign('oPaginationStandard', $oPaginationStandard);

Die Einträge der momentan gewählten Blätter-Seite erhalten Sie durch $oPaginationStandard->getPageItems(). Durch diese Liste können Sie dann entsprechend iterieren und die darin enthaltenen Elemente im Frontend ausgeben.

{foreach $oPaginationStandard->getPageItems() as $oKupon}
    ...
{/foreach}

Einbindung der Templates

Die Templates enthalten die Seitennavigation und die Kontrollelemente zum Sortieren und Einstellen der Seitengröße. Es gibt zwei getrennte Templates für das Backend und für das Frontend.

Backend

{include file='tpl_inc/pagination.tpl'
    oPagination=$oPagination
    cParam_arr=['tab'=>$tab]
    cAnchor=$tab}

Parameter

Parameter Verwendung
oPagination das Paginations-Objekt
cParam_arr (optional) assoziatives Array von GET-Parametern, welche von der Pagination beim Seitenblättern oder Ändern von Optionen mit durchgereicht werden sollen
cAnchor (optional) ein zusätzlicher Ziel-Anker, der mit an die URL angehängt wird (Form: #foobar)

Frontend

{include file='snippets/pagination.tpl'
    oPagination=$oPagination
    cParam_arr=['tab'=>$tab]
    cThisUrl='/target/path'
    cParam_arr=['key1' => 'val1', 'key2' => 'val2', ...]
    parts=['pagi', 'label']}

Parameter

Parameter Verwendung
oPagination das Pagination-Objekt
cParam_arr (optional) siehe oben (Backend)
cThisUrl (optional) eigener Pfad der einbindenden Seite
parts (optional)

Mit diesem Parameter kann die Anzeige auf einzelne Komponenten des Templates eingeschränkt werden. Übergeben Sie hier eine Liste von Komponenten-Bezeichnern:

  • label Label für die Anzahl der Einträge
  • pagi Seitennavigation
  • count Selectbox für Einträge pro Seite
  • sort Selectbox für die Sortierung

Methoden des Paginations-Objekts

Methode Funktion
setRange($nRange)

Da bei sehr großen Listen auch große Seitenzahlen entstehen können, die die Navigation zu lang werden lassen, werden Auslassungspunkte (...) eingefügt. Auf der linken und rechten Seite vom gerade aktiven Seitenlink werden dann jeweils maximal $nRange benachbarte Seitenlinks angezeigt.

setItemsPerPageOptions($nItemsPerPageOption_arr)

Legt die Auswahloptionen für "Einträge pro Seite" fest. Diese werden in einer Selectbox zur Auswahl angeboten.

Beispiel: [5, 10, 20, 50]

setSortByOptions($cSortByOption_arr)

Legt die Auswahloptionen für die Sortierung fest. Jede Auswahloption ist ein Paar aus der Tabellenspalte (dem Property, nach dem sortiert wird) und einer zugehörigen Beschriftung. Diese werden in einer Selectbox jeweils für aufsteigende und absteigende Reihenfolge zur Auswahl angeboten.

Beispiel:

[
    ['cName', 'Name'],
    ['cCode', 'Code'],
    ['nVerwendungenBisher', 'Verwendungen'],
    ['dLastUse', 'Zuletzt verwendet']
]
setItemArray($oItem_arr) Legt das gesamte Array aller Items fest (erste Verwendungsmethode)
setItemCount($nItemCount) Legt die gesamte Anzahl der Items fest (erste Verwendungsmethode)
setDefaultItemsPerPage($n) Setzt die Standard-Seitengröße (Items pro Seite)
setItemsPerPage($nItemsPerPage)

Übergeht die gewählte Option für "Einträge pro Seite" und legt diese auf den Wert $nItemsPerPage fest. Dies ist nützlich, wenn Sie keine Auswahlmöglichkeiten anbieten möchten, sondern einen festen Wert vorgeben wollen.

.. _label_sql_optimized_pagination:

Eigene SQL-Abfrage

Oft müssen größere Datenmengen direkt aus der Datenbank dargestellt werden. Für diesen Zweck existiert eine weitere Verwendungsmöglichkeit, bei der dem Paginations-Objekt lediglich die Gesamtanzahl der anzuzeigenden Elemente übergeben wird (mittels setItemCount()).

$oPagination->setItemCount(
    Shop::Container()->getDB()->query(
        'SELECT count(*) AS count FROM tkunden',
        ReturnType::SINGLE_OBJECT
    )->count);

Das Paginations-Objekt ermittelt nun den Ausschnitt der Datenmenge, die der Benutzer beim Blättern angezeigt bekommt. Anschließend liest das Paginations-Object nur noch diesen "Datenbereich" aus der Datenbank, was die Mengen an Daten, die übertragen werden müssen, erheblich reduziert.

Nach der Fertigstellung mit assemble() können Sie dann die gewünschten SQL-Klauseln für LIMIT, und bei Bedarf auch für ORDER, vom Paginations-Objekt abrufen (mittels getLimitSQL() und getOrderSQL()).

Diese SQL-Klauseln können Sie dann in einer eigenen SQL-Abfrage verwenden:

.. code-block:: php :emphasize-lines: 4

$pageOfData = Shop::Container()->getDB()->queryPrepared(
    'SELECT * FROM tredirect LIMIT :limitation ORDER BY :sorting',
    [
        'limitation' => $oPagination->getLimitSQL(),
        'sorting'    => $oPagination->getOrderSQL()
    ],
    ReturnType::ARRAY_OF_OBJECTS);

Abschließend übergeben Sie dann wieder das Paginations-Objekt an Smarty:

$smarty->assign('pageOfData', $pageOfData);