View Full Version : kako radi movanje postova?
Trebam izvesti micanje posta iz teme u temu na forumu. No sreo sam se s problemima: ako prebacim post takak kakav je (promjenim mu id threada i ostale sitnice) on se može pojaviti usred ostalih postova teme u koju je prebačen (čak može doći i na prvo mjesto kao da je s tim postom pokrenuta ta tema) jer se postovi prikazuju po datumu.
Zanima me kako to radi na poznatim forumima vBulletin, PHPBB i ostalim. Nemam volje instaliravati a vjerujem da tu ima brdo vas koji znate sve o tome.
Na nekima od njih se dešava ista stvar, ali ako ti to želiš tako... to pitaš za neki svoj forum kojem ne poznajemo kod?
zar nije jednostavno upisati novo vrijeme posta - po njemu se valjda sortiraju postovi u topicu. Na jednom mini forumu šta sam radio se posebno upisivao unix TimeStamp za sortiranje, a posebno na hrvatskom jeziku vrijeme posta, pa je promjenom TS polja na trenutni to lako riješti...
forum je na forum.poslovni.hr, mislim da bi bilo jako ružno i zbunjujuče da kad se post preseli iz jedne teme u drugu da se pojavi na prvom mjestu, a da upišem novo vrijeme posta to je najlakše ali bojim se da bi se time opet falsificiralo stanje
Pa moraš se odlučiti za nešto od toga. Onda najbolje da ne premještaš postove. :)
Ako se dobro sijecam SMF bi ih poredao po datumu, bez obzira. Ali nije bitno što drugi rade kad sam imaš slobodu napraviti kako god želiš.
Gore sam ti napisao da koristim dupla polja u bazi tako da printano vrijeme posta ostaje isto i ništa se ne falsificira. Ako hoćeš možeš dodati i napomenu da je premješten.
Prije premještanja možeš provjeriti koje je vrijeme provg posta u tom topicu i ako je vrijeme premještanog posta ranije, uvećaš ga...
dodaš polje u bazi sa datumom premještanja.
datum ispisuješ iz originalnog timestampa a poredaš prema datumu premještanja (ako on postoji, naravno)
kao što je i ibiza rekao
Posve predugačak i upitno potreban filozofski odgovor.
---------------
Iz tvog drugog posta mi se čini da ti tražiš "općenito ispravno" rješenje za problem premještanja posta iz jednog threada u drugi. Ako promisliš, vidjet ćeš da ne postoji "rješenje" tog problema, jer problem je umjetan - proizlazi iz pogrešne definicije threada. Problem, zapravo, ne postoji.
Thread se zove "thread" (nit, niz, nanizani slijed koji možeš pratiti), upravo zato jer nije skup postova, već uređeni slijed (lanac) postova. Bit threada je upravo u poretku postova, a ne u samoj činjenici da postovi postoje. Promjenom redosljeda postova se dobiva sasvim drugi thread. Slično kao što se promjenom znamenki u broju dobiva neki posvi drugi broj ili zamjenom rečenica u riječi neka sasvim nova izjava (ili, češće, posve besmislena izjava).
Naime, između postova u svakom izvornom threadu postoji kauzalnost (uzrok-posljedica) - tako vodimo diskusije. Postovi nisu stvarno poredani po vremenu postanja, već po svome mjestu u uzročno-posljedičnom lancu događaja u našim glavama. Kako se ne možemo vraćati u prošlost (za čime mnogi flejmeri upravo žale), to ispada da vremenske oznake upravo savršeno prate taj slijed uzroka i posljedica - uzrok uvijek ima manju vremensku oznaku od posljedice. Poklapanje vremenskih oznaka i redosljeda uzroka i posljedica je samo koincidencija nastala u trenutku Big Banga kada su definirane prirodne konstante. Tu koincidenciju programeri foruma mudro uočavaju i koriste da na jednostavan način zabilježe uzročno-posljedični slijed postova (a ne vremena kada su postovi kreirani).
Za razliku od našeg svemira, u kojem su svi događaji od Big Banga naovamo dio jednog, jedinog kauzalnog lanca (jednog threada), na forumima svaki thread, općenito uzevši, predstavlja vlastiti lanac kauzalnosti - niti na koji način povezan s drugim threadom. Posljedično, seljene postova je kao da pokušaš preseliti neki povijesni događaj iz nekog nama paralelnog univerzuma u naš univerzum. Općenito možeš samo sačuvati jedno: ili kronologiju ili uzročno-posljedičnu vezu - nikako oboje. Kada događaj iz jednog univerzuma (lanca kauzalnosti) prebaciš u drugi, za očekivati je, dakle, jednu od dvije stvari:
(a) događaj ćeš smjestiti u drugi kauzalni lanac u "smislenom" poretku uzroka i posljedice, ali ćeš izgubiti monotonost vremena,
(b) događaj ćeš smjestiti u drugi kauzalni lanac tako da zadržiš monotonost vremena, ali će povijest postati apsurdna (gubiš uzročno-posljedičnu povezanost događaja).
Problem, dakle, uopće ne postoji. Radi se o fundamentalnoj slici svijeta koju si opisao kao "problem".
-----
Znači, jedino alternativno rješenje je uvesti atribut "redosljeda prikaza" postova (npr. neki cijeli broj ili alternativni timestamp kako je spomenu Ibiza), a koji se proizvoljno može mijenjati.
Koja je razlika između takvog porekta po "redosljedu prikaza" i po redosljedu stvarnih vremenskih oznaka? U prvom slučaju se dešava gore navedeno pod (a), a drugom gore navedeno pod (b). Nikada, općenito uzevši, ne možeš imati "i ovce i novce".
Ako bi dao programeru zadatak da napravi algoritam koji će seliti postove iz jednog threada u drugi, on bi to mogao izvesti na 100 načina. Ali ako ga tražiš da napravi algoritam koji će seliti postove iz jednog threada u drugi na "ispravan" način, taj programer se može odmah baciti kroz prozor. Zato je za očekivati da svi programeri foruma na kraju odluče stapati threadove po originalnim vremenskim oznakama - to je, zapravo, heuristički algoritam - "best guess" algoritam.
----
Dodatno pravilo koje u općenitom slučaju ima smisla jest da jedan od postova u threadu označiš kao "prvi" i time osiguraš da se taj uvijek ispiše na vrhu, a ostali po svojim izvornim vremenima nakon njega. Prelaskom u stableni prikaz, novododani post otvara novu granu koja izrasta izravno iz korijena, tj. prvog posta. Time si napravio kompromis između (a) i (b), tj. malo doradio heuristički algoritam.
Ili uvedeš atribut "redosljed prikaza" i omogućiš moderatoru foruma da "default" poredak (b) po vremenima događaja u većoj ili manjoj mjeri, po svome nahođenju, "ručno" pretvori u poredak (a) po "smislenosti" uzročno-posljedične veze (da izmisli povijest). Jednostavnije ne ide, jer je upravo cjelovito navođenje tog "redosljeda prikaza" minimum potrebne informacije da se "ispravan" poredak definira - smisao threada je upravo u uzročno-posljedičnom slijedu postova.
-----
Ako si čitao do ovdje, složit ćeš se da se ovaj post može prebaciti u bilo koji thread bez gubitka uzročno-posljedične veze ili narušavanja bilo kakvih fundamentalnih zakona prirode. On je neka vrst crne rupe. :)
A sada praktično i jednostavno rješenje. Razreži thread u odsječke (slices).
Poredak postova P je određen prvo odsječkom P(SLICE), a potom vremenom kreiranja P(TIME).
Svaki thread T nosi "slijedeću vrijednost" odsječka T(NEXTSLICE).
Thread se kreira sa T(NEXTSLICE) = 1.
Postovi se dodaju sa P(SLICE) = T(NEXTSLICE) i P(TIME) = NOW().
T(NEXTSLICE) se nikada ne uvećava kreiranjem novih postova.
Kada se neki post (ili postovi) P' prebacuju iz threada T' u thread T, onda se prvo T(NEXTSLICE) uveća za jedan, a prebačenim postovima se vrijednost P'(SLICE) promijeni u T(NEXTSLICE). Nakon što se postovi prebace, T(NEXTSLICE) se još jednom uveća za jedan, kako bi svi daljnji postovi kreirani u T imali drugačiji P(SLICE).
Time si prebačene postove dodao na sam kraj threada, zadržavajući njihovu vlastitu kronologiju, a svi naknadno novokreirani postovi dolaze iza njih.
Uvođenjem dodatne tablice možeš voditi i povijest seljenja postova iz threada u thread i tako automatski generirati link na "izvorni thread". Naime, samo postovi koji su izvorno kreirani u istom threadu T' imaju isti P(SLICE) u threadu T u koji su preseljeni.
Uoči da gore opisanim načinom uvećavanja T(NEXTSLICE) može nastupiti situacija da postoji takav T(NEXTSLICE) koji ne nosi niti jedan post (ako se operacija prebacivanja postova izvrši dva puta za redom, bez da je u threadu T u međuvremenu kreiran ijedan novi post). Ta situacija može također nastupiti ako se ista grupa postova prvo preseli iz T' u T, a kasnije iz T u neki treći T''.
Puno hvala na iscrpnom odgovoru, vjerujem da ću napraviti nešto u tom smjeru.
Juniorov prijedlog i ovaj moj možeš stopiti, primjerice. Juniorovo vrijeme "seljenja posta" postaje moj P(SLICE) ili obratno. Poredak se obavlja ne po vremenu seljenja posta (koje može, ali ne mora postojati), već prvo po vremenu seljenja, P(SLICE), a potom po vremenu kreiranja. P(SLICE) će uvijek postojati, jer će za novokreirane postove biti uzeto vrijeme kreiranja threada. Svi postovi preseljeni u istoj operaciji imaju isti P(SLICE) - moderator može otvoriti "posao" seljenja i tek kada razmjesti sve željene postove se to ažurira, dok je P(SLICE) vrijeme posla. Pri tome se za svaka dva threada (izvorni i odredišni) može otvarati vlastiti posao ili se posao može odnositi na sve "selidbe" koje moderator u tome trenutku radi. Problem nastupa samo ako administrator promijeni vrijednost sata na računalu, što mi se čini kao posve moguća situacija. Zato treba uvijek vršiti kontrolu monotonosti sata (perzistiranje zadnjeg poznatog vremena i usporedbom tekućeg sa zadnjim poznatim).
vBulletin® v3.8.2, Copyright ©2000-2010, Jelsoft Enterprises Ltd.