Welkom, Gast. Je bent niet ingelogd.

TUT Paginanavigatie

Door Lennard op 16 Mar 2007, 16:56

Hee,

Aangezien ik vaak vragen zie van \"hoe maak ik een goede paginanavigatie?\" en \"weet iemand toevallig een navigatiescript?\", omdat ik nog geen enkel blog heb geplaatst en omdat ik toch niets te doen had geen zin had om iets te doen heb ik besloten een blog / tutorial te maken over het maken van een paginanavigatie.

We houden het simpel; we willen alleen een rijtje zoals die hier ook op Saven staat:
< 1 2 3 4 5 >

We hebben dus eerst 2 variabelen nodig; eentje met het totaal aantal pagina\'s en eentje met de huidige pagina.
Zoals ik al zei houd ik het eenvoudig; je werkt het later maar lekker zelf verder uit. :\')

Het begin:

1
2
3
4
<?php
$totaal = 25;
$huidige = 5;
?>

Nu laten we eerst álle paginanummers zien, met de < aan het begin, en de > aan het einde.
Daarvoor maken we een mooie loop die alle paginanummertje doorloopt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
$totaal = 25;
$huidige = 5;

$str = \'<a href=\"?p=1\">&laquo;</a> \'; // de string waarin de rij paginanummers komt

for($i = 1; $i <= $totaal; $i++)
{
    
    if($i == $huidige)
    {
        
        $str .= \'<b>\'.$i.\'</b> \';
    
    }
    else
    {
    
        $str .= \'<a href=\"?p=\'.$i.\'\">\'.$i.\'</a> \';
    
    }

}
    
$str .= \' <a href=\"?p=\'.$totaal.\'\">&raquo;</a>\'; // zet de laatste pagina erbij

echo $str;
?>

Zoals je ziet doen we hier niets anders dan een string aanmaken met daarin een &laquo; (een soort << maar dan gecombineerd in één teken), alle pagina\'s (de huidige is dikgedrukt), en een &raquo; (tegenovergestelde van &laquo; ).
We krijgen nu dus ook logischerwijs dit:
« 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 »
De \"5\" is dikgedrukt omdat dat onze huidige pagina is.

Natuurlijk willen we niet de hele slinger pagina\'s laten zien; maximaal 5, anders krijg je een veel te lange rij.
Hoe gaan we dat doen?
We hebben 2 gegevens: Het aantal pagina\'s en de huidige pagina.
Om verder te kunnen zetten we even op een rijtje wat we precies willen; ik kan wel alles voor gaan doen, maar daar leert niemand wat van. :\')
We willen maximaal 5 paginanummers laten zien.
Dat aantal wat we willen laten zien wordt lager wanneer we minder dan 5 pagina\'s hebben.
Nu moeten we dus een variabele maken met daarin het aantal paginanummers wat we willen laten zien.
Zoiets dus:
$zien = $totaal >= 5 ? 5 : $totaal;

Ziet er misschien wat ingewikkeld uit, daarom zal ik het even uitschrijven:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if($totaal > 5)
{

    $zien = 5;

}
else
{
    
    $zien = $totaal;

}
?>

Wanneer we meer dan 5 pagina\'s hebben, kunnen we het ons veroorloven om 5 pagina\'s te laten zien; we hebben er tóch meer. Wanneer we er echter minder dan 5 hebben, kunnen we dat niet, en moeten we er dus minder laten zien; maximaal het aantal wat we hebben, vandaar bovenstaande code.
Om het ietsiepietsie korter te maken, kun je het ook zo opschrijven:
$zien = $totaal > 4 ? 5 : $totaal;
Nu moeten we de $i laten beginnen bij $totaal – 2, omdat we zoiets willen:
p = huidige pagina
{ p – 2 } { p – 1 } { p } { p + 1 } { p + 2 }
De { en } heb ik er alleen bij gezet ter verduidelijking; ze hebben geen speciale betekenis.
Nu we dit zo zien, zien we dat $i niet bij 1 moet beginnen, maar bij $totaal – 2, áls dat tenminste groter is dan 0 (1 of hoger).
Dat gaat er zo uit zien:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
$totaal = 25;
$huidige = 5;

$str = \'<a href=\"?p=1\">&laquo;</a> \'; // de string waarin de rij paginanummers komt

$zien = $totaal > 4 ? 5 : $totaal;

for($i = ($huidige - 2 > 0 ? $huidige - 2 : 1); $i <= $totaal; $i++)
{
    
    if($i == $huidige)
    {
        
        $str .= \'<b>\'.$i.\'</b> \';
    
    }
    else
    {
    
        $str .= \'<a href=\"?p=\'.$i.\'\">\'.$i.\'</a> \';
    
    }

}
    
$str .= \' <a href=\"?p=\'.$totaal.\'\">&raquo;</a>\'; // zet de laatste pagina erbij

echo $str;
?>

Tot nu toe is alles volgens mij nog redelijk te begrijpen.
$i begint bij $huidige – 2 wanneer dat groter is dan 0, als dat niet zo is begint $i bij 1.
We hadden ook de teller $zien om bij te houden hoeveel items we mochten laten zien.
We kunnen dus $zien iedere keer dat de lus wordt doorlopen eentje lager maken, en zodra $zien gelijk is aan 0 de lus laten stoppen.

Wanneer we dat uitwerken ziet het er zo uit:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
$totaal = 25;
$huidige = 5;

$str = \'<a href=\"?p=1\">&laquo;</a> \'; // de string waarin de rij paginanummers komt

$zien = $totaal > 4 ? 5 : $totaal;

for($i = ($huidige - 2 > 0 ? $huidige - 2 : 1); $i <= $totaal && $zien > 0; $i++)
{
    
    if($i == $huidige)
    {
        
        $str .= \'<b>\'.$i.\'</b> \';
    
    }
    else
    {
    
        $str .= \'<a href=\"?p=\'.$i.\'\">\'.$i.\'</a> \';
    
    }
    
    $zien--;

}
    
$str .= \' <a href=\"?p=\'.$totaal.\'\">&raquo;</a>\'; // zet de laatste pagina erbij

echo $str;
?>

Voor de mensen die niet zo bekend zijn met de $var-- notatie:
$var-- is hetzelfde als $var = $var – 1; maar omdat het korter is gebruik ik die liever.
Hiernaast is er nog --$var, welke niet hetzelfde is.
Een simpel voorbeeldje:

1
2
3
4
5
6
7
<?php
$i = 10;
echo $i--; // 10
echo $i; // 9
echo --$i; // 8
echo $i; // 8
?>

--$var voert dus de bewerking uit vóórdat je de variabele gebruikt, en $var-- erna.
Maargoed; we gaan verder…

