Hoe kan ik eenvoudig een paginanummering toevoegen aan mijn pagina's?

Trefwoorden: paginanummering, pagina, gegevens, usability, gebruiksvriendelijkheid

1. Inleiding


Je hebt je eerste gastenboek, nieuwsberichtensysteem et cetera geschreven en alles wordt mooi weergeven. Echter na een tijd begint je pagina onoverzichtelijk te ogen, daar alle berichten gewoon onder elkaar geplaatst worden. Je besluit je inhoud op te verdelen in pagina's. Veel mensen vinden het lastig om dit te bewerkstelligen, terwijl het in feite niet zo heel erg moeilijk is. In dit artikel leggen we uit hoe je op een zeer snelle wijze één grote pagina kan opdelen in verschillende kleinere, zonder fysiek voor elke pagina een nieuw bestand aan te maken. We gaan gebruik maken van één centrale klasse, welke je eenvoudig in meerdere toepassingen kan gebruiken.

Opmerking
Dit artikel is geschreven voor PHP versie 4!

2. Huidige pagina bepalen


Het allereerste wat we moeten doen, is bepalen welke pagina op het huidige moment weergeven wordt. Dit doen we door te controleren of de variabele pagina is opgegeven in de URL. Vanzelfsprekend kan je dit ook op een andere manier doen, je hoeft de code in dat geval enkel aan te passen. Controleren welke pagina weergeven wordt, hoeft niet veel werk te zijn. De onderstaande code volstaat reeds.

PHP
  1. <?php
  2.  
  3. // Nakijken of er in de URL een paginanummer is opgegeven.
  4. if(isset($_GET['pagina']))
  5. {
  6.        
  7.         // Pagina nummer werd opgegeven, dus vangen we dit op in een variabel.
  8.         $paginaNummer = $_GET['pagina'];
  9.        
  10.        
  11. }
  12. // Er werd geen paginanummer opgegeven...
  13. else
  14. {
  15.        
  16.         // ... dus zitten we op de allereerste pagina.
  17.         $paginaNummer = 1;
  18.        
  19. }
  20.  
  21. ?>


Deze code slaan we op als pagina.php. We gaan er van uit dat je de connectie met je database zelf nog legt.

3. Aantal records bepalen


Om te weten hoeveel pagina's we moeten weergeven, dienen we eerste te weten te komen hoeveel records we in onze database hebben zitten. We gaan uit van een situatie waarin we een tabel hebben met de naam tblRecords. Deze naam wordt gebruikt doorheen het hele artikel.

Om het aantal records te bepalen, volstaat het om een eenvoudige SELECT COUNT(*) uit te voeren.

PHP
  1. <?php
  2.  
  3.  
  4. $totaalAantalRecords = mysql_result(mysql_query("SELECT COUNT(*) AS aantalRecords FROM tblRecords"),0);
  5.  
  6. ?>


De variabele $totaalAantalRecords bevat nu het aantal records in onze tabel.

4. Klasse aanmaken



Nu we het aantal records in onze database kennen, kunnen we beginnen met het opstellen van onze klasse.

De basis van onze klasse ziet er als volgt uit:

PHP
  1. <?php
  2.  
  3. class PaginaNummering
  4. {
  5.        
  6.         var $totaalAantalRecords;
  7.         var $huidigePagina;
  8.         var $aantalRecordsPerPagina;
  9.        
  10.         function construct($totaalAantalRecords, $huidigePagina, $aantalRecordsPerPagina = 10)
  11.         {
  12.                
  13.                 $this->totaalAantalRecords = $totaalAantalRecords;
  14.                 $this->huidigePagina = $huidigePagina;
  15.                 $this->aantalRecordsPerPagina = $aantalRecordsPerPagina;
  16.                
  17.         }
  18.        
  19. }
  20.  
  21. ?>


Sla deze klasse op als paginaNummering.class.php.

De klasse is niet zo erg uitgebreid zoals je kan merken. Op dit moment bevat ze 3 variabelen $totaalAantalRecords, $huidigePagina en $aantalRecordsPerPagina en 1 methode construct() die fungeert als constructor en drie parameters rijk is. De eerste parameter, $totaalAantalRecords, kennen we reeds, net als de tweede $huidigePagina. De derde parameter, $aantalRecordsPerPagina, bevat het aantal items dat weergeven moet worden op elke pagina en wordt standaard geïnitialiseerd op 10. Indien je wenst, kan je dit verhogen of verlagen.

5. Aantal pagina's bepalen



