IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Paginace (stránkovanie) v PHP

V dnešnom tutoriále sa naučíme v PHP riešiť veľmi častou úlohu, ktorou je tzv. Paginace (stránkovania). Jedná sa o stránkovanie výpisu nejakých položiek, ktoré by malo byť prítomných asi takmer všade. Keď aplikáciu vytvoríme, je v nej len niekoľko užívateľov, článkov, automobilov ... Po rokoch používania tam však môžu byť tisíce položiek a sťahovanie toľkých dát z databázy a ich výpis na jedinú stránku zbytočne zaťažuje server a spomaľuje prehliadač klienta. Alternatívou k paginaci je donačítávání nových položiek Ajaxu vo chvíli, keď doscrollujeme na koniec dokumentu. To si ukážeme v ďalších dieloch.

Tutoriál budem písať pre zjednodušenie neobjektové. Tí, ktorí objekty ešte nevie, ho aspoň budú vedieť použiť a tí, ktorí ich vedia, si ho do objektov prevedú behom pár minút.

Pre namotivovaní si ukážme screenshot výslednej aplikácie:

Paginace v PHP - Ostatné tutoriály v PHP

Databázy

Aby mala aplikácie zmysel, nevyhneme sa databázu. Vytvorme si nejakú jednoduchú MySQL databázu (napr. Automobilka, porovnávanie utf8_czech_ci).

Vytvorenie databázy pre paginaci v PHP - Ostatné tutoriály v PHP

V databáze vytvoríme tabuľku automobily. Tabuľka bude mať nasledujúce stĺpce:

  • automobil_id (int, autoincrement, primárny kľúč)
  • znacka (varchar 20)
  • spz (varchar 10)
  • farba (varchar 20)
  • vyrobené (date)
Vytvorenie tabuľky pre paginaci v PHP - Ostatné tutoriály v PHP

Dáta

Než sa pustíme do samotnej paginace, mali by sme mať pripravené dáta, ktorá budeme zobrazovať. Samozrejme nebudeme ručne naklikávat 1000 testovacích automobilov, ale necháme si ich vygenerovať. V našom prípade to bude celkom jednoduché, pre zložitejšie generovanie dát môžete využiť Generátor testovacích dát.

Pre prácu s databázou budeme používať miestne databázový wrapper, ktorý je k stiahnutiu v podobe súboru Db.php v prílohe článku Prvý databázová tabuľka a MySQL ovládače v PHP. Pre náš projekt si vytvorte nejakú zložku a súbor Db.php do nej nakopírujte. Ďalej vytvorte súbor instalace.php, ktorý bude mať za úlohu vložiť do databázy testovacej automobily.

Najprv sa pripojíme k databáze a vytvoríme si pole so zásobou značiek áut a farieb, aby sme mali z čoho generovať:

require_once('Db.php');
Db::connect('localhost', 'automobilka', 'root', '');
mb_internal_encoding("UTF-8");

$znacky = array('Škoda', 'BMW', 'Audi', 'Volvo', 'Opel', 'Renault', 'Hyundai', 'Seat', 'Jaguar', 'Alfa Romeo');
$barvy = array('červená', 'černá', 'bílá', 'zelená', 'modrá', 'stříbrná metalíza', 'oranžová', 'fialová', 'žlutá');

Na generovanie náhodné ŠPZ v tvare AAA-0000, kde A je znak od 0 do Z a 0 je znak od 0 do 9, vytvoríme jednoduchú funkciu:

function generujSpz()
{
    $znaky = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    $spz = '';
    // První 3 znaky
    for ($i = 0; $i < 3; $i++)
    {
        $spz .= $znaky[rand(0, mb_strlen($znaky) - 1)];
    }
    // Pomlčka
    $spz .= '-';
    // Poslední 4 čísla
    for ($i = 0; $i < 4; $i++)
    {
        $spz .= rand(0, 9);
    }
    return $spz;
}

Generovanie náhodného dáta je jednoduché. Čísla dní budeme generovať len do 28, aby sme nemuseli riešiť koľko má mesiac dní.

function generujDatum()
{
    return rand(1990, 2014) . '-' . rand(1, 12) . '-' . rand(1, 28);
}

Nakoniec si necháme vygenerovať 1000 náhodných áut a tá uložíme do databázy:

for ($i = 0; $i < 1000; $i++)
{
    $automobil = array(
        'znacka' => $znacky[array_rand($znacky)],
        'spz' => generujSpz(),
        'barva' => $barvy[array_rand($barvy)],
        'vyrobeno' => generujDatum(),
    );
    Db::insert('automobil', $automobil);
}

echo('Hotovo.');

Je dobré podotknúť, že nie je kvôli výkonu úplne dobrý nápad volať databázový dotaz v cykle. Mali by sme zostaviť 1 INSERT s viacerými položkami a ten potom na databázu spustiť. U nás to pri faktu, že skript spúšťame iba raz, nijako nevadí. Skript spustíme v prehliadači.

výsledok:

Testovacie dáta k paginaci - Ostatné tutoriály v PHP

Helper

Zobrazenie lištičky pre prepínanie stránok nie je tak triviálna záležitosť, ako by sa mohlo zdať. Sémanticky by mala byť líštička v HTML reprezentovaná elementom
  • U prvého obrázku vidíme, že sa nachádzame na prvej stránke. Vľavo je už teda len neaktívne šípka, vpravo sú odkazy na 5 ďalších stránok, potom bodky a posledná strana. Lišta končí šípkou s odkazom na ďalšiu stranu.
  • Druhý obrázok znázorňuje situáciu, kedy má výpis len jednu stanu.
  • Tretí obrázok ukazuje orezanie polomere vypisovaných stránok okolo aktuálnej stránky. Zľava sa vypíšu len 2, sprava zas 5 a posledná strana.
  • Štvrtý obrázok je variant 1.
  • Piaty obrázok zobrazuje kompletnú polomer okolo aktuálnej strany.

 

Všetky články v sekcii
Ostatné tutoriály v PHP
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity