ugrás a tartalomhoz

megosztott dokumentumok weben

rudo · 2006. Szep. 4. (H), 09.21
A kérdés elég elméleti jellegű, azért írom ide, mert épp az ajaxon töröm a fejem(de lehet, hogy zsákutca).

Amit szeretnék megoldani: egy weben keresztűl elérhető dokumentumot kéne egy munkacsoportnak szerkesztenie (tehát valahogy úgy, mint az ms office-ban). Ha valaki dolgozik rajta más ne férhessen hozzá. Mindez történjen nagyon megbízhatóan és hatékonyan. A végső cél, hogy egy adatbázisban tárolt html dokumentumot lehessen browserben futó wysiwyg editorral szerkeszteni és visszamenteni.

remélem érthető voltam
 
1

Megosztás rész

csla · 2006. Szep. 4. (H), 09.45
Bontsuk két részre a kérdést. Az egyik, hogy hogyan lehet WYSIWYG editorral szerkesztgetni neten, erről volt már sokszor téma, találhatsz is megoldásokat, ha rákeresel, gondolom, akkor nem ez a fő kérdés. Mivel írtad, hogy egyszerre csak egy felhasználó dolgozhat rajta, könnyebb a helyzet. Ha valaki dolgozik az adott dokumentumon, kiteszel egy flag-et, és ha van kint flag, más nem nyúlhat hozzá. A flag használatánál én a következő lépéseket javaslom:

1. Van-e kint flag?
IGEN -> más dolgozik | NEM -> 2. lépés

2. Generálunk egy flag-et, ami a usert is azonosítja, kitesszük (még jobb, ha pl. a session_id-vel azonosítunk, így azt is kiszűrjük, ha azonos felhasználónévvel akar két ember egyszerre - pl. ha egy munkacsopotnak egy jelszava van, de amúgy is, mindenképpen praktikusabb a session_id)

3. Visszaolvassuk a flag-et, hogy a sajátunk-e

4. Sajátunk?
IGEN -> 5. lépés | NEM -> más dolgozik

5. Mehet a munka

6. Töröljük a flag-et

Annyiban még érdemes kiegészíteni, hogy a flag mellé kiteszed a generálás időpontját is, és az első vizsgálatkor azt is megnézed, mikori a kint lévő flag, és ha bizonyos időnél régebbi, akkor nem veszed figyelembe, mert előfordulhat, hogy bent ragad valaki, és akkor "soha többet" (míg kézzel nem törlöd a flag-et) nem tud senki dolgozni. Sőt, ha már AJAX technikában gondolkodsz, akkor megteheted azt is, hogy a szerkesztgetés közben bizonyos időközönként (teszem azt percenként) frissíted az időpontot ha a felhasználó még mindig igazolhatóan szerkesztget, és akkor a vizsgálatnál nézheted azt is akár, hogy pár percnél régebbi-e a flag időpontja, és így sokáig nem tud bent ragadni.
2

na igen

rudo · 2006. Szep. 4. (H), 10.57
persze az editor nem volt kérdés, az nem gond.
én is pont ezen rágódom, hiszen az adatbázisok saját zárolása csak a művelet
erejéig él (hacsak nem tranzakciós táblát használok -de az vagy van, vagy nincs, tehát max megírom hozzá a kezelőt)
namost a tranzakciós tábla elég megbízható:) viszont, nem elég hatékony!
annyira nagy a veszélye a gyakorlatban, hogy valaki bennszakítja a sessiont, hogy azzal súlyozottan kell számolni! tehát maradna a sztenderd megoldás, hogy
lejárati dátumot kap (ahogy írtad is). viszont, ha ez túl rövid, akkor korlátozom a munkát, ha hosszú, feleslegesen kell valakinek várnia...
na ezért agyalok azon (amit szintén írtál), hogy a júzer előre meghatározott időnként bejelentkezik(ld ajax) és megerősíti a sessiont. ez nem lenne rossz, csak jó lenne tudni, milyen lehetséges buktatói vannak, van-e valakinek hasonlóval tapasztalata. ez első félelmem, hogy nem növelem-e a szerver terhelését indokolatlanul és irreálisan.
3

Az emiatti terheléstől nem félnék

csla · 2006. Szep. 4. (H), 11.04
Persze nem tudom, egyidőben mennyien fognak dolgozni, de szerintem elhanyagolható az a terhelés, amit az x percenkénti mezőfrissítés róna a rendszerre.
4

