Spoiler tonen
Lennard (link):
Dan forum.php.
Hier hebben we alleen de datum + tijdstip nodig van de klik op "markeer alle topics als gelezen" waarbij het forum id van die klik gelijk is aan het forum id van het forum waar je nu in zit zegmaar.
Die haal je dus ook op.
Merk trouwens wel op dat je alleen de grootste datum hiervan wilt. Als mensen 10 keer op die link klikken, wil je de datum + tijdstip van de laatste klik; geen enkele andere.
De rest hiervan is een stuk makkelijker dan index.php.
Je haalt nu weer alle topics op uit je topictabel en doorloopt die weer (met een while).
Tijdens dat doorlopen ga je er weer van uit dat elk topic ongelezen is, tenzij je anders hebt geconstateerd.
Een topic is namelijk gelezen als een van de volgende voorwaarden geldt:
- De datum van de laatste post van dat topic is kleiner dan de datum van de klik op "markeer alle fora als gelezen"
- De datum van de laatste post van dat topic is kleiner dan de datum van de klik op "markeer alle topics als gelezen" voor dit betreffende forum
- De datum van de laatste post van dat topic is kleiner dan de datum van je laatste bezoek aan dit topic
In topic.php hoef je eigenlijk niets te doen; enkel een record opslaan dat het topic op dit moment is bekeken.
Als je het echt goed wilt doen sla je enkel de laatste post op die is bekeken (sommige bezoekers bezoeken enkel pagina 1 van een topic, terwijl het topic bijvoorbeeld 10 paginas heeft). Je gaat dan niet met datums vergelijken, maar met post ids. Je kunt dan ook een icoontje voor een post zetten om te laten blijken dat die gelezen danwel ongelezen is. Net als bij phpBB zegmaar. Je kunt een gebruiker dan ook direct doorsturen naar zijn laatst gelezen post. Maarja, dan wordt het weer een stuk moeilijker.
Anyway, dit is in grote (geloof me, hele grote
) lijnen wat je moet doen.
Als je niet zo ervaren bent met PHP en MySQL dan raad ik je het echt serieus af. Het is leuk om het eens te proberen dan, maar baal niet te hard als het je niet lukt.
Je krijgt echt enorm lange queries die uit enorm veel verschillende tabellen data halen, dus de kans dat er "ergens" een fout zit is enorm groot. Dan moet je je hoofd koel houden en die fout die "ergens" zit, zien te ontdekken en op te lossen.
Zoals Ruben al zei; ik heb er vreselijk lang over gedaan om het 100 % werkend te krijgen, dus het is sowieso niet iets wat je in een vrij avondje effies in elkaar zet.
Ik heb dit hele verhaal in een word documentje zitten typen, dus als je liever een overzichtelijkere PDF hebt dan zeg je t maar.
Succes ermee.
Lennard.
Heb m nu niet doorgeelzen, dus geen idee of ik nog steeds achter die werkwijze sta en of het niet handiger kan (het forumsysteem hier heb ik al een paar keer veranderd), maar deze methode werkt iig.
Thx voor de goede basis
het is me gelukt, ik heb het wel wat anders gedaan dan jij beschrijft.
Lennard schreef:Dat was alweer index.php"¦Ok, mijn uitleg. Zeg alsjeblieft achteraf niet dat je t laat zitten.
Je moet je forum even heel abstract in je hoofd hebben. Je hebt dan een tweetal soorten gelezen / ongelezen situaties:
1. In het topicoverzicht ("in dit topic staat >= 1 post die je nog niet gezien hebt")
2. In het forumoverzicht ("in dit forum staat een topic met >= 1 post die je nog niet gezien hebt")
Dan moet je je definities gaan maken: Wanneer is een post ongelezen? Wanneer is een topic ongelezen? Wanneer is een forum ongelezen? Datzelfde voor de ongelezen dingen. Met zulke ingewikkelde dingen kom je er gewoonweg niet uit als je maar "˜ergens begint en wat aanmoddert.
De definities:
1. Wanneer is een post gelezen?
Een post is ongelezen als de datum en tijdstip van plaatsing hoger is dan de datum en tijdstip van je laatste bezoek aan dit topic.
2. Wanneer is een topic ongelezen?
Een topic is ongelezen als de datum en tijdstip van de laatste post in het betreffende topic hoger is dan de datum en tijdstip van je laatste bezoek aan dit topic.
3. Wanneer is een forum ongelezen?
Een forum is ongelezen als de datum en tijdstip van de laatste post in een topic in het betreffende forum hoger is dan de datum en tijdstip van je laatste bezoek aan het bijbehorende topic in dit forum.
Maar dan ben je er nog niet. Je wilt niet iedere gebruiker verplichten om álle topics door te kijken, dus je wilt nog een tweetal linkjes; "Markeer alle fora als gelezen" en "Markeer alle topics als gelezen".
Die moet je dan ook nog in je definities verwerken:
1. Wanneer is een post gelezen?
Een post is ongelezen als de datum en tijdstip van plaatsing hoger is dan de datum en tijdstip van je laatste bezoek aan dit topic.
MAAR:
Een post is gelezen als de datum en tijdstip van de plaatsing lager is dan de datum en tijdstip van de laatste klik op "Markeer alle fora als gelezen", of als de datum en tijdstip van de plaatsing lager is dan de datum en tijdstip van de laatste klik op "Markeer alle topics als gelezen".
2. Wanneer is een topic ongelezen?
Een topic is ongelezen als de datum en tijdstip van de laatste post in het betreffende topic hoger is dan de datum en tijdstip van je laatste bezoek aan dit topic.
MAAR:
Een topic is gelezen als de datum en tijdstip van de plaatsing van de laatste post lager is dan de datum en tijdstip van de laatste klik op "Markeer alle fora als gelezen", of als de datum en tijdstip van de plaatsing lager is dan de datum en tijdstip van de laatste klik op "Markeer alle topics als gelezen".
3. Wanneer is een forum ongelezen?
Een forum is ongelezen als de datum en tijdstip van de laatste post in een topic in het betreffende forum hoger is dan de datum en tijdstip van je laatste bezoek aan het bijbehorende topic in dit forum.
MAAR:
Een forum is gelezen als de datum en tijdstip van de plaatsing van de laatste post lager is dan de datum en tijdstip van de laatste klik op "Markeer alle fora als gelezen".
Ja, t klinkt makkelijker dan het is.
Dan ga je heel voorzichtig een database opzet maken.
In die opzet moeten onder andere deze gegevens zitten:
- forum_berichten_alles_gemarkeerd (bevat alle kliks op "Markeer alle topics als gelezen")
o id van de gebruiker
o datum + tijdstip van de klik
o id van het forum
- forum_forums_alles_gemarkeerd (bevat alle kliks op "Markeer alle fora als gelezen")
o id van de gebruiker
o datum + tijdstip van de klik
- forum_berichten_gelezen (bevat alle views van de topics)
o id van de gebruiker
o id van het topic
o datum + tijdstip van de klik
Je moet je script en database(opzet) dus zo maken, dat hij alle bovengenoemde data op kan slaan en ook daadwerkelijk opslaat.
Ja, je krijgt dan enorm veel data, maar dat maakt als je de goede indices (meervoud van "˜index) hebt, niet uit; ik heb dit forum met een paar miljoen testposts geteld, en het werkte nog steeds zonder noemenswaardige vertragingen.
Welke indices je moet hebben moet je zelf maar uitzoeken, ik ga niet alles voorkauwen.
Dan maak je een drietal bestanden; index.php (overzicht van alle fora), forum.php (overzicht van alle topics in dat forum), topic.php (overzicht van alle posts in dat topic).
Dan begint het echte kutwerk pas.
We beginnen met index.php.
Allereerst ga je de datum + tijdstip van de laatste klik op "Markeer alle fora als gelezen" ophalen. Je kunt dat in je fora-ophaal-query stoppen, maar dan wordt het alleen maar onoverzichtelijker en ingewikkelder (nog ingewikkelder).
Als je dat hebt gedaan haal je ook de datum + tijdstip op van de laatste klik op "Markeer alle topics als gelezen".
Als een van beide tijdstippen groter is dan het tijdstip van de laatste post in het betreffende forum, dan is het forum sowieso ongelezen, anders weet je het nog niet (je kunt immers ook gewoon alle posts gelezen hebben).
Let wel op dat de datum en tijd van de klik op "Markeer alle topics als gelezen" verschilt per forum; je kunt in het ene forum wel op die link hebben geklikt, maar op de andere niet. Je moet dus een leuke array maken met het forum id en de timestamp van je klik erop.
Dan maak je een query om alle fora en de bijbehorende de laatste posts op te halen. Hier op one2xs is het nog ingewikkelder, omdat een forum ook weer in een categorie kunt zitten. Maargoed, je haalt dus je data uit vier tabellen:
1. je forumtabel met alle fora erin
2. je poststabel om de laatste post van dat forum op te halen
3. je ledentabel om de auteur van de laatste post op te halen
4. je topictabel om de titel van de laatste post op te halen
Dat doe je dan, en je maakt een mooi loopje om al die fora op te halen en te doorlopen.
Tijd voor een stukje pseudocode:[/spoiler][COLOR= #0000BB]<?php $fora_gelezen_gemarkeerd[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #FF8000]// haal laatste datum + tijd van "markeer alle fora als gelezen";[/COLOR] [COLOR= #0000BB]$topics_gelezen_gemarkeerd[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #FF8000]// haal laatste datum + tijd van "markeer alle topics als gelezen";[/COLOR] [URL="http://www.php.net/while"]while[/URL][COLOR= #007700]([/COLOR]alle forums doorlopen[COLOR= #007700]) {[/COLOR] [COLOR= #0000BB]$gelezen[/COLOR] [COLOR= #007700]=[/COLOR] FALSE[COLOR= #007700];[/COLOR] [COLOR= #FF8000]// we gaan er vanuit dat elk forum ongelezen is, tenzij anders bevonden[/COLOR] [URL="http://www.php.net/if"]if[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$foruminfo[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]tijdstip_laatste_post[/COLOR][COLOR= #007700]] <[/COLOR] [COLOR= #0000BB]$fora_gelezen_gemarkeerd[/COLOR] [COLOR= #007700]||[/COLOR] [COLOR= #0000BB]$foruminfo[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]tijdstip_laatste_post[/COLOR][COLOR= #007700]] <[/COLOR] [COLOR= #0000BB]$topics_gelezen_gemarkeerd[/COLOR][COLOR= #007700]) {[/COLOR] [COLOR= #0000BB]$gelezen[/COLOR] [COLOR= #007700]=[/COLOR] TRUE[COLOR= #007700]; }[/COLOR] [URL="http://www.php.net/else"]else[/URL] [COLOR= #FF8000]// er is nu niet op "markeer alle ... als gelezen" geklikt:[/COLOR] [COLOR= #007700]{[/COLOR] [COLOR= #0000BB]$topics_gelezen[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #FF8000]// haal alle topic ids op waavoor geldt dat de datum van de laatste post van dat topic groter is dan de datum van je laatste bezoek aan dat topic[/COLOR] [URL="http://www.php.net/if"]if[/URL][COLOR= #007700]([/COLOR][URL="http://www.php.net/mysql_num_rows"]mysql_num_rows[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$topics_gelezen[/COLOR][COLOR= #007700]) ===[/COLOR] [COLOR= #0000BB]0[/COLOR][COLOR= #007700])[/COLOR] [COLOR= #0000BB]$gelezen[/COLOR] [COLOR= #007700]=[/COLOR] TRUE[COLOR= #007700];[/COLOR] [COLOR= #FF8000]// er zijn 0 ongelezen topic ids; dus forum is gelezen[/COLOR] [COLOR= #007700]} }[/COLOR] ?>
Dan forum.php.
Hier hebben we alleen de datum + tijdstip nodig van de klik op "markeer alle topics als gelezen" waarbij het forum id van die klik gelijk is aan het forum id van het forum waar je nu in zit zegmaar.
Die haal je dus ook op.
Merk trouwens wel op dat je alleen de grootste datum hiervan wilt. Als mensen 10 keer op die link klikken, wil je de datum + tijdstip van de laatste klik; geen enkele andere.
De rest hiervan is een stuk makkelijker dan index.php.
Je haalt nu weer alle topics op uit je topictabel en doorloopt die weer (met een while).
Tijdens dat doorlopen ga je er weer van uit dat elk topic ongelezen is, tenzij je anders hebt geconstateerd.
Een topic is namelijk gelezen als een van de volgende voorwaarden geldt:
- De datum van de laatste post van dat topic is kleiner dan de datum van de klik op "markeer alle fora als gelezen"
- De datum van de laatste post van dat topic is kleiner dan de datum van de klik op "markeer alle topics als gelezen" voor dit betreffende forum
- De datum van de laatste post van dat topic is kleiner dan de datum van je laatste bezoek aan dit topic
In topic.php hoef je eigenlijk niets te doen; enkel een record opslaan dat het topic op dit moment is bekeken.
Als je het echt goed wilt doen sla je enkel de laatste post op die is bekeken (sommige bezoekers bezoeken enkel pagina 1 van een topic, terwijl het topic bijvoorbeeld 10 paginas heeft). Je gaat dan niet met datums vergelijken, maar met post ids. Je kunt dan ook een icoontje voor een post zetten om te laten blijken dat die gelezen danwel ongelezen is. Net als bij phpBB zegmaar. Je kunt een gebruiker dan ook direct doorsturen naar zijn laatst gelezen post. Maarja, dan wordt het weer een stuk moeilijker.
Anyway, dit is in grote (geloof me, hele grote
) lijnen wat je moet doen.Als je niet zo ervaren bent met PHP en MySQL dan raad ik je het echt serieus af. Het is leuk om het eens te proberen dan, maar baal niet te hard als het je niet lukt.
Je krijgt echt enorm lange queries die uit enorm veel verschillende tabellen data halen, dus de kans dat er "ergens" een fout zit is enorm groot. Dan moet je je hoofd koel houden en die fout die "ergens" zit, zien te ontdekken en op te lossen.
Zoals Ruben al zei; ik heb er vreselijk lang over gedaan om het 100 % werkend te krijgen, dus het is sowieso niet iets wat je in een vrij avondje effies in elkaar zet.
Ik heb dit hele verhaal in een word documentje zitten typen, dus als je liever een overzichtelijkere PDF hebt dan zeg je t maar.
Succes ermee.

Lennard.
Heb m nu niet doorgeelzen, dus geen idee of ik nog steeds achter die werkwijze sta en of het niet handiger kan (het forumsysteem hier heb ik al een paar keer veranderd), maar deze methode werkt iig.
Thx voor de goede basis
het is me gelukt, ik heb het wel wat anders gedaan dan jij beschrijft.