Indien we het aantal pagina's willen bepalen, volstaat het om het totaal aantal records te delen door het aantal items op elke pagina. Beide zaken zijn reeds bekend, dus kunnen we er ook een methode voor schrijven.

PHP
  1. <?php
  2.  
  3. class PaginaNummering
  4. {
  5.        
  6.         var $totaalAantalRecords;
  7.         var $huidigePagina;
  8.         var $aantalRecordsPerPagina;
  9.        
  10.         /*
  11.         * Constructor
  12.         */
  13.         function construct($totaalAantalRecords, $huidigePagina, $aantalRecordsPerPagina = 10)
  14.         {
  15.                
  16.                 $this->totaalAantalRecords = $totaalAantalRecords;
  17.                 $this->huidigePagina = $huidigePagina;
  18.                 $this->aantalRecordsPerPagina = $aantalRecordsPerPagina;
  19.                
  20.         }
  21.        
  22.         /*
  23.         * Het aantal pagina's bepalen aan de hand van het totale aantal records en het aantal items per pagina.
  24.         */
  25.         function getAantalPaginas()
  26.         {
  27.                
  28.                 return ceil($this->totaalAantalRecords / $this->aantalRecordsPerPagina);
  29.                
  30.         }
  31.        
  32. }
  33.  
  34. ?>


Zoals je kan lezen, maken we gebruik van de functie ceil() om het bekomen getal af te ronden. Dit is nodig om te zorgen dat we alle records kunnen tonen. Stel dat je 55 records in je database hebt en je 10 records op elke pagina toont. Het resultaat van de deling zou 5,5 zijn. Door ceil() te gebruiken, zorgen we er voor dat we 6 pagina's kunnen opvragen, aangezien 5,5 onmogelijk is.

6. MySQL-query aanmaken


Nu we de huidige pagina, het aantal records in onze tabel en het aantal pagina's hebben, kunnen we onze query opstellen. De query is in grote lijnen hetzelfde als de standaardquery om alle records op te halen, met dat verschil dat we moeten aangeven om nu slechts een beperkt aantal records op te halen. Dit aangeven doen we via LIMIT. LIMIT kan gevolgd worden door 1 of 2 cijfers (indien 2 worden deze gescheiden door een komma). Indien er 1 cijfer staat, betekent dat cijfer hoeveel records er opgehaald moeten worden, tellend vanaf het begin. Indien er 2 cijfers staat, betekent het eerste cijfer het record om de telling van te beginnen en het tweede het aantal records dat opgehaald moet worden.

We weten op dit moment de huidige pagina, maar niet de nummer van het record waarvan de telling moet beginnen. Om dit te berekenen, voegen we een methode toe aan onze klasse (zie code hieronder). Om straks eenvoudig de query op te kunnen stellen, voegen we eveneens een methode toe om het aantal records per pagina op te halen. Deze waarde kennen we in principe reeds, maar het werkt eenvoudig om dit eveneens via de klasse te laten verlopen.

PHP
  1. <?php
  2.  
  3. class PaginaNummering
  4. {
  5.        
  6.         var $totaalAantalRecords;
  7.         var $huidigePagina;
  8.         var $aantalRecordsPerPagina;
  9.        
  10.         /*
  11.         * Constructor
  12.         */
  13.         function construct($totaalAantalRecords, $huidigePagina, $aantalRecordsPerPagina = 10)
  14.         {
  15.                
  16.                 $this->totaalAantalRecords = $totaalAantalRecords;
  17.                 $this->huidigePagina = $huidigePagina;
  18.                 $this->aantalRecordsPerPagina = $aantalRecordsPerPagina;
  19.                
  20.         }
  21.        
  22.         /*
  23.         * Het aantal pagina's bepalen aan de hand van het totale aantal records en het aantal items per pagina.
  24.         */
  25.         function getAantalPaginas()
  26.         {
  27.                
  28.                 return ceil($this->totaalAantalRecords / $this->aantalRecordsPerPagina);
  29.                
  30.         }
  31.        
  32.         /*
  33.         * Het nummer van de eerste record op de huidige pagina bepalen.
  34.         */
  35.         function getLimit()
  36.         {
  37.                
  38.                 // Aangezien MySQL vanaf 0 telt en onze eerste pagina 1 is, moeten we 1 pagina van het totaal aftrekken.
  39.                 return ($this->huidigePagina * $this->aantalRecordsPerPagina) - $this->aantalRecordsPerPagina;
  40.                
  41.         }
  42.        
  43.         /*
  44.         * Het aantal records dat op elke pagina weergeven wordt, bepalen.
  45.         */
  46.         function getAantalRecordsPerPagina()
  47.         {
  48.                
  49.                 return $this->aantalRecordsPerPagina;
  50.                
  51.         }
  52.        
  53. }
  54.  
  55. ?>


