Systém novinek v PHP a MySQL - stránkování

Dnes jsem provedl úpravu v mém systému novinek v PHP a MySQL.

Celá úprava v podstatě spočívá jen v tom, že jsem upravil zobrazování seznamu novinek v administrační části tak, aby se seznam rozděloval na stránky po deseti záznamech. Hodnotu počtu záznamů na stránku je možné změnit v souboru dbconnect.php, kde je na to definována konstanta PAGELIMIT.

Zajímavý na celé změně může být snad jen kód, který jsem použil pro zobrazení stránkovače. Rozhodl jsem se, že budu zobrazovat maximálně pět odkazů na jednotlivé stránky, přičemž když bude stránek víc, tak se na začátku (případně na konci) stránkovače zobrazí tři tečky. Aktuální stránka bude vždy (mimo případů ze začátku a z konce) zobrazena uprostřed stránkovače.

Nebudu zde opisovat celý kód, ale spíše jen teorii. Kdo bude mít zájem, může si projekt stáhnout a podívat se do zdrojů.

Nejdřív je potřeba si spočítat počet záznamů v tabulce novinek. Toho lze dosáhnout například následujícím SQL dotazem:

SELECT
Count(id) as Pocet
FROM bb_news;

Aktuální číslo stránky, která má být zobrazena si předáme v URL v parametru page. Ten pak vyčteme z proměnné $_GET. Pro stránkovač je nutné vědět, na kolik stránek budeme stránkovat (tedy počet stránek). Ten vypočítáme tak, že vezmeme podíl počtu všech záznamů a počtu záznamů na jednu stránku (viz konstanta PAGELIMIT):

//vypocitam pocet vsech stran
$pocetstran = ceil($pocetvsechzaznamu/PAGELIMIT);

Pak je třeba ošetřit parametr zadané stránky:

//test cisla strany
if ($strana <= 0):
  //kdyz je mensi nebo rovno nule, nastavim prvni stranu
  $strana = 1;
else:
  if ($strana>$pocetstran):
    //kdyz je vetsi nez pocet stran, nastavim posledni stranu
    $strana = $pocetstran;
  endif;
endif;

Pak je potřeba vypočítat číslo stránky, kterým bude stránkovač začínat a kterým bude končit:

//vypocet cisla stranky, kterym bude strankovac zacinat
if ($strana>3):
  //pokud je stranka vetsi nez 3
  if (($strana + 2) >= $pocetstran):
    //pokud je stranka + 2 vetsi nebo rovna poctu stran
    //je pocatecni hodnota rovna poctu stran minus 4
    $start = $pocetstran — 4;
  else:
  //jinak je pocatecni hodnota rovna stranka minus 2
    $start = $strana — 2;
  endif;
else:
  //neni vetsi ney 3, pocatek je 1
  $start = 1;
endif;
//osetreni na nulu
if ($start<=0): $start=1; endif;

//vypocet cisla stranky, kterym bude strankovac koncit
//vzdy budou zobrazeny odkazy na maximalne 5 stranek
$cil = $start + 4;
//osetreni preteceni posledniho cisla stranky
if ($cil > $pocetstran): $cil = $pocetstran; endif;

Pak už jen v jednoduchém cyklu FOR od proměnné $start do proměnné $cil provedeme naplnění textového řetězce s odkazy na stránky, přičemž v případě, že se jedná o zvolenou stránku místo odkazu zabalíme číslo stránky do tagu STRONG:

//prirazeni retezce pro strankovac
$pager = ”;
for ($i=$start; $i<=$cil;$i++):
  if ($i<>$strana):
  //stranky ktere nejsou zvolenou strankou
    $pager.="<a href=\"?page=" . $i . "\">" . $i . "</a>";
  else:
  //zvolena stranka
    $pager.="<strong>" . $i . "</strong>";
  endif;
  //pokud nejsem na konci cyklu, pridam oddelovac
  if ($i<$cil):
    $pager.=" | ";
  endif;
endfor;

No a nakonec ještě přidám tečky na začátek a konec:

//pridani tecek na zacatek a konec strankovace, pokud je vic jak 5 stranek celkem
if ($pocetstran > 5):
  //pokud je aktualni stranka vetsi nez tri, znamena to, ze zacatek je nad jednickou
  //a musim tedy zobrazit tecky na zacatku
  if ($strana > 3):
    $pager="<a href=\"?page=" . ($start — 1) . "\">...</a> " . $pager;
  endif;

  //pokud je rozdil poctu stran a aktualni strany vetsi nez 2, znamena to, ze do konce je vic
  //nez 2 stranky a musim zobrazit tecky na konci
  if (($pocetstran — $strana) > 2):
    $pager=$pager . " <a href=\"?page=" . ($cil + 1) . "\">...</a>";
  endif;
endif; //pocetstran > 5

Přeskočit na obsah