Szerkeszthető táblázat...
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... :-)
■ 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... :-)
Egyszerű feladat?
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).
É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.Most csak az első mondatra...
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.
A mentések kapcsán:
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)
így viszont nincs jogosultság
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.
Az eredeti elképzelésben nem
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)
Handsontable
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.
Ellenőrzés
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.
Ellenőrzés
Kb. erre gondoltam
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.