Onze klasse is in principe voldoende aangevuld nu om enkel die records op te halen die we willen tonen. We kunnen nu het bestand pagina.php verder aanvullen.

PHP
  1. <?php
  2.  
  3. // Nakijken of er in de URL een paginanummer is opgegeven.
  4. if(isset($_GET['pagina']))
  5. {
  6.        
  7.         // Pagina nummer werd opgegeven, dus vangen we dit op in een variabel.
  8.         $paginaNummer = $_GET['pagina'];
  9.        
  10.        
  11. }
  12. // Er werd geen paginanummer opgegeven...
  13. else
  14. {
  15.        
  16.         // ... dus zitten we op de allereerste pagina.
  17.         $paginaNummer = 1;
  18.        
  19. }
  20.  
  21.  
  22. $totaalAantalRecords = mysql_result(mysql_query("SELECT COUNT(*) as totaalAantalRecords FROM tblRecords"),0);
  23.  
  24. // Onze klasse invoegen.
  25. require_once("paginaNummering.class.php");
  26.  
  27. // Nieuw object aanmaken om de paginanummering op te stellen.
  28. $paginaNummering = new PaginaNummering;
  29.  
  30. // In principe hoeven we de derde parameter niet op te geven, aangezien deze standaard reeds ingevuld werd in de klasse.
  31. $paginaNummering->construct($totaalAantalRecords, $paginaNummer, 10);
  32.  
  33. // Query uitvoeren die enkel die records ophaalt die we tonen op deze pagina
  34. $query = mysql_query("SELECT * FROM tblRecords LIMIT ".$paginaNummering->getLimit().", ".$paginaNummering->getAantalRecordsPerPagina());
  35.  
  36. ?>


Indien je nu je records ophaalt, zal je merken dat enkel die records getoond worden die toebehoren aan de huidige pagina. Voeg de de variabele pagina toe aan de URL, of wijzig deze indien deze reeds bestaat. Bijvoorbeeld: http://www.example.com/pagina.php?pagina=3. Enkel de records van de derde pagina zullen nu getoond worden.

7. Lijst van alle pagina's genereren


Het zou natuurlijk leuk zijn indien we ook eenvoudig een lijstje krijgen van alle beschikbare pagina's. Op deze manier hoeven we niet handmatig een link te maken indien er voldoende records zijn om een nieuwe pagina aan te maken. Dit is niet zo heel erg moeilijk, we voegen gewoon nog een methode toe aan onze klasse.

PHP
  1. <?php
  2.  
  3. class PaginaNummering
  4. {
  5.        
  6.         var $totaalAantalRecords;
  7.         var $huidigePagina;
  8.         var $aantalRecordsPerPagina;
  9.        
  10.         /*
  11.         * Constructor
  12.         */
  13.         function construct($totaalAantalRecords, $huidigePagina, $aantalRecordsPerPagina = 10)
  14.         {
  15.                
  16.                 $this->totaalAantalRecords = $totaalAantalRecords;
  17.                 $this->huidigePagina = $huidigePagina;
  18.                 $this->aantalRecordsPerPagina = $aantalRecordsPerPagina;
  19.                
  20.         }
  21.        
  22.         /*
  23.         * Het aantal pagina's bepalen aan de hand van het totale aantal records en het aantal items per pagina.
  24.         */
  25.         function getAantalPaginas()
  26.         {
  27.                
  28.                 return ceil($this->totaalAantalRecords / $this->aantalRecordsPerPagina);
  29.                
  30.         }
  31.        
  32.         /*
  33.         * Het nummer van de eerste record op de huidige pagina bepalen.
  34.         */
  35.         function getLimit()
  36.         {
  37.                
  38.                 // Aangezien MySQL vanaf 0 telt en onze eerste pagina 1 is, moeten we 1 pagina van het totaal aftrekken.
  39.                 return ($this->huidigePagina * $this->aantalRecordsPerPagina) - $this->aantalRecordsPerPagina;
  40.                
  41.         }
  42.        
  43.         /*
  44.         * Het aantal records dat op elke pagina weergeven wordt, bepalen.
  45.         */
  46.         function getAantalRecordsPerPagina()
  47.         {
  48.                
  49.                 return $this->aantalRecordsPerPagina;
  50.                
  51.         }
  52.        
  53.         /*
  54.         * Lijst van alle beschikare pagina's genereren.
  55.         */
  56.         function getPaginaLijst()
  57.         {
  58.                
  59.                 // Variabele initialiseren.
  60.                 $paginaLijst = "";
  61.                
  62.                 // Alle pagina's doorlopen.
  63.                 for ($i=0; $i<$this->getAantalPaginas();$i++)
  64.                         // De lijst met pagina's aanvullen, waarbij we elke waarde verhogen met 1 omdat MySQL intern telt vanaf 0.
  65.                         $paginaLijst .= '<a href="?pagina='.($i + 1).'">'.($i + 1).'</a> ';
  66.                
  67.                 // Het lijstje van alle pagina's teruggeven.
  68.                 return $paginaLijst;
  69.                
  70.         }
  71.        
  72. }
  73.  
  74. ?>


