ugrás a tartalomhoz

Szerkeszthető táblázat...

eddig bírtam szó nélkül · 2012. Júl. 17. (K), 19.58
Attól tartok, egy egészen egyszerű feladatot sikerült túlbonyolítanom egy hirtelen jött ötlettel: táblázatosan megjelenített adatok kezelése a feladvány. Egy sor = egy időponthoz tartozó mérés adatai.
Ha csak új sorok felvitelét akarnám helyben kivitelezni, már az is macerásnak tűnik: amikor új sort adok a táblázathoz, hogy lenne célszerű? Van egy rejtett táblázatom, amelynek egy sorát klónozom? Vagy jobb, ha az egész sort javascriptből építem fel?
(előbbire van saját tákolmányom, utóbbit egyelőre lusta voltam lekódolni :-) )

Aztán: a beviteli mezők ellenőrzése. Írjam meg JS-ben is, meg szerver oldalon is? Vagy akasszak minden mezőre egy onblur függvényhívást, ami AJAX-ot használva a szerver ellenőrző rutinjait használja?

Végül a legnagyobb gondom: a táblázat sorainak azonosítása... elsőre úgy képzelném, hogy minden tételsorhoz tartozik az adatbázisban egy autoinc. primary key és ezt egy hidden mezőben kiteszem a táblázatba, de... Amikor beküldik a módosított értékeket, meg is hamisíthatják a sorok mellé rendelt PK értékeket, valahogy ellenőrizni kellene, hogy változatlanok maradtak-e... Azt hiszem, meg tudom oldani az ellenőrzést, de kicsit bizonytalan vagyok benne, hogy ez így jó ötlet-e egyáltalán?

Ahhoz képest, hogy csak a diabétesz naplómat akartam egy pici webes applikációval kiváltani... :-)
 
1

Egyszerű feladat?

Poetro · 2012. Júl. 17. (K), 20.14
Ez mitől tűnt neked egyszerű feladatnak? Ez egy elég összetett dolog, de ha jól emlékszem talán már volt is hasonló probléma itt. Ami mindenképpen kell, az egy minta sor, ami alapból nem látszik (mondjuk van rajta egy őt elrejtő osztály). Ezt lehet másolni sokféleképpen. Ha eleve használsz valami keretrendszert, akkor érdemes annak a klónozását használni, főleg ha az eseménykezelőket is másolni akarod. Vagy csinálhatsz belőle egy innerHTML-t, és azt szúrod be az újonnan létrehozott sorba.
Az eseménykezelőket másképp is meg lehet oldani, mégpedig, hogy magára a táblázatra rakod az eseménykezelőt, és az eseményt kiváltó elemet vizsgálod, hogy egyezik-e a neked tetsző elemmel.

A beviteli mezők ellenőrzését érdemes mindkettő oldalon megoldani, ezzel téve kényelmesebbé a használatot (természetesen szerver oldalon mindenképpen meg kell csinálni).

A mentéssel kapcsolatban, én inkább raknék minden sorra egy mentés gombot is, és akkor tudja a felhasználó, hogy mikor lett elmentve (mentés után a gombot el lehet rejteni, és amikor van módosítás a sorban, akkor megjeleníteni).

Amikor beküldik a módosított értékeket, meg is hamisíthatják a sorok mellé rendelt PK értékeket

És ez miért zavar téged? A saját adataikat rontják el, ha meghamisítják a kulcsokat. Ha meg eleve AJAX-szal történik a mentés, akkor abba is bele tudnak avatkozni, nem kell nekik a hidden mezőkkel szőrözni. A másik lehetőség, hogy egy tényleg egyedi kulcsot rendelsz a mezőhöz az autoincrement mezőn felül, amit nehéz legenerálni (mondjuk egy hash, ami az eredeti értékek alapján generálódik, természetesen egy kis sózással). Így a felhasználónak ismernie kell az eredeti sor kulcsát, hogy módosítani tudja, nem elég egy számot ismernie.
3

Most csak az első mondatra...

eddig bírtam szó nélkül · 2012. Júl. 17. (K), 20.22
... reagálva: a napló tűnt egyszerű feladatnak, mert végülis csak adatsorok beviteléről lett volna szó.

Utána kezdtem el újabbnál-újabb ötletekkel bővíteni az elképzeléseimet és már most ott tartok, hogy ez messze több, mint egy heti munka. :-)
---
Eszerint a klónozásos ötletem jó volt. Mondjuk én nem innerHTML-t használtam, hanem a getElementById("tablazat").appendChild(...) segítségével fűztem a táblázat végéhez a CSS-ben display:none;-ra állított tábla első sorának klónját.
---
A többire kicsit később... megpróbálom összeszedni és viszonylag értelmesen megfogalmazva leírni a miérteket.
7

A mentések kapcsán:

eddig bírtam szó nélkül · 2012. Júl. 17. (K), 21.00
A mentések kapcsán: eredetileg én is így gondoltam, de az még belefér a kulturált HTML felépítésbe, hogy egy <tr>...</tr> köré rakok formot?

