Gelezen/ongelezen systeem?

Gestart doorMiel23 reacties242 weergaven

24 berichten · pagina 1 van 2

Miel

Lid · Topicstarter

Berichten
4.462
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Weet iemand hoe je het best een gelezen/ongelezen systeem voor forum kan maken?
0
Berichten
747
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Is heel moeilijk. Je moet dus per user bijhouden welk topic ze hebben bekeken, zorg dat je alles gewoon als los record in de db zet en dus niet met scheidingstekens, vervolgens zul je toch heel wat ingewikkelde queries moeten gaan maken.

Veel php ervaring is dus wel vereist.
0
Miel

Lid · Topicstarter

Berichten
4.462
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Kijk.. Ik kreeg de tip van Lennard om dit topic te openen zodat iedereen zn mooie uitleg straks kon bewonderen.emo Vanavond post hij het.

En ik wil liever een koppel tabel gebruiken.
Ik weet ook wel hoe ik dit kan doen.. Maar hoe het beste, dus de optimalisatie.
0
Berichten
2.950
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Die gozer heeft er echt maanden over gedaan het systeem goed en draaiend te krijgen yummie
0
Berichten
747
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
emo Heb het zelf ook onlangs gemaakt, heb echt uren zitten kloten. Aangezien je ook nog zit met links markeer alles als gelezen en dan per categorie of het hele forum. Je krijgt dus hele lange queries met veel joins, group by enz.
Maar als lennard het vanavond post dan wachten we daar wel even op smile
0
Berichten
536
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
dan zal ik hem voor zijn yummiekijk, je hebt een tabel met berichten waarschijnlijk,
Dan voeg je daar een kolom aan toe, de kolom "gelezen"
en dan doe je bij het uitlezen uit de tabel in de inbox,
dat hij als gelezen 1 is een niet gelezen icon geeft
en als gelezen 0 is, hij een gelezen icon krijgt.

En dan doe je op het moment dat je een message bekijkt,
UPDATE SET gelezen=0
en dit kan je natuurlijk veel verder uitbouwen wink
0
Berichten
35.796
Reputatie
1
Punten
0,00
Lid sinds
Laatst gezien
Cruwdy schreef:
dan zal ik hem voor zijn yummie
kijk, je hebt een tabel met berichten waarschijnlijk,
Dan voeg je daar een kolom aan toe, de kolom "gelezen"
en dan doe je bij het uitlezen uit de tabel in de inbox,
dat hij als gelezen 1 is een niet gelezen icon geeft
en als gelezen 0 is, hij een gelezen icon krijgt.

En dan doe je op het moment dat je een message bekijkt,
UPDATE SET gelezen=0
en dit kan je natuurlijk veel verder uitbouwen winkt Gaat over een forum he; je kunt dus niet gelezen = 1 doen, want je hebt niet per gebruiker per post een rij data.

Vanavond zal ik uitleg typen. cry emo
0
Berichten
536
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
ooh sorry, dan heb ik het verkeerd begrepen / te snel gelezen hypocrite
0
Berichten
13.482
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
je kan ook je hele database vol maken biggrin
gewoon een tabel met de naam `ongelezen`

en dan 3 velden: user_id & forum_id & tijd

dan moet je bij het posten wel een leuk ding doen dat hij heel veel aan die tabel toevoegd, maar dat blijf je hebben.

en dan kan je ook leuk doen dat als tijd meer dan 31 dagen is, dat hij gedelete word uit database =d
0
Berichten
747
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Laat lennard het nou maar even uitleggen, het is veel ingewikkelder als dat. Je hebt ook te maken met forum overzicht waar je allerlei ingewikkelde queries moet uitvoeren.
0
Berichten
35.796
Reputatie
1
Punten
0,00
Lid sinds
Laatst gezien
Ok, mijn uitleg. Zeg alsjeblieft achteraf niet dat je t laat zitten. emo
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. emo
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. yummie
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:

[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]
?>


Dat was alweer index.php"¦
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 cry) 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. emo
Lennard.
0
Berichten
6.485
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
succes met lezen milan wink
ik val al dood als ik ernaar kijk o_o
0
Miel

Lid · Topicstarter

Berichten
4.462
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Bedankt Lennard, ik neem het letterlijk mee mijn graf in..emoMaar als ik het goed begrijp dus een tabel, met lidid, topicid en laatste view?
0
Berichten
35.796
Reputatie
1
Punten
0,00
Lid sinds
Laatst gezien
Haha, ook goed. emo
0
Miel

Lid · Topicstarter

Berichten
4.462
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Ik merk het al.. Het gaat langer dan een maandje duren..emo
0

Jouw reactie

Deel je idee, stel een vraag of help een ander verder.

Editor laden…

Praat mee met de One2xs-community.

Inloggen om te reageren