We kunnen deze lijst nu op onze pagina tonen door de code aan te vullen als volgt.

PHP
  1. <?php
  2.  
  3. // Nakijken of er in de URL een paginanummer is opgegeven.
  4. if(isset($_GET['pagina']))
  5. {
  6.        
  7.         // Pagina nummer werd opgegeven, dus vangen we dit op in een variabel.
  8.         $paginaNummer = $_GET['pagina'];
  9.        
  10.        
  11. }
  12. // Er werd geen paginanummer opgegeven...
  13. else
  14. {
  15.        
  16.         // ... dus zitten we op de allereerste pagina.
  17.         $paginaNummer = 1;
  18.        
  19. }
  20.  
  21.  
  22. $totaalAantalRecords = mysql_result(mysql_query("SELECT COUNT(*) as totaalAantalRecords FROM tblRecords"),0);
  23.  
  24. // Onze klasse invoegen.
  25. require_once("paginaNummering.class.php");
  26.  
  27. // Nieuw object aanmaken om de paginanummering op te stellen.
  28. $paginaNummering = new PaginaNummering;
  29.  
  30. // In principe hoeven we de derde parameter niet op te geven, aangezien deze standaard reeds ingevuld werd in de klasse.
  31. $paginaNummering->construct($totaalAantalRecords, $paginaNummer, 10);
  32.  
  33. // Query uitvoeren die enkel die records ophaalt die we tonen op deze pagina
  34. $query = mysql_query("SELECT * FROM tblRecords LIMIT ".$paginaNummering->getLimit().", ".$paginaNummering->getAantalRecordsPerPagina());
  35.  
  36. // Lus om de records te tonen
  37. // ...
  38.  
  39. echo $paginaNummering->getPaginaLijst();
  40.  
  41. ?>


8. Slot


Vanzelfsprekend kan je de klasse nog uitbreiden. Zo kan je het overzicht van alle pagina's in een lijst steken om op die manier via CSS eenvoudig de look and feel er van aan te passen. Je kan ook de stijl van de huidige pagina in de lijst aanpassen; bijvoorbeeld deze vetjes of tussen haakjes weergeven.

Je zou ook diezelfde methode, getPaginaLijst(), kunnen aanpassen zodat je via de functieaanroep een URL kan opgeven. Dit is handig wanneer je wil verwijzen naar een andere pagina of een pagina die reeds parameters bezit.

Het is ook zo dat de klasse er in deze vorm van uitgaat dat de input correct is. Een bezoeker zou bijvoorbeeld op dit moment geen pagina met de nummer -5 mogen ingeven. Doet hij dat toch, dan worden er geen records getoond. Een eenvoudige controle of het paginanummer binnen de toegelaten grenzen (0 en het maximum aantal pagina's) valt, zou dit kunnen verhelpen.

Indien je nog vragen hebt, kan je altijd een onderwerp starten in onze forums ;).Dit artikel werd geschreven door Martijn op zondag 7 januari 2007 om 18:38 en werd sindsdien 7620 keer gelezen.

  • Pagina
  • 1 van 1

Geen reacties gevonden
Er werden nog geen reacties bij dit artikel geplaatst.
  • Indien je denkt iets te kunnen toevoegen aan het artikel, kan je zelf een reactie schrijven via de koppeling Plaats een reactie bij dit artikel hieronder.
  • Indien je andere commentaar (iets wat niet meteen functioneel bijdraagt aan het artikel zelf) hebt, kan je een bedankje formuleren via de koppeling Plaats een bedankje bij dit artikel hieronder.