OO Paginanummering
Een tijd geleden heb ik een paginanummeringsscript gemaakt en die heb ik hier ook toegevoegd op PHPhulp. Een tijdje daarna heb ik mezelf eraan gewaagd deze in OO stijl te maken, alleen deze was erg brak. Vandaar nu een volledig opnieuw gebouwd OO paginanummeringsscript: OO Paginanummering Kent niet heel veel opties, maar is vooral handig en flexibel in het gebruik. Hoe werkt het? 1. Laad de klasse in 2. Maak je query 3. Maak het paginanummeringsobject 4. Haal je resultaten op 5. Laat een navigatiemenu zien Gebruik voor je SQL resource in je while-lus de functie getResultaten() - deze bevat de resource met de resultaten van de huidige pagina. Op de plaats van je navigatie gebruik je de functie getNavigatie() . Deze stuurt een multidimensionale array terug met daarin een navigatiemenu. Deze arrays bevatten de volgende waardes die je kunt uitlezen: soort - het soort navigatieitem dat het is (de soorten staan hieronder) nummer - het paginanummer dat je in je URL gebruikt schermnummer - het nummer dat je op je pagina toont Soorten in het attribuut 'soort' vorige - knop voor de vorige pagina eerste - knop voor de eerste pagina pagina - knop voor een paginanummer huidig - het huidige paginanummer (hoort geen knop te zijn) laatste - knop voor de laatste pagina volgende - knop voor de volgende pagina De getNavigatie() functie stuurt dus een multidimensionale array terug, die lees je dus uit met een foreach()-lus. Gebruik voor de link het attribuut 'nummer' en voor het nummer dat op het scherm moet komen het attribuut 'schermnummer'. Het soort item dien je dus uit te lezen met een switch(), om te bepalen wat je met het item gaat doen. (denk aan opmaak e.d.) Klinkt lastig? Bekijk de klasse dan maar eens, er staat heel wat commentaar bij! Alles wordt vanzelf duidelijk. In index.php staat ook een voorbeeld voor in de praktijk. Ik hoop dat jullie er wat aan hebben! Commentaar is natuurlijk altijd welkom ;-) (De functies getResultaten() en getNavigatie() zitten natuurlijk in het object, maar dat spreekt voor zich)
[code]<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<?php
try
{
// Connect met je database
mysql_connect("localhost", "root", "");
mysql_select_db("beheer");
// Class inladen en query opbouwen
require 'paginanummering.class.php';
$sQuery = "
SELECT
datum
FROM
drinken
";
// Maak een nieuwe paginanummering en geef $qSql de resource met de resultaten
$oPaginanummering = new Paginanummering($sQuery, 'pagina', 2);
$qSql = $oPaginanummering->getResultaten();
// Laat de resultaten van de huidige pagina zien
while ($resultaat = mysql_fetch_assoc($qSql))
{
echo $resultaat['datum'].'<br />';
}
// Bouw een navigatiemenu op
foreach ($oPaginanummering->getNavigatie() as $aNavItem)
{
switch ($aNavItem['soort']):
case 'vorige':
echo '<a href="?pagina=' . $aNavItem['nummer'] . '"><</a> ';
break;
case 'eerste':
echo '<strong><a href="?pagina=0">' . $aNavItem['schermnummer'] . '</a></strong> ';
break;
case 'pagina':
echo '<a href="?pagina=' . $aNavItem['nummer'] . '">' . $aNavItem['schermnummer'] . '</a> ';
break;
case 'huidig':
echo '<strong>' . $aNavItem['schermnummer'] . '</strong> ';
break;
case 'laatste':
echo '<strong><a href="?pagina=' . $aNavItem['nummer'] . '">' . $aNavItem['schermnummer'] . '</a></strong> ';
break;
case 'volgende':
echo '<a href="?pagina=' . $aNavItem['nummer'] . '">></a> ';
break;
endswitch;
}
}
catch (Exception $e)
{
// Er gaat iets fout (eventueel in de klasse) - laat de fout zien
echo 'Fout: ' . $e->getMessage();
}
?>
</body>
</html>[/code]
<?php
/**
* Klasse voor paginanummering van MySQL resultaten
*
* @author Roel van de Water
*/
class Paginanummering
{
/*
* Query voor het ophalen van resultaten
*
* @var string
*/
private $_sQuery;
/*
* Het aantal resultaten per pagina
*
* @var integer
*/
private $_iResultaten;
/*
* De naam van de Query String van het nummer van de pagina
*
* @var string
*/
private $_sQueryString;
/*
* Aantal navigatieitems voor de huidige pagina
*
* @var integer
*/
private $_iAantalVoor;
/*
* Aantal navigatieitems na de huidige pagina
*
* @var integer
*/
private $_iAantalNa;
/*
* Het totaal aantal resultaten van de query
*
* @var integer
*/
private $_iTotaalResultaten;
/*
* Constructor voor de klasse met de verplichte parameters
*
* @param string $sQuery
* @param string $sQueryString
* @param integer $iResultaten
* @param integer $iAantalVoor
* @param integer $iAantalNa
*/
public function __construct($sQuery, $sQueryString, $iResultaten, $iAantalVoor = 3, $iAantalNa = 3)
{
$this->_sQuery = (string) $sQuery;
$this->_sQueryString = (string) $sQueryString;
$this->_iResultaten = (int) $iResultaten;
$this->_iAantalVoor = (int) $iAantalVoor;
$this->_iAantalNa = (int) $iAantalNa;
// Query uitvoeren om het totaal aantal resultaten op te halen
$qSql = mysql_query($sQuery);
if ($qSql === false)
{
throw new Exception('Het totaal aantal resultaten kon niet opgehaald worden!');
}
else
{
$this->_iTotaalResultaten = (int) mysql_num_rows($qSql);
}
}
/*
* Functie voor het ophalen van het huidige paginanummer
*
* @return integer
*/
private function getPagina()
{
// Controleren of de Query String geldig is - anders 0 terugsturen
return isset($_GET[$this->_sQueryString]) && ctype_digit($_GET[$this->_sQueryString]) && $_GET[$this->_sQueryString] >= 0 && $_GET[$this->_sQueryString] < ceil($this->_iTotaalResultaten / $this->_iResultaten) ? $_GET[$this->_sQueryString] : 0;
}
/*
* Functie voor het ophalen van het totaal aantal resultaten
*
* @return integer
*/
public function getTotaalResultaten()
{
return (int) $this->iTotaalResultaten;
}
/*
* Functie voor het ophalen van de resultaten
*
* @return resource
*/
public function getResultaten()
{
if ($this->getPagina() > floor($this->_iTotaalResultaten / $this->_iResultaten) || !isset($_GET[$this->_sQueryString]))
{
// De opgevraagde pagina is groter dan het totaal aantal resultaten of er is geen Query String opgegeven - geef de standaard resultaten
$sQuery = $this->_sQuery . " LIMIT " . $this->_iResultaten;
}
else
{
// Geef de resultaten terug van de huidige pagina
$sQuery = $this->_sQuery . " LIMIT " . ($this->getPagina() * $this->_iResultaten) . ", " . $this->_iResultaten;
}
$qSql = mysql_query($sQuery);
if ($qSql === false)
{
throw new Exception('De resultaten konden niet opgehaald worden!');
}
else
{
return $qSql;
}
}
/*
* Navigatie opbouwen en terugsturen
*
* @return string
*/
public function getNavigatie()
{
// Array met de navigatieitems erin
$aItems = array();
// Controleren of er meerdere pagina's zijn
if (floor($this->_iTotaalResultaten / ($this->_iResultaten + 1)) > 0)
{
$iEerste = ($this->getPagina() - $this->_iAantalVoor >= 0) ? $this->getPagina() - $this->_iAantalVoor : 0;
$iLaatste = ($this->getPagina() + $this->_iAantalNa < ceil($this->_iTotaalResultaten / $this->_iResultaten)) ? $this->getPagina() + ($this->_iAantalNa + 1) : ceil($this->_iTotaalResultaten / $this->_iResultaten);
// Niet de eerste pagina, dus maak een 'vorige' knop
if ($this->getPagina() > 0)
{
$aItems[] = array
(
'soort' => 'vorige',
'nummer' => $this->getPagina() - 1,
'schermnummer' => $this->getPagina() - 1
);
}
// Niet de eerste pagina, dus maak een 'eerste' knop
if ($iEerste > 0)
{
$aItems[] = array
(
'soort' => 'eerste',
'nummer' => 0,
'schermnummer' => 1
);
}
// Loop door de paginanummers heen en controleer of het de huidige pagina is
for ($i = $iEerste; $i < $iLaatste; $i++)
{
if ($i == $this->getPagina())
{
$aItems[] = array
(
'soort' => 'huidig',
'nummer' => $i,
'schermnummer' => $i + 1
);
}
else
{
$aItems[] = array
(
'soort' => 'pagina',
'nummer' => $i,
'schermnummer' => $i + 1
);
}
}
// Het is niet de laatste pagina, dus maak een 'laatste' knop
if ($iLaatste < ceil($this->_iTotaalResultaten / $this->_iResultaten))
{
$aItems[] = array
(
'soort' => 'laatste',
'nummer' => ceil($this->_iTotaalResultaten / $this->_iResultaten) - 1,
'schermnummer' => ceil($this->_iTotaalResultaten / $this->_iResultaten)
);
}
// Het is niet de laatste pagina, dus maak een 'volgende' knop
if ($this->getPagina() + 1 < ceil($this->_iTotaalResultaten / $this->_iResultaten))
{
$aItems[] = array
(
'soort' => 'volgende',
'nummer' => $this->getPagina() + 1,
'schermnummer' => $this->getPagina() + 1
);
}
}
// Array met alle navigatieitems terugsturen
return $aItems;
}
}
?>
Reacties
0