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);

    }

}
Zurück