gelezen / ongelezen iconen
Hoe werkt de structuur bij een forum (like phpBB of iets) met iconen bij topics dat ie veranderd dat wanneer je het topic heb gelezen en als er een nieuw topic komt wat je nog niet hebt gelezen dat het icoon dan veranderd naar ongelezen.
Die icon's staan in een map als bijvoorbeeld 'gelezen.png' en 'ongelezen.png' (en dan nog een X aantal meer). In de database staat een veld 'gelezen' als boolean. Dan komt er een stukje code wat lijkt op:
Code (php)
Dit was wel erg simpel trouwens.
Code (php)
1
2
3
4
2
3
4
<?php
$img = ($row['gelezen']) ? 'gelezen.png' : 'ongelezen.png';
echo '<img src="images/' . $img . '" alt="" />';[/code]
$img = ($row['gelezen']) ? 'gelezen.png' : 'ongelezen.png';
echo '<img src="images/' . $img . '" alt="" />';[/code]
Code (php)
1
2
3
2
3
<?php
echo '<img src="images/' . (($row['gelezen']) ? 'gelezen.png' : 'ongelezen.png') . '" alt="" />';
?>
echo '<img src="images/' . (($row['gelezen']) ? 'gelezen.png' : 'ongelezen.png') . '" alt="" />';
?>
Nou, hier zijn cookies handig voor. Je kunt bijvoorbeeld het id van een gelezen topic opslaan en daarbij ook het id van de laatste post van dat topic. Als de laatste post hetzelfde id heeft, dan heb je hem gelezen. Zo niet? Dan is het ongelezen.
Staat het hele topic-id niet in de cookie? Dan heb je hem nog niet gelezen.
Opslaan wat je gelezen hebt. Dat is het principe.
Overigens denk ik niet dat je een boolean voor gelezen/niet gelezen moet opslaan. Ik denk eerder dat je een waarde zoals 'last viewed' of zoiets moet opslaan. Zodra er weer berichten zijn die voorbij 'last viewed' gaan, dan weer ongelezen maken.
Ja, een database kan, als mensen ingelogd moeten zijn, zo niet zou dit op ip moeten en dan vind ik zelf cookies handiger. Over 'last viewed' gesproken: Dat bedoelde ik, alleen ik heb het blijkbaar niet goed omschreven.
Ik bedoelde het zo:
Bij topic-id 2 is het laatste bericht-id 12 (niet bericht 12, het kan zijn dat er maar 1 bericht is, maar dat bericht heeft dan id 12)
Bij topic-id 23 is dit bericht-id 92.
Een cookie dat dat topic op 'gelezen' staat en als iemand post dat dat cookie weer veranderd wordt in ongelezen ofzoiets? Ik heb echt geen idee hoe dat ten werk gaat. Da's ook het enige wat ik me al hardstikke lang zit af te vragen.
Miloan had trouwens gelijk. ("Nee, ik denk dat hij bedoelt hoe PHP weet of je iets al hebt gelezen of niet.").
Gewijzigd op 01/01/1970 01:00:00 door GI ACE
En ook dat ie het laatste ID nacheckt in dat topic, maar dat ie dat wel weer vernieuwd als een nieuw iemand erin post zodat die ook weer op ONGELEZEN moet gaan staan... =O
Cookies zijn kleine stukjes data, gegevens. Je slaat gegevens op op de computer van de gebruiker.
Dit doe je ook bij een database, alleen DAN staat het op de server, houd je het centraal.
Op cookies is minder controle dan op een database, omdat de cookies gewijzigd kunnen worden op de computer van de gebruiker. Echter heeft dit geen invloed op belangrijke systemen, alleen dat iets wat als 'gelezen' is opgeslagen, als 'ongelezen' wordt getoond. Wat maakt het uit? Schuld van degene die het bewerkt heeft.
Cookies staan dus op een computer en deze worden bij ELKE pagina die opgevraagd wordt meegestuurd. Bij een database zou je de gebruiker eerst nog moeten herkennen.
De structuur van het opslaan van gelezen/ongelezen is hetzelfde:
In geval van een forum (kan ook bij gastenboek en bij veel andere dingen ook, maar bij een forum is het het uitgebreidst, doordat je meerdere topics hebt):
Persoon A gaat naar een topic, met als topic-ID 20. We willen dat de volgende keer dat een pagina geladen word, de computer weet: Persoon A is op topic 20 geweest.
Dus we slaan op dat Persoon A in topic 20 is geweest.
Bij cookies kun je gewoon een cookie zetten, waarin staat topic 20, bij een database moet je topic 20 en iets waar je de gebruiker aan herkent (een gebruikersnaam of ip o.id.)
Het script kijkt welke topics geopend zijn in het verleden en deze markeerd hij als gelezen. (dit is immers in ofwel cookies, ofwel database opgeslagen)
Maar nu, Persoon B opent topic-ID 20 en die schrijft een nieuw bericht erin. Er is nu een topic-bericht en een reactie erop. Persoon A heeft de reactie van persoon B nog niet gelezen. Het bericht heeft een bericht-ID van 35.
Als persoon A nu het forum opent, staat er dat hij het topic gelezen heeft, hoewel er een nieuw bericht is gepost. Dit komt omdat er alleen gecontroleerd word of in het verleden het bericht geopend is.
Nu komt hier de truc: We slaan op welke post BOVENAAN de pagina staat: Bij persoon A zou dat ID 20 zijn, bij persoon B ID 35.
In het huidige topic is het ID 35. Dit komt niet overeen met het ID dat bij persoon A staat. Dus persoon A heeft nog een gedeelte van het topic niet gelezen!
Nu ik dit aan het typen ben, denk ik ook opeens dat je dit met tijd kunt doen: Sla op wat de laatste keer is dat de gebruiker het topic geopend heeft. Als de LAATSTE post dan later is dan de tijd die opgeslagen is, dan weet je ook dat er een nieuwe post is.
Ik hoop dat je het nu snapt. Ik heb het zo uitgebreid mogelijk geprobeerd te verwoorden.
Edit:
Onthoudt dus: De gegevens zeggen niet of het de laatste post is of niet. Als er een nieuwe post gepost word, dan veranderen deze gegevens niet. Echter kun je wel AFLEIDEN uit de gegevens of de laatste post al gelezen is. Elke keer als de gebruiker de pagina op komt, moeten de gegevens geüpdate worden!
Miloan
Gewijzigd op 01/01/1970 01:00:00 door Mark L
Maar... cookies verlopen toch na 1 jaar ofzo?
1 seconde, 1 minuut, 1 uur, 1 dag, 1 week, 1 maand, 1 jaar, 1 decennia, ...
Als je gewoon een tijd van verloop zet in de verre toekomst (bijvoorbeeld 10 jaar later..) dan verloopt de sessie pas na 10 jaar, tenzij deze gewijzigd wordt door ofwel de server ofwel de gebruiker.
Maar stel je voor, je hebt eindelijk een goed systeem gemaakt wat werkt, en diegene verwijderd zijn cookies in zijn web-browser, dan staan alle topics toch weer gewoon op ongelezen?
Giace schreef op 12.11.2009 17:58:
Maar stel je voor, je hebt eindelijk een goed systeem gemaakt wat werkt, en diegene verwijderd zijn cookies in zijn web-browser, dan staan alle topics toch weer gewoon op ongelezen?
Voor die gebruiker dan wel ja. Daarom moet je ook gewoon met een database werken. Gebruiker moet toch al inloggen dus ik neem aan dat ie een ID heeft. Die ID sla je ergens op met de topic en een datum van laatst geplaatst bericht ofzo. En dan check je gewoon er een nieuw bericht is geplaatst waarvan de datum nieuwer is als ie in de database. Succes.
(Daarvoor moet ie dus ook meerdere queries uitvoeren in 1 code).
edit: wat ik probeer duidelijk te maken is dat ik natuurlijk wel een 'markeer board als gelezen' en 'markeer alle boards als gelezen' functie wil maken. ;)
Gewijzigd op 01/01/1970 01:00:00 door GI ACE