Ergebnis 1 bis 3 von 3

Thema: Anleitung zur Pagination

  1. #1
    Contao-Nutzer
    Registriert seit
    04.08.2011.
    Beiträge
    15

    Standard Anleitung zur Pagination

    Hallo,

    im Rahmen eines Projektes wird ein selbst erstelltes Anzeige-Modul verwendet, um mehrere hundert "gemischte" Datensätze zu präsentieren. Gemischt heißt hier: Auch z.B. extern (nicht in der DB) abgelegte Bilder werden angezeigt.

    Diese Menge Datensätze auf einer Seite ist aber unübersichtlich - also die so oft beschworene "Pagination" verwenden.

    Nachdem ich nun "Listing", "NewsReader" und "GoogleMaps" eingehend studiert habe, verstehe ich in diese Richtung aber garnichts mehr. Auch ein paar Experimente waren erfolglos. Gibt es irgendwo oder von irgendwem eine einfaches Beispiel, welches die Pagination erklärt? Wenn nein, könnte irgendwer in folgendem trivialen Code (hat nichts mit dem tatsächlichen Modul zu tun - nur zum Verständnis) die benötigten Änderungen eintragen?

    Im Modul:
    Code:
    ...
    // Fetch data 
    	$resultMem = $this->Database->prepare("SELECT firstname, lastname FROM tl_member")
          ->execute();
    ...
    // Build array
    	while ($resultMem->next())
    	{
    		$arrMem[] = array
    		(
    			'fn' => $resultMem->firstname,
    			'ln' => $resultMem->lastname,
    		);
    	}
    ...
    // Assign data to the template
      $this->Template->mem = $arrMem;
    ...
    Im Template:
    Code:
    <div>
      <table border="0" cellpadding="1">
      <?php foreach ($this->mem as $mem): ?>
        <tr>
          <td><?php echo 'Name'; ?></td>
          <td><?php echo $mem['fn']; echo $mem['ln']; ?></td>      
        </tr>
    <?php endforeach; ?>
    </table>
    </div>

    Ich weiß inzwischen, daß ich im Modul (theoretisch) folgenden Code benötige:
    Code:
    ...
    $per_page = 10;  // oder aus BE-Variable holen
    ...
    $objPagination = new Pagination($resultMem->count, $per_page);
    $this->Template->pagination = $objPagination->generate("\n  ");
    $this->Template->per_page = $per_page;
    ...
    und im Template zumindest folgende Zeile:
    Code:
    <?php echo $this->pagination; ?>

    Das kann aber doch nicht alles sein - denn sonst würde es ja funktionieren ...

    ... und bitte keine Kommentare wie "... dann nimm doch Listing ...". Dies ist keine Option!
    Geändert von ruebe1954 (02.05.2012 um 10:44 Uhr)

  2. #2
    Contao-Nutzer
    Registriert seit
    04.08.2011.
    Beiträge
    15

    Standard

    Nach mehreren Tagen der Suche und des Experimentierens mit zwei Mann hier nun das gefundene Ergebnis, so einfach wie möglich. Vielleicht kann es ja der Ein oder Andere auch gebrauchen...

    In das Modul muß jede Menge Code zusätzlich eingebaut werden. Dieses sieht es wie folgt aus:
    Code:
    ...
    // Pagination Grundelemente     
        $page = $this->Input->get('page') ? $this->Input->get('page') : 1;     // aktuelle Seite
        $perPage = 10;     // fix oder über $this->perPage aus dem BE holen                                      
        $offset = ($page - 1) * $perPage;     // wo soll mit dem Lesen der Daten angefangen werden
    ...		
    // Ermitteln der Gesamtzahl der Datensätze
        $result = $this->Database->prepare("SELECT COUNT(*) AS count FROM tl_member")
            ->execute();
    ...
    // Pagination Menu (muss irgendwo nach der Ermittlung der Anzahlsätze (COUNT) stehen)
        $objPagination = new Pagination($result->count, $perPage); 
        $this->Template->pagination = $objPagination->generate("\n  "); 
    ...         
    // Fetch data (in Abhängigkeit von $perPage)
        if ($perPage) 
        { 
           $result = $this->Database->execute("SELECT * FROM tl_member LIMIT ".$offset.",".$perPage);
        } 
        else 
        { 
           $result = $this->Database->execute("SELECT * FROM tl_member");
        } ...
    ...
    // Build array
    	while ($resultMem->next())
    	{
    		$arrMem[] = array
    		(
    			'fn' => $resultMem->firstname,
    			'ln' => $resultMem->lastname,
    		);
    	}
    ...
    // Assign data to the template
        $this->Template->mem = $arrMem;
    ...

    Im Template ist tatsächlich nur eine einzige Zeile zusätzlich notwendig:
    Code:
    <div>
      <table border="0" cellpadding="1">
      <?php foreach ($this->mem as $mem): ?>
        <tr>
          <td><?php echo 'Name'; ?></td>
          <td><?php echo $mem['fn']; echo $mem['ln']; ?></td>      
        </tr>
    <?php endforeach; ?>
    </table>
    <?php echo $this->pagination; ?>
    </div>

    Viel Spaß damit!

  3. #3
    Contao-Nutzer
    Registriert seit
    03.12.2014.
    Beiträge
    60

    Standard

    Ich hatte die Aufgabe, eine Pagination mit unterschiedlichen Inhaltselementen darstellen zu können und habe nichts richtig passendes gefunden. Aber dieser Post gab mir die richtige Idee und deshalb hier meine Lösung, damit es ggf. jemandem anderes hilft. Ich habe das über ein einfaches Artikel-Template gelöst. Die betreffenden Inhaltselemente in einen Artikel packen und diesen Code in ein Artikel-Template für den Artikel hinzufügen (anstelle der normalen Ausgabe der Elemente):

    PHP-Code:
    $db = \Database::getInstance();
    // Ermitteln der Gesamtzahl der Inhaltselemente im entsprechenden Artikel
        
    $resultObj $db->prepare("SELECT COUNT(*) AS count FROM tl_content 
                                 WHERE pid = ?
                                 ORDER BY sorting
                                  ;"
    )->execute($this->id);

    // Pagination Grundelemente     
        
    $page $this->Input->get('page') ? $this->Input->get('page') : 1;     // aktuelle Seite
        
    $perPage 5;     // fix, ggf. hier ändern.
        
    $offset = ($page 1) * $perPage;     // wo soll mit dem Lesen der Daten angefangen werden

    // Pagination Menu (muss irgendwo nach der Ermittlung der Anzahlsätze (COUNT von oben) stehen)
        
    $objPagination = new Pagination($resultObj->count$perPage); 
        
    $this->Template->pagination $objPagination->generate("\n  "); 

    // Inhaltsausgabe der Elemente
        
    for ($offset$offset <= ($page $perPage 1); $offset++) {
            
    print_r($this->elements[$offset]);
        }

    // Pagination Navigation
        
    echo $this->pagination

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •