Teoretsko pitanje: kako saznati koja tema je pročitana?

Stavljam u podforum “PHP” iako mi treba teoretski odgovor. Naime, ne mogu nikako naći jednostavno rješenje na (kako mi se čini) skroz jednostavno pitanje. Recimo da razvijam forum, i sada kod prikaza podforuma i tema moram prikazati ikonicu koja je različita ovisno je li u toj temi/podforumu ima novih postova koje korisnik nije pročitao.

Dakle, ja posjetim podforum i unutra je jedna nepročitana tema. Kraj nje je ikonica, nazovimo je “on.gif”. Uđem u temu, pročitam što ima unutra, vratim se na forum i želim da mi je sada prikazana ikonica “off.gif”.

Pada mi na pamet da je u bazi podataka evidencija za svakog korisnika koju temu je kada zadnji put posjetio, ali to je jednostavno suludo jer dolazi do problema ako postoji 20 tisuća korisnika i 500 tisuća tema.

Sigurno postoji jednostavnije rješenje koje mi trenutno ne pada na pamet. Ima netko nekakvu ideju?

Zahvaljujem!

Za to se koristi cookie, često u kombinaciji sa bazom. Obično se ne prati posjeta baš svake teme, već se određeno vrijeme nakon posjete svi threadovi označe kao pročitani i traking kreće od tog timestampa do iduće posjete. Primjetiti ćeš da je tako i ovdje na forumu.

Heh, to mi je malo preteoretski. Pretpostavio sam da se radi o kolačićima, ali bih volio malo detaljnije, ako imaš iskustva (i volje:))… Recimo baš vBulletin ima fino sređeno - sad ako se vratim na PHP podforum, jedna tema je boldana. Uđem u nju i onda se odmah vratim natrag na podforum - tema više nije boldana. Što se točno dogodilo?

Ima nekoliko načina kako to postići, ali niti jedan sretan jer je u svakom slučaju potrebno baratati gomilom podataka.

SMF koristi tablicu u kojoj logira broj postova u temi prilikom zadnje posjete za svakog korisnika. npr.
u logu je zapisano korisnik: pero, tema id: 1, broj postova prilikom zadnje posjete: 3

kako tema “1” sada ima 4 posta znači da ćemo je označiti kao nepročitanu za tog korisnika. Kada korisnik pogleda temu “1” u tablici ćemo ažurirati zadnju kolinu iz “3” u “4” i time označiti da je korisnik pročitao 4 posta iz te teme.

Kako bi se uštedilo vrijeme i resurse možemo kod logina keširati nepročitane teme u session, provjeravati postove mlađe od tri dana itd…

Nemam iskustva sa Vbulletinom ali imam sa nekim drugim forumima. Za vrijeme trajanja sessiona prati koje si threadove pročitao i drži tu informaciju u cookiju. Nakon isteka sessiona ili odlogiranja informacije se u bazi resetiraju, sve se označi kao pročitano i vrijeme zadnjeg posjeta se bilježi u bazi. Vjerojatno svi forumi rade za sličan način. Naišao sam na forume koji baš bilježe pojedinačno poruke koje si pročitao a koje ne, i pamte tu informaciju između sessiona, no nisam kopao koju metodu točno koriste. Naišao sam na ovaj dokument za phpbb3:

[quote=""]1. Summary of the database entries phpbb3 makes to track unread posts via the database

a. clicking “mark forums read” link on index page:

  -   sets user_lastmark for the user in the users table to the current time 

  -   wipes out all entries for the user in the forums_track table

  -   wipes out all entries for the user in the topics_track table

b. clicking “mark topics read” link on viewforum page for a forum:

  -    sets mark_time for the user and that forum
     in the forums_track table to the current time 

  -    wipes out all entries for the user and that forum
     in the topics_track table

c. opening up existing topic that is already read

  -    does nothing

d. opening up an existing topic that is unread:

  -   via the markread() function, sets mark_time for the user and that topic
     in the topics_track table to the post_time for the last post of the last page
     in the topic that the user read

  -   if there are no other unread topics in the relevant forum,
     then via the update_forum_tracking_info() function:

     -   sets mark_time for the user and that forum
        in the forums_track table to the post_time for the last post
        in the relevant forum

     -   wipes out all entries for the user and the relevant forum
        in the topics_track table

e. new topic or reply to existing topic:

  -   via the markread() function, sets mark_time for the user and that topic
     in the topics_track table to the post_time for the new topic or reply

  -   if there are no other unread topics in the relevant forum,
     then via the update_forum_tracking_info() function:
  
     -   sets mark_time for the user and the relevant forum
        in the forums_track table to the post_time for
        the last post in the relevant forum

     -   wipes out all entries for the user and the relevant forum
        in the topics_track table[/quote]

Ako mi misliš ukrasti ideju oko foruma, neće ići. :smiley:

To sam negdje objašnjavao kako izvesti, mislim da čak ima na forumu. Ukratko, moraš svaki topic read_time pamtiti, druge nema.

edit
http://www.webmajstori.net/forum/showthread.php?t=16179

moguće da sam i pokretaču teme koje sam dao preko msna pisao, ko bi znao.

Hvala svima! :slight_smile:

A ne kradem ideju oko foruma, iako bi mi bilo drago da ti ju netko mazne :smiley:

Znači, tako sam i krenuo, napravio tablicu sa id-jevima korisnika, teme, foruma i vrijeme posjeta temi, pa onda krećem sa uvjetovanjima do bola. :kmech:

[quote=“Gosaric”]Ako mi misliš ukrasti ideju oko foruma, neće ići. :smiley:

To sam negdje objašnjavao kako izvesti, mislim da čak ima na forumu. Ukratko, moraš svaki topic read_time pamtiti, druge nema.

edit
http://www.webmajstori.net/forum/showthread.php?t=16179

moguće da sam i pokretaču teme koje sam dao preko msna pisao, ko bi znao.[/quote]

Pokretač teme ima svoje ime tutleku jedan :smiley:

Budem potražio imam li na laptopu još taj chat log pa napišem. Znam kroz što prolaziš jer je i mene taj problem zbunjivao jedan dobar period vremena :slight_smile:

Uuu, pokretač teme prati forum, oprostite Vaša Visosti. :smiley:

@pokretač ove teme - mogu ti dati dio koda koji je radio to ako želiš…

edit, evo ga, izvorni :smiley:

Uglavnom malo je blesavo sve iz današnje perspektive, no, tad je trebalo brzo rješenje. Tu se prate samo ulogirani useri. Goste ne može pratiti na kvalitetan način.

$view = $this->framework->mysql->result(“SELECT vie_time, pos_id FROM f_viewed WHERE use_id = “.$_SESSION[‘user’][‘id’].” AND top_id = “.[SIZE=“5”][color=“Red”]$_GET[‘id’][/color][/size].”;”);

Čekaj, čekaj, čekaj!!! Vi se zajebavate ili WTF???

Bilo je to davno, taj kod je kopiran s koda iz 2006-e, a taj iz 2006-e je kopiran od ne znam kad.

Ovaj $_GET je bio prije pročišćen (nadam se :D), a točka zarez - e to ne znam. Valjda se tako pisalo u PMA pa se i tu.


Copyright © 2020 WM Forum - AboutContact - Sponsored by: Mydataknox & Webmaster.Ninja