nem vészes

rudo · 2006. Szep. 4. (H), 11.48
egyelőre biztos nem volna vészes, de az ajaxos cuccoknál mindig ez a parám:)
a másik ami miatt tartok, az úgye a kliensoldali rutinok esetlegessége. ez mondjuk nem akkora gond, mert a rendszer annyira zárt, hogy előírhassam a böngésző tipusát(tipusait), verzióját, beállításait. a js ellenőrizné a környezetet, ha gond van bármivel, el sem indul a cucc.

de, ha a rendszer védett már, akkor rögtön ott a felhasználó:)
legalább annyira gond, ha valamiért nem sikerül adott időn belűl a bejelentkezés! akkor ugye új sessiont kell kezdeni, és frissíteni kell a dokumentumot (ha más épp nem nyitotta meg), mindezt úgy, hogy az addigi munka lehetőleg !!!ne vesszen el!!!, !!!ne bízzunk túl sok feladatot a felhasználóra!!!...

valahogy zsigerből az az érzésem, hogy egy fontos szempont elkerüli a figyelmemet:)
5

Zárt rendszer

csla · 2006. Szep. 4. (H), 12.00
Mivel zárt a rendszer, tegyük fel, hogy akkor túl vagyunk a technikai problémákon.
Én olyan megoldásra gondoltam, hogy a JS kód periodikusan figyeli, hogy dolgozik-e még a felhasználó, konkrétan, hogy szerkeszti-e a szöveget. (Ezt persze gondosan kéne kivitelezni, hogy ne lassítsa a felhasználó munkáját.) Ha x intervallum óta nem nyúlt hozzá, akkor feltenne egy kérdést, hogy "hahó, itt vagy-e még". Amennyiben erre érkezik válasz, akkor rendben, nem bántjuk, ha viszont nem érkezik, akkor AJAX technikával kiléptetjük, miközben lezárjuk a dokumentumát, esetleg mentjük is az utolsó állapotot, töröljük a hozzátartozó flag-et. Az az eset kizárható, amit írtál, hogy "ha éppen más nem nyitotta meg", mivel a kint lévő flag miatt ez nem lehetséges.
6

majdnem

rudo · 2006. Szep. 4. (H), 13.04
kb. így gondoltam. a kliens
bejelentkezik pl. percenként... a gond ott van, ha ez valamiért nem
jön össze. akkor megszűnik a zárlat, mert nem volt megerősítés. periódikusan menteni az jó ötlet, mert a legnagyobb kond a kliensen tárolni adatokat(bármeddig is). valahogy úgy lehetne ezt finomhangolni, hogy percenként megerősítés, plusz egy perc türelmi idő, ami alatt sűrűbben próbálkozna a kliens. vagy ezt tudja az ajax magától is? na ez pl. fehér folt.
7

Szerintem

csla · 2006. Szep. 4. (H), 22.05
A kliens x percenként automatikusan mentheti a dokumentumot, és frissítheti az utolsó activitás időpontját. (Itt javasolnám - ha a tárhely nem szorít -, hogy mielőtt kiadod neki szerkesztésre, mindig automatikusan készíts egy backup-ot. Később ez még jól jöhet.) Ha ez valamiért "nem jön össze", akkor valószínűleg "elhalálozott" a kliens (áramszünet, akármi). Ilyenkor két dolgot tehetsz (a felhasználóra már nem érdemes várni semmilyen téren, mert nincs kapcsolat a kliens-szerver között), vagy eldobod a módosítást és visszaállítod az eredeti állapotot (mert az is lehet, hogy a kliens "megbolondult", tönkretehette a doksit, nem biztos, hogy praktikus menteni - esetleg valamilyen vizsgálat, ezt nem tudom, át kell gondolni), vagy pedig az utolsó automatikus mentést érvényesíted a doksiban. És persze törlöd a flag-et, stb. Persze - értelemszerűen - ha a kliens meghalt, akkor ezt nem tudod az aktuális munkafolyamatban végrehajtani, mert nincs ami hívja kliens oldalról a funkciót, úgyhogy egy másik kliensből/munkamenetből kell megcsinálni, vizsgálva, hogy van-e olyan nyitott folyamat, aminek az utolsó aktivitás időpontja bizonyos időnél régebbi, és ha van, akkor azt így rendbe tenni.