AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[PHP] Pagination "berechnen"

Ein Thema von Matze · begonnen am 7. Mai 2006 · letzter Beitrag vom 8. Mai 2006
Antwort Antwort
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

[PHP] Pagination "berechnen"

  Alt 7. Mai 2006, 21:37
Moin Moin

Ich versuche gerade verzweifelt eine Pagination (also so Seitenzahlen) einzurichten, doch vergebens. Mein Problem it, dass ich nicht alle Seitenzahlen anzeigen lassen kann, da in der Datenbank hunderte Einträge enthalten sein können (protokollierte auftretende Fehler, das kann also, wenn man im Admin-Panel nicht ständig nach den neuen Fehlern guckt, eine ganz schön große Tabelle geben *g*).

Nun möchte ich es so haben, dass man etwas erhält wie folgend beschrieben (Die eckigen Klammern symbolisieren die aktuelle Seite).

4 Seiten:
1, 2, [3], 4

mehr als 7 Seiten:
1, 2, ..., 5, [6], 7
1, [2], 3, ..., 8, 9
1, 2, ..., 8, [9], 10, ..., 13, 14

Was ich verdeutlichen möchte ist, dass es zig Kombinationen gibt, die '...' anzuordnen und nicht weiß, wie ich diese berechnen soll. Ich dachte an diese "Regel" (bei mehr als 7 Seiten), dass generell die ersten beiden Seitenzahlen (1, 2) und die letzten beiden angezeigt werden. Des weiteren sollte die Seitenahl je vor und nach der aktuellen sichtbar sein.

Den phpBB-Code habe ich auch schon angesehen, doch verstehe ich nicht so ganz.

Versucht habe ich es so in der Art, doch da müsste ich ja sehr viele Fälle überprüfen, was keine schöne Lösung ist:

Code:
[color=#FFA800]/**
* generates a pagination
*/[/color]
[color=#2E7917]function[/color] [color=#180F94]generate_pagination[/color]([color=#180F94]$current_page[/color], [color=#180F94]$entry_count[/color],
   [color=#180F94]$item_count_per_page[/color], [color=#180F94]$url_without_pagenum[/color])
{
   [color=#2E7917]global[/color] [color=#180F94]$template[/color];
   [color=#2E7917]global[/color] [color=#180F94]$lang[/color];

   [color=#180F94]$page_count[/color] = [color=#180F94]ceil[/color]([color=#180F94]$entry_count[/color] / [color=#180F94]$item_count_per_page[/color]);

   [color=#FFA800]// generates the pagination array[/color]
   [color=#2E7917]if[/color] ([color=#180F94]$page_count[/color] > 5 && [color=#180F94]$current_page[/color] != 1 && [color=#180F94]$current_page[/color] != 2
      && [color=#180F94]$current_page[/color] != 3 && [color=#180F94]$current_page[/color] != [color=#180F94]$page_count[/color] - 1
      && [color=#180F94]$current_page[/color] != [color=#180F94]$pagecount[/color] && [color=#180F94]$current_page[/color] != [color=#180F94]$page_count[/color] - 2)
   {
      [color=#180F94]$arr_pagination[/color] = [color=#2E7917]array[/color](1, 2, [color=#E40808]'...'[/color], [color=#180F94]$current_page[/color], [color=#E40808]'...'[/color],
         [color=#180F94]$page_count[/color] - 1, [color=#180F94]$page_count[/color]);
   }
   [color=#2E7917]else if[/color] ([color=#180F94]$page_count[/color] > 5 && [color=#180F94]$current_page[/color] == 3)
   {
      [color=#180F94]$arr_pagination[/color] = [color=#2E7917]array[/color](1, 2, 3, [color=#E40808]'...'[/color], [color=#180F94]$page_count[/color] - 1,
         [color=#180F94]$page_count[/color]);
   }
   [color=#2E7917]else[/color]
   {
      [color=#180F94]$arr_pagination[/color] = [color=#2E7917]array[/color]();
      [color=#2E7917]for[/color] ([color=#180F94]$i[/color] = 1; [color=#180F94]$i[/color] < [color=#180F94]$page_count[/color]; [color=#180F94]$i++[/color])
      {
         [color=#180F94]$arr_pagination[/color][] = [color=#180F94]$i[/color];
      }
   }

   [color=#FFA800]// generates the output[/color]
   [color=#2E7917]foreach[/color] ([color=#180F94]$arr_pagination as $page_num[/color])
   {
      [color=#180F94]$template[/color]->[color=#180F94]set_block[/color]([color=#E40808]'pagination'[/color]);

      [color=#FFA800]// only link page numbers and not '...'[/color]
      [color=#2E7917]if[/color] ([color=#180F94]$page_num[/color] != [color=#E40808]'...'[/color] && [color=#180F94]$page_num[/color] != [color=#180F94]$current_page[/color])
      {
         [color=#180F94]$page_num_link[/color] = [color=#180F94]$url_without_pagenum[/color] . [color=#E40808]'&amp;pagenum='[/color] .
            [color=#180F94]$page_num[/color];

         [color=#180F94]$template[/color]->[color=#180F94]set_block[/color]([color=#E40808]'pagination.switch_link'[/color], [color=#2E7917]array[/color](
            [color=#E40808]'PAGE_NUM'[/color] => [color=#180F94]$page_num[/color],
            [color=#E40808]'U_PAGE_NUM'[/color] => [color=#180F94]$page_num_link[/color]
            )
         );
      }
      [color=#2E7917]else[/color]
      {
         [color=#2E7917]if[/color] ([color=#180F94]$page_num[/color] == [color=#180F94]$current_page[/color])
         {
            [color=#180F94]$css_page_num[/color] = [color=#E40808]' underline'[/color];
         }
         [color=#2E7917]else[/color]
         {
            [color=#180F94]$css_page_num[/color] = [color=#E40808]''[/color];
         }

         [color=#180F94]$template[/color]->[color=#180F94]set_block[/color]([color=#E40808]'pagination.switch_no_link'[/color], [color=#2E7917]array[/color](
            [color=#E40808]'PAGE_NUM'[/color] => [color=#180F94]$page_num[/color],
            [color=#E40808]'CSS_PAGE_NUM'[/color] => [color=#180F94]$css_page_num[/color]
            )
         );
      }
   }

   [color=#180F94]$page_status[/color] = [color=#180F94]sprintf[/color]([color=#180F94]$lang[/color][[color=#E40808]'pagination_status'[/color]], [color=#180F94]$current_page[/color],
      [color=#180F94]$page_count[/color]);

   [color=#180F94]$template[/color]->[color=#180F94]set_var[/color]([color=#E40808]'PAGE_STATUS'[/color], [color=#180F94]$page_status[/color]);
   [color=#180F94]$template[/color]->[color=#180F94]add_filename[/color]([color=#E40808]'PAGINATION'[/color], [color=#E40808]'pagination.tpl'[/color]);

   [color=#2E7917]return true[/color];      
}

Ich hoffe, ich habe das nicht um sonst so gehighlighted *hechel* ^^


Edits: Highlight-Fehler korrigiert
  Mit Zitat antworten Zitat
nat

Registriert seit: 10. Nov 2005
216 Beiträge
 
RAD-Studio 2009 Pro
 
#2

Re: [PHP] Pagination "berechnen"

  Alt 8. Mai 2006, 00:10
hi.
hab mir deinen source jetzt nicht angeguckt, aber hab ma n beispiel eben schnell hingeklatscht.
könnte man noch n bisserl optimieren und "aufräumen" aber so vom prinzip her sollte das funzen.
hoffe das hilft dir weiter...

Code:
<?php
   $currpage = empty($_GET['page']) ? 1 : (int)$_GET['page'];
   $count = 12;
   
   function EchoLink($page, $sep=true)
   {
      global $currpage;
      if($currpage == $page) echo "[$page]";
      else echo " [url='$PHP_SELF?page=$page']$page[/url]";
      
      if($sep) echo ', ';
   }
   
   function EchoBackLink()
   {
      global $currpage;
      $page = $currpage-1;
      if($page > 0)
         echo "[url='$PHP_SELF?page=$page']<=[/url]";
   }
   
   function EchoNextLink()
   {
      global $currpage, $count;
      $page = $currpage+1;
      if($page <= $count)
         echo "[url='$PHP_SELF?page=$page']=>[/url]";
   }   
   
   if($count <= 7)
      for($i=1; $i<=$count; $i++)
         EchoLink($i, $i!=$count);
   else
   {
      EchoBackLink();
      
      $idx = (($currpage==4) || ($currpage==5)) ? $currpage : 3;      
      for($i=1; $i<=$idx; $i++)
         EchoLink($i, $i!=$idx);
      
      
      if(($currpage > 5) && ($currpage < $count-4))
      {         
         echo "...";
         for($i=$currpage-1; $i<=$currpage+1; $i++)
            EchoLink($i, $i!=$currpage+1);                  
      }

      echo "...";      
                  
      
      $idx = $count-2;
      if(($currpage == $count-3) ||($currpage == $count-4))
         $idx = $currpage;
      
      for($i=$idx; $i<=$count; $i++)
         EchoLink($i, $i!=$count);                  
         
     EchoNextLink();
   }
?>
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: [PHP] Pagination "berechnen"

  Alt 8. Mai 2006, 12:12
Hi,

danke, das entspricht zwar nicht meinen Erwartungen, da z.B. bei gewählter Seite 3 der Link zur 4. Seite nicht vorhanden ist, aber ich werde da mal etwas rumprobieren.
  Mit Zitat antworten Zitat
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#4

Re: [PHP] Pagination "berechnen"

  Alt 8. Mai 2006, 12:37
Eigentlich müssen dafür doch nicht viele Überprüfungen vorgenommen werden.
Ich würde folgendermaßen vorgehen:
Links für 1 und 2 erstellen
Links für letzte und vorletzte Seite
Links für CurrentSite-1, CurrentSite, CrurrentSite+1

Wenn die CurrentSite >= 5 ist dann gibst du nen ... nach Seite 2 aus.
Wenn die CurrentSite <= LetzteSeite-4 ist dann gibst du vor der vorletzen Seite ... aus.

Soweit müsste das dann alles sein.
Du musst halt nur noch überprüfen ob anzahl Seiten <= 7 ist denn dann kannst du gleich alle Seiten ausgeben.
Ich hoffe das hilft ein bisschen, hab im moment leider keine Zeit bissl Code zu schreiben.
Michael N.
Brainstalker
  Mit Zitat antworten Zitat
Benutzerbild von S2B
S2B

Registriert seit: 1. Feb 2004
Ort: Aachen
1.268 Beiträge
 
#5

Re: [PHP] Pagination "berechnen"

  Alt 8. Mai 2006, 13:21
Mal wieder. *g*

Code:
//
// Generates the pagination
//
function prepare_pagination($item_count, $per_page, $page_now, $action)
{
   global $root_path;

   if ($item_count == 0)
   {
      return '';
   }

   $action = $action2 = $root_path . $action;
   $action2 .= (strpos($action2, '?') !== false) ? '&amp;' : '?';

   $page_count = ceil($item_count / $per_page);

   if ($page_count == 1)
   {
      return "Seite $page_now von $page_count";
   }
   else
   {
      // Which numbers should be shown?
      if ($page_count <= 5)
      {
         $showed_numbers = range(1, $page_count);
      }
      else if ($page_now == 1 || $page_now == $page_count)
      {
         $showed_numbers = array(1, 2, $page_count - 1, $page_count);
      }
      else
      {
         $showed_numbers = array(1, 2, $page_now - 1, $page_now, $page_now + 1, $page_count - 1, $page_count);
         $showed_numbers = array_unique($showed_numbers);
      }

      // generate pagination
      $pagination = '';
      $last_number = 0;
      foreach ($showed_numbers as $number)
      {
         if (($last_number + 1) < $number)
         {
            $pagination .= ' ... ';
         }
         else
         {
            $pagination .= ($pagination != '') ? ', ' : '';
         }

         $this_action = ($number != 1) ? $action2 . "page=$number" : $action;
         $pagination .= ($page_now != $number) ? '[url="' . $this_action . '"]' . $number . '[/url]' : $number;

         $last_number = $number;
      }

      // add "<" and ">" to browse faster ;-)
      if ($page_now != 1)
      {
         $this_action = ($page_now != 2) ? $action2 . 'page=' . ($page_now - 1) : $action;
         $pagination = '[url="' . $this_action . '"]&lt;[/url] ' . $pagination;
      }

      if ($page_now != $page_count)
      {
         $pagination .= ' [url="' . $action2 . 'page=' . ($page_now + 1) . '"]&gt;[/url]';
      }

      return "Seite $page_now von $page_count: $pagination";
   }
}
Deine Funktion ist um einiges umständlicher als meine, deswegen ausnahmsweise mal C&P.
Simon Praetorius
Gruß
S2B
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: [PHP] Pagination "berechnen"

  Alt 8. Mai 2006, 13:56
Hi Simon,

das ist eine saubere Lösung und sie funktioniert fehlerfrei, dankeschön.

Btw: C&P kann ich bei meiner Seitenstruktur gar nicht anwenden, aber so nach 25 Min umschreiben und verunstalten läuft's nun.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz