Paginanummeringsfunctie
Door Jesper Diovo, 20 jaar geleden, 4.152x bekeken
Ik weet wat je nu denkt: de zovéélste paginanummering. Dat kan wel zo zijn, maar de paginanummeringscripts die ik heb gezien hier, kloppen grotendeels van geen kanten. Bovendien zijn ze op de lange termijn niet echt handig.
Dit script kun je met én zonder database gebruiken. Het enige wat de functie vraagt is het aantal pagina's en de huidige pagina ;-).
In het voorbeeld is gebruik gemaakt van het alfabet; 10 letters per pagina. Het voorbeeld is dus zónder database. Onderaan de functie staan twee voorbeelden: eentje mét database, eentje zonder.
Haal er je voordeel uit, zou ik zeggen ;-).
Gesponsorde koppelingen
PHP script bestanden
Er zijn 13 reacties op 'Paginanummeringsfunctie'
Gesponsorde koppelingen
Naast het feit dat je de datalayer en presentatielayer gaat mixen, vind ik pagina 0 slecht gekozen. 0 betekent dat er niks is, bij jou betekent dit pagina 1. Beetje ongelukkig.
Verder is het niet mogelijk om de gebruiker een eigen sortering te laten kiezen, dat is met pagination erg eenvoudig omdat je toch al aan het sorteren bent.
Vraag: Wat is er volgens jou mis met dit script? Deze is in 1 minuutje aan te passen voor een MySQL-database.
Verder is het niet mogelijk om de gebruiker een eigen sortering te laten kiezen, dat is met pagination erg eenvoudig omdat je toch al aan het sorteren bent.
Vraag: Wat is er volgens jou mis met dit script? Deze is in 1 minuutje aan te passen voor een MySQL-database.
@Terence: Wil je dan dat er na het uitvoeren van de functie nog eerst iets met de return gedaan moet worden, voordat het geöutput moet worden, terwijl het zo direct goed staat? Overigens is het niet moeilijk de presentatie aan te passen.
@Frank: 0 is gewoon standaard. Misschien wat onlogisch gekozen, maar het is zo. Bovendien kun je ook dat heel snel en simpel aanpassen.
Sortering? Er wordt nergens iets gedaan met de output van de query, laat staan met de input. Dat kun je helemaal zelf regelen. Deze functie is alléén voor de paginanummering.
Dat script is te uitgebreid en bovendien niet direct te gebruiken in een pagina. Bij mij hoef je weinig aan te passen, alleen het uitrekenen van het aantal pagina's en de check op de huidige pagina te zetten. Not less, not more ;-).
Edit: Je moet alles onder de eerste ------------ wegdenken. Alles wat overblijft is het totale script eigenlijk ;-).
@Frank: 0 is gewoon standaard. Misschien wat onlogisch gekozen, maar het is zo. Bovendien kun je ook dat heel snel en simpel aanpassen.
Sortering? Er wordt nergens iets gedaan met de output van de query, laat staan met de input. Dat kun je helemaal zelf regelen. Deze functie is alléén voor de paginanummering.
Dat script is te uitgebreid en bovendien niet direct te gebruiken in een pagina. Bij mij hoef je weinig aan te passen, alleen het uitrekenen van het aantal pagina's en de check op de huidige pagina te zetten. Not less, not more ;-).
Edit: Je moet alles onder de eerste ------------ wegdenken. Alles wat overblijft is het totale script eigenlijk ;-).
Tip: Maak nog wel even een connectie met de database, dat werkt over het algemeen wat beter... ;)
Dat mijn script moeilijker zou zijn, lijkt me stug, in minder regels code krijg je meer functionaliteit en een betere scheiding tussen database, logica en presentatie. Daarnaast kun je kiezen voor diverse databases, even de connectie-string aanpassen, even testen of het SQL-dialect aansluit op jouw database (en evt. aanpassen) en klaar is kees. Nee, ik weet het wel, ik hou het mooi bij mijn scriptje, stuk eenvoudiger.
Dat mijn script moeilijker zou zijn, lijkt me stug, in minder regels code krijg je meer functionaliteit en een betere scheiding tussen database, logica en presentatie. Daarnaast kun je kiezen voor diverse databases, even de connectie-string aanpassen, even testen of het SQL-dialect aansluit op jouw database (en evt. aanpassen) en klaar is kees. Nee, ik weet het wel, ik hou het mooi bij mijn scriptje, stuk eenvoudiger.
Frank, bekijk het script nou nog eens. Het is een functie. Wat doet een functie? Juist, een handeling binnen een script verkorten.
Wil je het nou echt niet zien of ligt dat aan mij? Je kunt met deze functie heel snel en simpel een pagina nummering maken. Het enige wat je hoeft te doen is het aantal pagina's ($pages) berekenen en de huidige pagina ($page) ophalen. De connectie, queries, etc. kun je allemaal zélf kiezen. Uiteindelijk is het enige wat je hiermee hoeft te doen:
Bovendien worden er geen queries of iets dergelijks uitgevoerd. Het is alleen maar berekenen en outputten. Is dat zo moeilijk te begrijpen en lós te zien van een heel script wat je helemaal om moet bouwen, wil het naar je wensen zijn, zoals dat van jou?
Wil je het nou echt niet zien of ligt dat aan mij? Je kunt met deze functie heel snel en simpel een pagina nummering maken. Het enige wat je hoeft te doen is het aantal pagina's ($pages) berekenen en de huidige pagina ($page) ophalen. De connectie, queries, etc. kun je allemaal zélf kiezen. Uiteindelijk is het enige wat je hiermee hoeft te doen:
Bovendien worden er geen queries of iets dergelijks uitgevoerd. Het is alleen maar berekenen en outputten. Is dat zo moeilijk te begrijpen en lós te zien van een heel script wat je helemaal om moet bouwen, wil het naar je wensen zijn, zoals dat van jou?
Leuk, maar dit is alleen maar een stukje weergave van een paar nummertjes en een vorige-volgende, maar content, dat is ver te zoeken. En wat nu pagination zonder content?
Jouw script zorgt voor wat pagina nummertjes, maar ook niet meer dan dat. Er is geen sprake van pagination, dat is heel wat anders, daarvoor heb je echt queries e.d. nodig. (al kun je met array-functies of XQuery ook e.e.a. maken)
Daarnaast doet de functie vreemd:
Dit vang je nergens af, een extra controle kan geen kwaad.
Het probleem met nummer 0 zul je ook moeten oplossen, dit kan bij bezoekers voor verwarring zorgen: Je tikt in de url pag 4 in, maar je komt op pagina 5 terecht. Beetje knullig.
Wanneer je Smarty gebruikt voor je templates, kun je die de presentatie laten verzorgen, maakt het nog een stuk eenvoudiger.
Jouw script zorgt voor wat pagina nummertjes, maar ook niet meer dan dat. Er is geen sprake van pagination, dat is heel wat anders, daarvoor heb je echt queries e.d. nodig. (al kun je met array-functies of XQuery ook e.e.a. maken)
Daarnaast doet de functie vreemd:
Dit vang je nergens af, een extra controle kan geen kwaad.
Het probleem met nummer 0 zul je ook moeten oplossen, dit kan bij bezoekers voor verwarring zorgen: Je tikt in de url pag 4 in, maar je komt op pagina 5 terecht. Beetje knullig.
Wanneer je Smarty gebruikt voor je templates, kun je die de presentatie laten verzorgen, maakt het nog een stuk eenvoudiger.
Als 'newbie' is dit veel gemakkelijker te gebruiken dan een het script dat jij als link post Frank. Dat wil niet zeggen dat ik dit beter vindt, maar ik vindt wel dat je ook moet kijken naar de doelgroep die je met dit script wilt bereiken. De snelheid waarmee je dit kunt gebruiken is enkele minuten en het is niet slecht geprogrammeerd. Leuke toevoeging in mijn ogen dus.
Wanneer je Smarty gebruikt, kun je het beste SmartyPaginate gebruiken denk ik. Verder staat daar ook nog code in die van pas kan komen.
Desalniettemin, een goede poging.
Desalniettemin, een goede poging.
Hier functie met een zelfde doel, alleen met extra argumenten om meer invloed uit te oeffenen op het resultaat.
Code (php)
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
<?php
/*
Deze functie creëerd een pagina-subnavigatie.
$url: Geeft de URL waarnaar moet worden verwezen. Gebruik __NAV__ om aan te geven waar de paginanummer moet
worden ingevoegd in de URL. Zit er geen __NAV__ in de url, dan geeft de functiee altijd een FALSE als
resultaat.
Bijvoorbeeld: index.php?page=blah&subpage=mehh&nav=__NAV__
of /blah/mehh/__NAV__/
$number_of_items: Totaal aantal items
$nav_id: De nav_id die nu getoond wordt (Pagina's lopen van 0 tot N, maar worden aan de front-end altijd met 1 verhoogd zodat de bezoeker denkt dat de eerste pagina 1 is i.p.v. 0)
$items_per_page: Aantal items dat op 1 pagina getoond wordt
$nav_size: De maximale breedte van de navigatiebalk, exclusief de <<, <, > en >> symbolen.
$nav_seperator Het scheidingsteken tussen de verschillende items
Bijvoorbeeld, met als scheidingsteken: ' | '
<< < 1 | 2 | 3 | 4 | 5 | 6 | 7 > >>
Is er geen navigatie nodig omdat het totaal aantal items kleiner is dan het aantal items dat op 1 pagina getoond wordt, dan
geeft de functie FALSE als resultaat. De navigatie moet dan ook altijd zo getoond worden:
$nav = createNavigation(<arguments>);
if($nav)
{
print($nav);
}
*/
function createNavigation($url, $number_of_items = 0, $nav_id = 0, $items_per_page = 10, $nav_size = 7, $nav_seperator = ' | ', $show_first_and_last_button = true)
{
$result = '';
if($items_per_page < 1)
{
$items_per_page = 10;
}
if($number_of_items > $items_per_page) // See if a subnav is required
{
$nav_pages = ceil($number_of_items / $items_per_page); // Calculate total numerber of pages
// Validate current page
if($nav_id && isInt($nav_id))
{
if($nav_id >= 1)
{
if($nav_id >= $nav_pages) // Pagenumber out of range
{
$nav_id = 0;
}
}
else
{
$nav_id = 0;
}
}
else
{
$nav_id = 0;
}
// See at what index the subnav should start
$nav_index = 0;
if($nav_id < floor($nav_size / 2))
{
$nav_index = 0;
}
else
{
$nav_index = $nav_id - floor($nav_size / 2);
if(($nav_index + $nav_size) >= $nav_pages)
{
$nav_index = $nav_pages - $nav_size;
}
if($nav_index < 0)
{
$nav_index = 0;
}
}
// See if the given URL contains the __NAV__ (otherwise we dont know where to insert the pageid)
if(stristr($url, '__NAV__'))
{
if($nav_id == 0) // Are first and previous button inactive (not clickable)?
{
if($show_first_and_last_button)
{
$result .= '>>';
$result .= ' ';
}
$result .= '>';
}
else
{
if($show_first_and_last_button)
{
$result .= '<a href="' . escapeHtml(str_replace('__NAV__', '0', $url)) . '" title="Eerste pagina (1)"><<</a>';
$result .= ' ';
}
$result .= '<a href="' . escapeHtml(str_replace('__NAV__', '' . ($nav_id - 1), $url)) . '" title="Vorige pagina (' . $nav_id . ')"><</a>';
}
// Print all pages (from $nav_index -> $nav_size)
for($i = 0; $i < $nav_size; $i++)
{
if(($i + $nav_index) < $nav_pages)
{
$result .= $nav_seperator;
if(($i + $nav_index) == $nav_id) // Catch current page (not clickable)
{
$result .= (($i + $nav_index) + 1);
}
else
{
$result .= '<a href="' . escapeHtml(str_replace('__NAV__', '' . ($i + $nav_index), $url)) . '" title="Pagina (' . (($i + $nav_index) + 1) . ')">' . (($i + $nav_index) + 1) . '</a>';
}
}
else
{
break;
}
}
$result .= ' ';
if($nav_id == ($nav_pages - 1)) // Are last and next button inactive (not clickable)?
{
$result .= '<';
if($show_first_and_last_button)
{
$result .= ' ';
$result .= '<<';
}
}
else
{
$result .= '<a href="' . escapeHtml(str_replace('__NAV__', '' . ($nav_id + 1), $url)) . '" title="Volgende pagina (' . ($nav_id + 2) . ')">></a>';
if($show_first_and_last_button)
{
$result .= ' ';
$result .= '<a href="' . escapeHtml(str_replace('__NAV__', '' . ($nav_pages - 1), $url)) . '" title="Laatste pagina (' . $nav_pages . ')">>></a>';
}
}
}
else
{
return false;
}
}
else
{
return false;
}
return $result;
}
// Escape HTML characters from a string
function escapeHtml($string)
{
$string = str_replace('&', '&', $string);
$string = str_replace('<', '<', $string);
$string = str_replace('>', '>', $string);
$string = str_replace('"', '"', $string);
return $string;
}
?>
/*
Deze functie creëerd een pagina-subnavigatie.
$url: Geeft de URL waarnaar moet worden verwezen. Gebruik __NAV__ om aan te geven waar de paginanummer moet
worden ingevoegd in de URL. Zit er geen __NAV__ in de url, dan geeft de functiee altijd een FALSE als
resultaat.
Bijvoorbeeld: index.php?page=blah&subpage=mehh&nav=__NAV__
of /blah/mehh/__NAV__/
$number_of_items: Totaal aantal items
$nav_id: De nav_id die nu getoond wordt (Pagina's lopen van 0 tot N, maar worden aan de front-end altijd met 1 verhoogd zodat de bezoeker denkt dat de eerste pagina 1 is i.p.v. 0)
$items_per_page: Aantal items dat op 1 pagina getoond wordt
$nav_size: De maximale breedte van de navigatiebalk, exclusief de <<, <, > en >> symbolen.
$nav_seperator Het scheidingsteken tussen de verschillende items
Bijvoorbeeld, met als scheidingsteken: ' | '
<< < 1 | 2 | 3 | 4 | 5 | 6 | 7 > >>
Is er geen navigatie nodig omdat het totaal aantal items kleiner is dan het aantal items dat op 1 pagina getoond wordt, dan
geeft de functie FALSE als resultaat. De navigatie moet dan ook altijd zo getoond worden:
$nav = createNavigation(<arguments>);
if($nav)
{
print($nav);
}
*/
function createNavigation($url, $number_of_items = 0, $nav_id = 0, $items_per_page = 10, $nav_size = 7, $nav_seperator = ' | ', $show_first_and_last_button = true)
{
$result = '';
if($items_per_page < 1)
{
$items_per_page = 10;
}
if($number_of_items > $items_per_page) // See if a subnav is required
{
$nav_pages = ceil($number_of_items / $items_per_page); // Calculate total numerber of pages
// Validate current page
if($nav_id && isInt($nav_id))
{
if($nav_id >= 1)
{
if($nav_id >= $nav_pages) // Pagenumber out of range
{
$nav_id = 0;
}
}
else
{
$nav_id = 0;
}
}
else
{
$nav_id = 0;
}
// See at what index the subnav should start
$nav_index = 0;
if($nav_id < floor($nav_size / 2))
{
$nav_index = 0;
}
else
{
$nav_index = $nav_id - floor($nav_size / 2);
if(($nav_index + $nav_size) >= $nav_pages)
{
$nav_index = $nav_pages - $nav_size;
}
if($nav_index < 0)
{
$nav_index = 0;
}
}
// See if the given URL contains the __NAV__ (otherwise we dont know where to insert the pageid)
if(stristr($url, '__NAV__'))
{
if($nav_id == 0) // Are first and previous button inactive (not clickable)?
{
if($show_first_and_last_button)
{
$result .= '>>';
$result .= ' ';
}
$result .= '>';
}
else
{
if($show_first_and_last_button)
{
$result .= '<a href="' . escapeHtml(str_replace('__NAV__', '0', $url)) . '" title="Eerste pagina (1)"><<</a>';
$result .= ' ';
}
$result .= '<a href="' . escapeHtml(str_replace('__NAV__', '' . ($nav_id - 1), $url)) . '" title="Vorige pagina (' . $nav_id . ')"><</a>';
}
// Print all pages (from $nav_index -> $nav_size)
for($i = 0; $i < $nav_size; $i++)
{
if(($i + $nav_index) < $nav_pages)
{
$result .= $nav_seperator;
if(($i + $nav_index) == $nav_id) // Catch current page (not clickable)
{
$result .= (($i + $nav_index) + 1);
}
else
{
$result .= '<a href="' . escapeHtml(str_replace('__NAV__', '' . ($i + $nav_index), $url)) . '" title="Pagina (' . (($i + $nav_index) + 1) . ')">' . (($i + $nav_index) + 1) . '</a>';
}
}
else
{
break;
}
}
$result .= ' ';
if($nav_id == ($nav_pages - 1)) // Are last and next button inactive (not clickable)?
{
$result .= '<';
if($show_first_and_last_button)
{
$result .= ' ';
$result .= '<<';
}
}
else
{
$result .= '<a href="' . escapeHtml(str_replace('__NAV__', '' . ($nav_id + 1), $url)) . '" title="Volgende pagina (' . ($nav_id + 2) . ')">></a>';
if($show_first_and_last_button)
{
$result .= ' ';
$result .= '<a href="' . escapeHtml(str_replace('__NAV__', '' . ($nav_pages - 1), $url)) . '" title="Laatste pagina (' . $nav_pages . ')">>></a>';
}
}
}
else
{
return false;
}
}
else
{
return false;
}
return $result;
}
// Escape HTML characters from a string
function escapeHtml($string)
{
$string = str_replace('&', '&', $string);
$string = str_replace('<', '<', $string);
$string = str_replace('>', '>', $string);
$string = str_replace('"', '"', $string);
return $string;
}
?>
Bas:
Als 'newbie' is dit veel gemakkelijker te gebruiken dan een het script dat jij als link post Frank. Dat wil niet zeggen dat ik dit beter vindt, maar ik vindt wel dat je ook moet kijken naar de doelgroep die je met dit script wilt bereiken. De snelheid waarmee je dit kunt gebruiken is enkele minuten en het is niet slecht geprogrammeerd. Leuke toevoeging in mijn ogen dus.
Dankje Bas :-). Jij ziet mijn doel tenminste. Frank gaat weer allemaal ingewikkeld en technisch lopen kijken. Daar gaat het hier nou eenmaal niet om, gewoon de snelheid die het qua scripten oplevert. Ik zal die niet bestaande pagina's even afvangen. Het probleem met de nul kan ik op zich wel inkomen, maar vind ik nou niet van het hoogste plankje gegrepen. Zal het daarentegen wel voor je aanpassen.
Om te reageren heb je een account nodig en je moet ingelogd zijn.
Inhoudsopgave
Labels
- Geen tags toegevoegd.
PHP hulp
0 seconden vanaf nu