Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] Pagination "berechnen" (https://www.delphipraxis.net/68900-%5Bphp%5D-pagination-berechnen.html)

Matze 7. Mai 2006 21:37


[PHP] Pagination "berechnen"
 
Moin Moin :hi:

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

nat 8. Mai 2006 00:10

Re: [PHP] Pagination "berechnen"
 
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();
   }
?>

Matze 8. Mai 2006 12:12

Re: [PHP] Pagination "berechnen"
 
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. :)

Brainstalker 8. Mai 2006 12:37

Re: [PHP] Pagination "berechnen"
 
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.

S2B 8. Mai 2006 13:21

Re: [PHP] Pagination "berechnen"
 
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. :cyclops:

Matze 8. Mai 2006 13:56

Re: [PHP] Pagination "berechnen"
 
Hi Simon,

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

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:58 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