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: (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. 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);