Nu ziet hij er aardig goed uit:
« 3 4 5 6 7 »
We wijzigen $totaal even naar 3, en $huidige naar 2 om te kijken of alles dan nóg werkt.
« 1 2 3 »
Perféct.
Wanneer we het een en ander testen zien we dat het fout gaat bij de laatste pagina, als we 5 pagina\'s hebben en we staan ook op pagina 5 krijgen we zoiets:
« 3 4 5 »
Dat terwijl we zoiets wilden:
« 1 2 3 4 5 »
We wilden immers áltijd 5 paginas – zolang het aantal pagina\'s dat toestaat.
Hiervoor moeten we hem wat omgooien en logisch nadenken…
Net zoals bij wis- en natuurkunde schrijven we op wat we weten:
We weten het verschil tussen het totaal aantal topics en de huidige pagina.
Dat is het aantal pagina\'s wat áchter de huidige pagina komt.
Voorbeeldje voor degenen die het vaag vinden:
We hebben 8 pagina\'s, en zitten nu op pagina 5.
Dan komen er 8 – 5 = 3 pagina\'s áchter de <b>5</b> te staan (namelijk 6, 7 en .
Hoeveel pagina\'s komen er dan voor?
Logischerwijs zeg je dan 4 – verschil, alleen klopt dit niet altijd.
Voorbeeldje:
We hebben 8 pagina\'s en zitten nu op 5.
Er achter komen dan 8 – 5 = 3 pagina\'s. We limiteren dit tot 2.
Ervoor 4 – 2 (3 hadden we afgekapt op 2) = 2.
Wanneer het verschil echter kléiner wordt dan 2 (= het aantal pagina\'s wat we er achter willen hebben), moeten we vooraan een pagina erbij stoppen..
Klinkt erg moeilijk, is erg simpel:
$ervoor = ($totaal - $huidige) < 2 ? 4 - ($totaal - $huidige) : 2;
Nu nog even alles op een rijtje:
We beginnen met tellen op $huidige_pagina - $ervoor wanneer dit groter is dan 0. Wanneer dit kleiner is dan of gelijk aan 0 beginnen we op 1 te tellen.
Dus: $i = ($huidige - $ervoor > 0 ? $huidige - $ervoor : 1)
We willen maximaal 5 getallen zien, dus beginnen we met $zien = 5, en verlagen we die iedere keer.
We gaan door zolang onze teller ($i) kleiner is dan of gelijk aan het totaal aantal pagina\'s, maar $zien moet óók groter zijn dan 0. Zodra één van beiden false wordt moet de loop stoppen.
Alles bij elkaar komt er zoiets uit:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
$totaal  = 15;
$huidige = 15;

$str = \'<a href=\"?p=1\">&laquo;</a> \'; // de string waarin de rij paginanummers komt

$ervoor = ($totaal - $huidige) < 2 ? 4 - ($totaal - $huidige) : 2;

for($i = ($huidige - $ervoor > 0 ? $huidige - $ervoor : 1), $zien = 5; $i <= $totaal && $zien > 0; $i++)
{
    
    if($i == $huidige)
    {
        
        $str .= \'<b>\'.$i.\'</b> \';
    
    }
    else
    {
    
        $str .= \'<a href=\"?p=\'.$i.\'\">\'.$i.\'</a> \';
    
    }
    
    $zien--;

}
    
$str .= \' <a href=\"?p=\'.$totaal.\'\">&raquo;</a>\'; // zet de laatste pagina erbij

echo $str;
?>

Of iets ingekort:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$totaal  = 15;
$huidige = 14;

$str = \'<a href=\"?p=1\">&laquo;</a> \'; // de string waarin de rij paginanummers komt

$ervoor = ($totaal - $huidige) < 2 ? 4 - ($totaal - $huidige) : 2;

for($i = ($huidige - $ervoor > 0 ? $huidige - $ervoor : 1), $zien = 5; $i <= $totaal && $zien > 0; $i++, $zien--)
{
    
    $str .= $i == $huidige ? \'<b>\'.$i.\'</b> \' : \'<a href=\"?p=\'.$i.\'\">\'.$i.\'</a> \';
    
}
    
$str .= \' <a href=\"?p=\'.$totaal.\'\">&raquo;</a>\'; // zet de laatste pagina erbij

echo $str;
?>

Ik denk dat er wel handigere manieren zijn om een navigatiesysteem te maken, maar ik heb hem nu eenmaal zo gedaan. :\')

Ik hoop dat deze tut / blog een beetje duidelijk is, zo niet: jammer dan, zo ja: gelukkig.

Greetz,

Lennard.

Jesse
House<3
Geplaatst op: 27 Mar 2007, 18:24

Dat staat er al thomaz

Thomaz
'
Geplaatst op: 19 Mar 2007, 17:55

Hoe maak je een limit dan?

Bijv. dat je 25 resultaten per pagina wil?

En hoe stel ik dat hier in:

$query = \"SELECT * FROM pb WHERE user=\'\".$_SESSION[\'naam\'].\"\' && in_delete=\'nee\' ORDER BY id DESC LIMIT \".safe($zien).\",\".safe($totaal);

Lennard
?
Geplaatst op: 19 Mar 2007, 07:50

DJVG schreef:

Zelf zou ik het anders doen, ook omdat ik meer in het engels script en hem meteen met mysql/mssql laat comminuceren!

Wat boeit het of je $huidige en $totaal hebt of $current en $total? :\')

En ik zei ook:

We houden het simpel; we willen alleen een rijtje zoals die hier ook op Saven staat:

Di\'s alleen de navigatie, rest kun je er wel zelf bijbouwen denk.

DJVG
&#61514;
Geplaatst op: 18 Mar 2007, 22:12

Zelf zou ik het anders doen, ook omdat ik meer in het engels script en hem meteen met mysql/mssql laat comminuceren!

Sparky
Geplaatst op: 18 Mar 2007, 20:29

Hijs heel duidelijk.
Ziet er goed uit

Basjee
Octo
Geplaatst op: 17 Mar 2007, 14:43

Spunk schreef:

Nice.
Zelf was ik net klaar met dat deel, en ik ben nu zeg maar zo\'n <select> ding aan het maken
Zo\'n rollout ding zegmaar

Jij hebt die van tim

[Laatst bewerkt door Basjee op zaterdag 17 maart 2007, om 15:34]
Suma
heeft gelijk
Geplaatst op: 16 Mar 2007, 22:48

Handige blog

Died
Geplaatst op: 16 Mar 2007, 19:43

Nice.
Zelf was ik net klaar met dat deel, en ik ben nu zeg maar zo\'n <select> ding aan het maken
Zo\'n rollout ding zegmaar

[Laatst bewerkt door Spunk op vrijdag 16 maart 2007, om 19:56]
Artofdead
Master Fish
Geplaatst op: 16 Mar 2007, 19:41

Handige blog als je zelf een site zou maken

HyperTesia
Webdeveloper
Geplaatst op: 16 Mar 2007, 19:20

Nice blog, zeer handig

Florian
kunjeditzien:')?
Geplaatst op: 16 Mar 2007, 18:37

Kan altijd handig zijn .
Denk dat ik het wel een keer zal gebruiken .

📫

Nieuw privébericht

🔥

Registreren


Login