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);
}
}
Mit der Nutzung unserer Dienste erklären Sie sich damit einverstanden, dass wir Cookies verwenden.
Datenschutzerklärung
Alexander Naumov
Contao Freelancer, PHP Entwickler und Web Allrounder