Einzelnen Beitrag anzeigen

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