[PHP] Forum topic met meerdere pagina's

Pagina: 1
Acties:
  • 236 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • truegrit
  • Registratie: Augustus 2004
  • Laatst online: 19-09 19:31
Hallo,

zoals de topictitel wil vermoeden ben ik bezig met een simpel forumpje voor school. Ik probeer nu een systeem zoals hier op GoT te maken voor topics met meerdere pagina's. Dus als er meerdere pagina's zijn, dat er dan zo een dingetje bovenin en onderin komt te staan met nummers van pagina's.

Op zich leek het me wel makkelijk, maar ik zit dus met het probleem hoe je het zo doet dat als je tussen pagina 1 en 12 zit, dat hij dan de eerste 12 pagina's laat zien, dan een paar stipjes, en dan de laatste 4 pagina's. (voorbeeld hier). Als je dan op de 12 drukt, gaat hij "los" van de eerste 4. Aan het einde zit hetzelfde principe.

Mijn vraag is dus; hoe los ik dit in godsnaam op? ik zit hier echt helemaal vast, kan wel komen door vermoeidheid ofzo, maar ik zie hier echt geen oplossing voor die redelijk simpel te doen is, en ook nog een beetje snel is.

Ik had een paar opensource forums bekeken, maar die maken allemaal gebruik van een ander systeem, en de sourcecode van React is volgens mij niet gratis verkrijgbaar.

alvast bedankt :)

hallo


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Probeer voor jezelf eerst eens in woorden op te schrijven wat je wilt. Bedek daarbij alle mogelijkheden. (1 pagina, 2 pagina's, 4 pagina's, meer dan 6 pagina's, etc) Dan ga je kijken hoe je dat in code kunt omzetten.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Op GoT werkt het ongeveer zo volgens mij (stel dat 'totaal' het aantal pagina's is dat je weer wilt geven): de pagina waar je ben is altijd zichtbaar, plus de pagina ervoor en erna. Verder zie je altijd de eerste 4 pagina's en de laatste 4. Dus stel je ben op pagina 2, dan geef je de laatste 4 weer, plus aan het begin geef je weer wat je kunt (totaal - 4), ertussen zet je .... Ben je op de 1-na-laatste pagina, dan geef je de eerste 4 weer, dan ..., dan de laatste (totaal - 4) vanaf het eind. Ben je in het midden dan geef je de eerste 4 weer, plus de laatste 4, plus de pagina's in het midden (totaal - 8 ).

Dus in het topic wat je als voorbeeld gaf: zodra er op 12 geklikt word, past 13 er niet meer bij op. Dat betekent dat we in het midden van het topic zijn beland. Dus worden dan de 4 eerste weergegeven, plus de 4 laatste, plus alles wat er nog tussen past :)

Ik weet natuurlijk niet of het echt zo werkt in react, maar zo zou ik het ongeveer doen...

Acties:
  • 0 Henk 'm!

Verwijderd

nu nog het aantal paginas => ceil(aantal rijen / aantal items per pagina)

en dan per pagina al de juiste dingen weergeven doe je in de LIMIT van je sql

Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 11:52

AW_Bos

Liefhebber van nostalgie... 🕰️

Haal het getal wel uit een hard opgeslagen veld dan. Want als je dit gaat doen op een topiclist bijv, om het aantal pagina's te tellen, draai je zat queries, en dat is niet zo bevorderlijk voor de performance...

[ Voor 8% gewijzigd door AW_Bos op 18-06-2006 00:32 ]

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:29

crisp

Devver

Pixelated

Grote prutser schreef op zaterdag 17 juni 2006 @ 23:27:
Ik weet natuurlijk niet of het echt zo werkt in react, maar zo zou ik het ongeveer doen...
React doet daar niets mee, de pagina-nummering hier op GoT is een custom functie die vanuit de templates wordt aangeroepen met als parameter het huidige paginanummer en het totaal aantal pagina's ;)
En inderdaad, het algorithme is een leuke exercitie. In feite bepaal ik op voorhand waar de huidige pagina zich bevind in het totaalplaatje en waar ik moet 'skippen' en waar ik dan moet verder gaan. Vervolgens loop ik alle pagina's af totdat ik op dat punt ben beland, daar sla ik dan dus een aantal pagina's over en bepaal of ik eventueel verderop nog een keer moet skippen.

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
AW_Bos schreef op zondag 18 juni 2006 @ 00:32:
Haal het getal wel uit een hard opgeslagen veld dan. Want als je dit gaat doen op een topiclist bijv, om het aantal pagina's te tellen, draai je zat queries, en dat is niet zo bevorderlijk voor de performance...
Met één juiste query kun je zowel een lijst met topics als het aantal posts in elk topic opvragen, mist je databasestructuur goed is.

