Contao Pagination implementieren
Frontend Modul erweitern
Für eine Pagination müssen wir unser tl_module Data Container Array anpassen. Wir benötigen ein perPage Feld. Da dieses Feld bereits existiert brauchen wir es nur unserer Palette hinzuzufügen.
Das Core tl_module bietet uns bereits viele Felder. Es lohnt sich ein Blick drauf zuwerfen.
Erweiterte Palette
<?php
$GLOBALS['TL_DCA']['tl_module']['palettes']['demo_listeansicht'] = '{title_legend},name,headline,type,perPage;';
Compile Methode anpassen
Als nächstes müssen wir unsere compile Methode anpassen. Dazu benötigen wir folgende Schritte:
- Wir laden alle unsere Datensätze aus der Datenbank.
- Wir legen drei neue Variablen an ($total, $limit, $offset)
- Wir erzeugen das Pagination Template
- Wir parsen jeden einzelnen Element und fügen es dem Template hinzu.
Code Snippet
<?php
use Contao\Model;
use Contao\Config;
use Contao\FrontendTemplate;
use Contao\Input;
use Contao\Pagination;
class ModuleDemoListenansicht extends Module{
protected $strTemplate = 'mod_demo_listenansicht';
public function generate()
{
return parent::generate();
}
/**
* compile Methode
*/
protected function compile()
{
global $objPage;
$strResults = '';
// vorausgesetzt wir haben ein template 'teaser_demo.xhtml | teaser_demo.html5'
$objTemplate = new FrontendTemplate('demo_teaser');
// Daten aus der Datenbank laden
$demoListDB = $this->Database->prepare('SELECT * FROM tl_demo')->execute();
$rows = array();
while($demoListDB->next())
{
$rows[] = $demoListDB->row();
}
$total = count($rows);
$limit = $total;
$offset = 0;
// Pagination Template generieren
if ($this->perPage > 0) {
$id = 'page_e' . $this->id;
$page = (Input::get($id) !== null) ? Input::get($id) : 1;
if ($page < 1 || $page > max(ceil($total / $this->perPage), 1)) {
$objHandler = new $GLOBALS['TL_PTY']['error_404']();
$objHandler->generate($objPage->id);
}
$offset = ($page - 1) * $this->perPage;
$limit = min($this->perPage + $offset, $total);
$objPagination = new Pagination($total, $this->perPage, Config::get('maxPaginationLinks'), $id);
$this->Template->pagination = $objPagination->generate("\n ");
}
/**
* Hier werden die einzelne Elemente gerendert und dem Template hinzugefügt.
*/
for ($i = $offset; $i < $limit; $i++)
{
$item = $rows[$i];
$objTemplate->setData($item);
$strResults .= $objTemplate->parse();
}
$this->Template->results = ($total < 1 ? '<p>Keine Elemente gefunden</p>' : $strResults);
}
}
Der Schutz Ihrer persönlichen Daten ist uns ein wichtiges Anliegen. Auf dieser Website werden keine Cookies eingesetzt und es findet keinerlei Tracking oder Analyse Ihres Nutzerverhaltens statt. Es werden keine personenbezogenen Daten erhoben, verarbeitet oder gespeichert. Ihre Nutzung unserer Website erfolgt somit vollständig anonym.
Datenschutzerklärung