A "miért zavar"-ra csak azt tudom mondani, hogy az eredeti elképzelés szerint a kulcs egy egyszerű, generált sorszám lett volna, így viszont nincs jogosultság ellenőrzési lehetőségem, akkor viszont idegen adatokat is felülírhat a kedves felhasználó. De ettől függetlenül is szeretem, ha tudok védekezni az ilyen trükkök ellen.
A hash-es tippet nem teljesen értem: ha a sor minden adata módosítható az elsődleges kulcs kivételével, akkor nincs mire hash-t gyártani. (hidden csak azért, hogy ne legyen zavaró egy random számsor látványa)
8

így viszont nincs jogosultság

Poetro · 2012. Júl. 17. (K), 21.04
így viszont nincs jogosultság ellenőrzési lehetőségem

Miért nincs? Azt tudod ellenőrizni, hogy az adott felhasználónak van-e jogosultsága az adott sort írni. A hash-el azt tudod megakadályozni, hogy az adott sor ismerete nélkül valaki megpróbáljon egy sort felülírni. Azaz a felhasználónak szüksége van a hash-re, hogy felül tudja írni az adatot. Amennyiben nem rendelkezik vele, nem fog tudni írni. Míg egy szekvenciális számsort azért elég könnyű kitalálni.
9

Az eredeti elképzelésben nem

eddig bírtam szó nélkül · 2012. Júl. 17. (K), 21.15
Az eredeti elképzelésben nem szerepelt, hogy az adatbázisban az adat tulajdonosát is tárolni kellene, mert csak a kliens oldali részleteken gondolkodtam. Most, hogy rákérdeztél, már rájöttem, hogy hülyeség, hiszen a tulajdonos tárolása nélkül eleve nem tudnám a megfelelő sorokat kiválogatni. :-)
Ettől függetlenül nem tartanám egészségesnek, ha olyan sorokat update-elhet valaki, amit nem kellene. (bár itt már előjön az "optimistic concurrency control" kérdésköre is -> mindenképp tárolnom kell valahol az eredeti sorok értékeit, ettől kezdve úgyis kibukik az ellenőrzés során, ha valaki nem azt küldi vissza, amit eredetileg kapott)
2

Handsontable

complex857 · 2012. Júl. 17. (K), 20.18
Vess egy pillantás a Handsontable nevű js libre. Ha jól értettem amit írtál az összes feladatra szépen idomítható, sorrol sorra való mentéstől, a validáláson át (és még excel copy+paste is van), readme itt.

Adatok ellenőrzését mindenképp meg kell írnod szerver oldalon mivel kliens oldali ellenőrzéseket könnyedén ki lehet kapcsolni, viszont felhasználói élmény javítására remek eszköz lehet, ha azonnali visszajelzést tudsz adni.

Az egyes sorok azonosítására én simán fenttartanék még egy adatsort javascript oldalon ami a "tablazat sora" -> id adatokat tartalmazza, az oldalbetöltéskor jön az aktuális adatbázis tartalommal ami a táblázathoz kell, és mentési folyamat részeként frissíteném kliens oldali értékeket.
4

Ellenőrzés

eddig bírtam szó nélkül · 2012. Júl. 17. (K), 20.27
A szerveroldali egyértelmű, a kérdés inkább arra irányult, hogy kliens oldalon még mindig divat önálló ellenőrzést használni, vagy inkább az ajax jött szokásba?
Ugye ha kliens oldalon is ellenőrzök és szerveren is, akkor egy érték tartomány változás esetében mindkét helyen módosítani kell az ellenőrző algoritmust, ha ajaxot használok, akkor csak a szerveren - viszont ez növeli a szerver terhelését, lassíthatja az adatbevitelt.
5

Ellenőrzés

Poetro · 2012. Júl. 17. (K), 20.47
Az AJAX-szal való ellenőrzés igazából nem jó megoldás, mert akkor már el kell küldened az adatokat, ami esetenként sokáig is eltarthat, valamint a válasz legenerálása is időbe telik, valamint ha csak ellenőrzöl, akkor már egyből be is írhatnád az adatokat az adatbázisba. A kliens oldali ellenőrzés esetén nincs szükség ezekre, a felhasználó azonnal látja, ha valami nem stimmel, és nem kell rengeteg kérést intézni a szerver felé, mondjuk minden egyes karakter leütése után.
6

Kb. erre gondoltam

eddig bírtam szó nélkül · 2012. Júl. 17. (K), 20.53
Kb. erre gondoltam negatívumként. Bár én csak a mező elhagyásakor végrehajtott ellenőrzést tartottam szem előtt, az eszembe sem jutott, hogy akár karakterenként...
Update-elni semmiképp sem éreztem célszerűnek amíg nincs kitöltve a teljes sor - a konkrét esetben ugyan nincs különösebb összefüggés a sorban tárolt adatok közt, de más, hasonlóan feldolgozott adatoknál már lehetne.