Daarnaast is een zeer eenvoudige oplossing deze:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// variabelen al beschikbaar: $totalposts, $posts_per_page, $currentpage
$pages = ceil($totalposts/$posts_per_page);
$pagenumbers = array();

// eerste 3
for($i=1; $i<=$pages && $i<=3; $i++) {
  $pagenumbers[] = $i;
}

// laatste 3
for($i=max(1, $pages-3); $i<=$pages; $i++) {
  $pagenumbers[] = $i;
}

// middelste 3
for($i = max(1,$currentpage-1); $i <= min($pages, $currentpage+1); $i++) {
  $pagenumbers[] = $i;
}

// dubbele weghalen en sorteren
$pagenumbers = array_unique($pagenumbers);
sort($pagenumbers);

Je hebt dan alle pagina's die je weer wilt geven. Probeer het helemaal te begrijpen (ook met min en max), en gebruik het om de linkjes te maken.

[ Voor 9% gewijzigd door GlowMouse op 18-06-2006 00:57 . Reden: paginanummers beginnen met 1 ]


Acties:
  • 0 Henk 'm!

  • truegrit
  • Registratie: Augustus 2004
  • Laatst online: 19-09 19:31
@glowmouse, dit is ongeveer wat ik ook had, en het probleem daarmee is is dat het niet de paginanummers aan elkaar linked, zoals GoT dat zo mooi doet.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$currentpage = 8, $totalposts = 2, $posts_per_page = 2
Array
(
    [0] => 1
    [1] => 2
    [2] => 3 // hier gaat hij van 3
    [3] => 5 // naar 5
    [4] => 6
    [5] => 7
    [6] => 8 // dit is de pagina
    [7] => 9
    [8] => 10
    [9] => 11
    [10] => 22
    [11] => 23
    [12] => 24
    [13] => 25
)


Wat ik dus zou willen is dat hij die 11 helemaal weglaat, en de middelste verzameling getallen naar voren schuift, dus 4 t/m 10. Daar struikel ik nu nog over.

Overigens probeer ik het nu alleen in het topic zelf te maken, dus dan moet je zowiezo een aparte query maken omdat het nergens anders gebruikt word.

Ik ga zometeen zelf even pseudocode proberen te maken voor het probleem, met de tips van bovenstaande posts.

hallo


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
$currentpage = 8, $totalposts = 2, $posts_per_page = 2
Dit is een onmogelijke situatie: er zijn geen 8 pagina's.
Wat ik dus zou willen is dat hij die 11 helemaal weglaat, en de middelste verzameling getallen naar voren schuift, dus 4 t/m 10. Daar struikel ik nu nog over.
Er móet toch ergens een punt zijn waarop je wel wat ruimte laat tussen de eerste links en het middelblok?

Acties:
  • 0 Henk 'm!

  • truegrit
  • Registratie: Augustus 2004
  • Laatst online: 19-09 19:31
GlowMouse schreef op zondag 18 juni 2006 @ 12:42:
[...]

Dit is een onmogelijke situatie: er zijn geen 8 pagina's.
het moest 50 posts zijn, mijn excuses
[...]

Er móet toch ergens een punt zijn waarop je wel wat ruimte laat tussen de eerste links en het middelblok?
Ja en dat is wat ik probeer te vinden. Het punt ligt ongeveer op het moment dat de $current_page niet meer past in de verzameling begingetallen (1 2 3) plus de getallen om de huidige pagina, en dat alles - 1. Dus bijvoorbeeld: huidige pagina is 8, begingetallen is 1 2 3, de extra getallen zijn 5 6 7 8 9 10 11. Nu wil ik eigenlijk dat zolang de $current_page nog in de verzameling 1 2 3 4 5 6 7 8 9 past, dat hij dan 1 2 3 4 5 6 7 8 9 10 plaatst, maar zodra het 10 word, dat hij dan 1 2 3 ... 7 8 9 10 11 12 13 ... etc er van maakt. Hetzelfde geld voor het einde.
Waarschijnlijk iets van:
PHP:
1
2
3
$spread = 3; // hoe ver hij moet gaan
if ($spread * 2 + $spread > $current_page) { /* schrijf eerste getallen weg */ }
else { /* schrijf eerste 3 getallen weg, dan ... en dan de reeks van $current_page - 3 tot en met $current_page + 3 */ }


Nu ik het zo typ, denk ik dat ik al wat verder kan :P

hallo

Pagina: 1