Formulář se před zpracováním znovu vytváří, co když se vytvoří jinak?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
mcmatak
Člen | 490
+
0
-

Možná už se to tu řešilo, ale stále nikde nevidím odpověď.

Jak řešíte, když máte formulář, který se generuje na základě nějakých dat, např. datagrid, v databázi je 100 produktů, továrnička vytvoří formulář a vytvoří 100× checkbox podle jednotlivých produktů a nabídne uživateli aby vybral které produkty chce smazat.

Zatímco uživatel č.1 vybírá produkty, které smaže, uživatel č. 2 se rozhodl smazat prvních 5 produktů.

Formulář uživatel č. 1 odešle, nicméně jak zajistit správné zpracování? Aby se nesmazali jiné produkty než doopravdy vybral.

Snad příklad ještě více zkonkrétním, mám např. seřazený grid podle názvu produktu, jsem na stránce 5 a checkuju produkty, které mají mít nastaven příznak viditelnost. Uživatel č. 2 mi smaže prvních pět produktů, nebo je přejmenuje. Tím pádem po odeslání formuláře se těch 100 checkboxů vygeneruje jinak a hrozí buď, že některé zaškrtnuté checkboxy se nezpracují, protože se v novém sestavení formuláře neobjevili nebo že budou zaškrtunuty dokonce jiné než opravdu uživatel zaškrtl.

Jak to řešíte?

westrem
Člen | 398
+
0
-

Neviem ako ostatny, ale je podla mna zrejme, ze tie checkboxy budes pomenovavat nejak vzhladom na ID a nie na nic ine (co je premenne), potom sa ti nema ako stat, ze by sa ti zaskrtli alebo spracovali ine produkty.

Ak ich niekto medzicasom vymazal nic sa nedeje, nema sa co vymazat zase.

Ak chces zamedzit tomu aby mal niekto dlho otvorene okno a zatial mohol niekto druhy pomenit hodnoty a potom tento user ich vo svojom rozpracovanom forme zase pomenit, tak nastav pre akciu nejaky token napr na 3 minuty a ak clovek nic nespravi do 3 minut tak bude musiet reloadnut stranku = vytvorit novy poziadavok na action.

Dufam ze nepisem prilis obecne ale je to naznak co a jak :)

mcmatak
Člen | 490
+
0
-

Dík za odpověď nicméně problém není tak jednoduchý, samozřejmě pojmenovávám checkboxy pomocí id, ale to je právě ten problém, uživatelé si stěžují, že jak blbci vždy zaškrtávají půl hodiny seznam 100 checkboxů, a z toho se jich zpracuje třeba jen 50, takže nakonec mi vyčítají, že mi nafakturují 15 min. za každého zaměstnance několikrát denně.

Jinak token a různé další zamykání je nereálné, ani vypršení, opět by nastal problém, že skoro každý požadavek by byl neplatný, protože na stejném gridu pracuje současně třeba 10 lidí, mi nevadí, že si něco budou přepisovat, ona operace smazání není ta o kterou se perou, ale jde právě o to zaškrtávání ceckboxů nebo vyplnování 100× nějakého inputu. Představte si např. editable datagrid, kde 10 zaměstnanců opravuje 100tisíc položek, jejich úkolem je přepsat všechny, takže upravují v datagridu jeden sloupeček. Tím, ale jak postupně upravují tím se mění formulář pod rukama a tak se z těch všech změn zapíše jen zlomek, to že by nastala situace, že řádek 105 někdo upravil a hned za ním ho upravil někdo jiný, to by mi nevadilo, ale jak to řešit prakticky?

Bez Nette formulářů ani žádná taková kontrola nikdy neexistovala, a tak jste zpracovávali pouze POST a tohle nebyl problém.

Foowie
Člen | 269
+
0
-

Já mám grid postavený na podobném principu jako je DynamicContainer . Tzn obsah gridu generuju normálně a ve chvíli kdy mi někdo ten grid odešle tak sestavím obsah znova podle $form->getHttpData(). Tím pádem mám komponenty (checkboxy) s IDčkama stejnýma jako byly př prvotním vytváření gridu. (Samozřejmě při práci s výsledkem pak musím kontrolovat, že obsah některých polí nemusí být platný ;))

mcmatak
Člen | 490
+
0
-

jj tak nějak to chci udělat také, nemáš někde ukázku?

mcmatak
Člen | 490
+
0
-

má to jeden háček, představ si že odeslaná data do datagridu/k editaci nejsou validní, což je průšvih, protože potřebuješ zobrazit grid, jenomže editované položky jsou rekonstruované z postu a ostatní data neexistují, jediná šance podle mne je zpracovat co se dá, vyhodit error ale přesto redirectovat

arron
Člen | 464
+
0
-

Jenom to zkusim doplnit malou uvahou. Mejme datagrid s nekolika polozkama. Jsou tam checkboxy pojmenovane vzhledem k id (treba produktu, to je fuk). A ted jednotlive situace:

  • zasktnu si prvni check box a chci to smazat. Uz to ale udelal nekdo predemnou. Neni problem, pri vytvareni formulare se prvni radek nevytvori, probehne kontrola a odeslana hodnota se zahodi, ale v tuhle chvili uz je to jedno.
  • edituju jednu z hodnot, ale mezi tim uz ji nekdo smazal. Problem…jedine rozumne reseni je editovanou polozku uzamkout pro exkluzivni pristup, aby mi ji nikdo jiny pod rukama nemenil.
  • edituju jednu z hodnot, ale mezi tim uz ji nekdo dalsi editoval a ja mu to prepisu. Problem…opet to resi asi jenom zamykani pristupu k dane polozce v case, kdy ja ji edituju, aby to nikdo dalsi v tu chvili nemohl udelat.

Takze asi tak:-)

Foowie
Člen | 269
+
0
-

@mcmatak: Vzhledem k tomu, že grid/form je rekonstruovaný z postu → máme plný fomulář (sice starých, ale máme) dat. Při zpracování se zjistí chyba (špatně vyplněno) a já pouze vyhodím flashMessage že je chyba a formulář neměním (stále má data z postu) … Uživatel tedy dostane onen jeho špatně vyplněný formulář k upravení. (Tedy nemusím nikde sahat do db → nemůžu chtít neexistující data)

@arron:

  • 1) np
  • 2) Jako uzamknout od kdy do kdy? Od příjetí požadavku po odeslání vyplněného formu ? :) Tady bych spíše jenom informoval, že položku mu někdo vyfoukl a že již neexistuje, ať si to s ním vyřídí … případně nějak vytvořit novou pokud je to chtěnné.
  • 3) Částečně by to asi řešil update pouze změněných dat. Musela by se ale změna kontrolovat vzhledem k původním datům (při plnění formu z db), né k těm co jsou aktuálně v db. (Session, hidden fieldy ve formu …). Ikdyž to zase neřeší přístup kdy oba uživatelé chtějí k nějaké (stejné) položce připočíst jedničku nebo jenom něco do pole přidat…

Edit: @mcmatak: pokud chceš mrknout na ten můj grid tak mi napiš na danrob@jabber.cz

Editoval Foowie (15. 10. 2010 13:20)

arron
Člen | 464
+
0
-
  1. uzamknout od zacatku editace (cili od zobrazeni editacniho formulare pro danou polozku) az po jeji ukonceni (cili zavolani obsluzneho handleru a zpracovani dat).
  2. to je sice asi pravda, ale je to vsechno strasne zbytecne slozite, prekombinovane a nespolehlive. Proste kdyz chci editovat nejakou polozku, tak pri zobrazovani editacniho formulare si otestuju, jestli je polozka odemcena a pokud ano, tak si ji zamknu (musi na to nekde byt nejaky sloupecek v db nebo tak neco). No a kdyz pak ten form zpracovavam, tak tu polozku zase odemknu. Neni to zase tak obtizne (ackoliv to ma, jako vsechno, svoje uskali) a pritom to resi snad vsechny tady napsane problemy.
srigi
Nette Blogger | 558
+
0
-

Hmm, nebolo by mozno zle pomaly smerovat ku konceptu, ktorym kedysi byval (je) Google Wave. Sice je to mozno 2 svetelne roky pred konceptom request->response, ale technologie tu su uz teraz (Websockets).

Foowie
Člen | 269
+
0
-

@arron: A když jeden uživatel půjde na oběd se zobrazeným formulářem tak půl hodiny nepůjdou hodnoty změnit … ? Tak s tímhle by se toho moc neudělalo =)

arron
Člen | 464
+
0
-

@Foowie: Nepujdou menit hodnoty u toho jednoho zaznamu. To mi neprijde tak hrozne. Navic se ev. da implementovat treba vyprseni toho zamku ci tak neco. Uzivatel, ktery pak ten zamek vytvoril, tak prece neni problem mu pri odeslani sdelit, ze proste ten form vyprsel a pritom mu nesmazat rozdelanou praci. Myslim, ze to je resitelne:-)

westrem
Člen | 398
+
0
-

uzamknout od zacatku editace (cili od zobrazeni editacniho formulare pro danou polozku) az po jeji ukonceni (cili zavolani obsluzneho handleru a zpracovani dat).

A budes mat deadlock ani nevies ako :). Co ak userovi co nieco edituje padne PC, dany zaznam ostane v locku a smola.

vyprseni zamku

A vies nejak rozumne kvantifikovat cas, ktory treba na editaciu jedneho zaznamu? Aby si nenastavil expiration na kratko, ale zase ani dlho.

Nepujdou menit hodnoty u toho jednoho zaznamu. To mi neprijde tak hrozne.

Ak vravis, ze sa to tam tak hekticky meni pod rukami tak to nebude len jeden zaznam ale vela zaznamov, kde by deadlock mohol nastat.

Mna co napada ako riesenie je, ze kazdemu riadku DB das este napr last_access field, ktory bude timestamp s on update current timestamp a pri potvrdeni editacie od usera, skontrolujes ci sa zaznam zmenil v DB alebo nie (samozrejme predtym si musis niekam ten povodny cas – pri prvom requeste o editaciu – ulozit, napr session). Je to sice dotaz na DB naviac ale myslim si ze to celkom riesis co chces, nie?

Foowie
Člen | 269
+
0
-

@arron No, vzhledem k tomu, že na začátku tématu jsme se bavili o gridu s checkboxama tak to asi jeden záznam nebude …

mcmatak
Člen | 490
+
0
-

Sory ale diskuse je trochu jinde než můj problém, zkusme fakta:

  1. máme editable datagrid / tedy editujeme název, zda je řádek v akci, skladem, atd. atd. chceme to hromadně, prostě je to nutné!
  2. locky apod. nemožné, současné pracuje na gridu 10lidí
  3. ten grid, má různé filtry a hlavně řazení!

modelová situace:

mám seznam a jsem na páté stránce, seřazeno podle názvu

jenomže než odešlu všech svých 100 změn které jsem v názvech udělal, někdo jiný už upravil stránku číslo 1, tudíž po odeslání gridu/formuláře už se mi neuloží ani jedna změna, a na uživatele pouze vyskočí jiná sestava dat a bohužel se ani nedozví, že jeho změny se neuložili, což je možná lepší, kdyby se to dozvěděl asi by mi prohodil dlažební kostkou okno u auta

LuKo
Člen | 116
+
0
-

Co na to jít úplně z jiné strany: máš datagrid, který data pouze zobrazuje. Někde u něj (nad ním) máš formulář pro všechny položky jednoho řádku (jméno, skladem atd.). Tento formulář slouží k hromadným úpravám tím způsobem, že ve formuláři nastavíš hodnoty, v datagridu označíš checkboxem, na kterých řádcích se mají změny aplikovat. Možnost označit všechny řádky považuji za samozřejmost. Připadá mi to uživatelsky daleko přívětivější, než v gridu 100× něco upravovat jak cvičená opička. S minimálním vynaloženým úsilím by to mohlo vyřešit tvůj problém.

Foowie
Člen | 269
+
0
-

@mcmatak

Kus gridu (v továrničce formu) na opětovné sestavení formuláře …

if($form->isSubmitted()) {
	if(isset($form->httpData[self::EDITABLE_ROWS_CONTAINER])) {
		$rowsData = $form->httpData[self::EDITABLE_ROWS_CONTAINER];
		foreach($rowsData as $rowName => $row) {
			$rowContainer = $rowsContainer->addContainer($rowName);
			$this->createEditableRow($rowContainer, null, false, $row); // tohle volání vytvoří řádek podle zadání
 		}
	}
}

Jestli záznam existuje, nebo už se s ním stalo úplně něco jiného musíš řešit v modelu. (S tím souvisí diskuze výše)

Editoval Foowie (16. 10. 2010 12:15)

mcmatak
Člen | 490
+
0
-

@LuKo

asi jsme se nepochopili, máš 100× řádků samozřejmě každý je jiný a pochopitelně ten název u každého chceš upravit jinak že? to co píšeš je úplně něco jiného, navíc i kdyby si to chtěl udělat jak říkáš, opět problém, zase by to nefungovalo

@Foowie

díky, nicméně tohle sice mám, ale jak říkám, jak se vypořádat s tím, že dojde k chybovému stavu? jak o tom uživatele správíš? a jak mu dáš možnost chyby opravit? podotýkám, že nejen editovaná položka se vyskytuje v gridu, ale upravuješ např. název, nicméně v gridu na řádku máš XY dalších údajů, které by si musel z dtb získat

mcmatak
Člen | 490
+
0
-

snad jen pro upřesnění, abychom byly všichni v obraze

<?php
strana 5. seřazena podle name

id           name              cena          skladem
15           Vrtačka 51         100           ANO selectbox editovatelný
16           Vrtačka 52         100           ANO selectbox editovatelný
17           Vrtačka 53         100           ANO selectbox editovatelný

ještě než tyto změny odešlu, tak jiný uživatel smazal Vrtačka 49

tedy formulář se před zpracováním změn sestaví takto

id           name              cena          skladem
15           Vrtačka 52         100           NE již editovaná hodnota
16           Vrtačka 53         100           ANO již editovaná hodnota
17           Vrtačka 54         100           ANO již editovaná hodnota   (úplně nový prvek ve formu nebyl)
?>

prvek vrtačka 51 se vůbec neupraví! před zpracováním vůbec není součástí formuláře!

Editoval mcmatak (16. 10. 2010 13:38)

Foowie
Člen | 269
+
0
-

@mcmatak

Asi bych dal ty údaje do hidden polí a při chybě bych tyhle hodnoty bral od nich. A jak informovat o tom uživatele? Asi jenom že ty a ty položky nebyly změněny protože již neexistují (pro smazání)…

Chbox
Člen | 125
+
0
-

nechci nic říkat, ale mně se to zdá celé neějak špatně navržené.

  • jestli je něco skladem nebo ne, by se mělo hlídat podle počtu kusů na skladě a ne to zadávat ANO/NE. K těm buď počet přidávám nebo ubírám. Ubrat nemůžu, pokud je odebírané množství větší, než je počet kusů na skladě, pak nabídne systém pouze počet kusů, které jsou při zpracování k dispozici a položku sám nastaví, že už není skladem
  • jestli mi nějaká položka do skladu přibude, tak by mě to taky nemělo zajímat, protože jsem ji původně neměl v úmyslu ani editovat.
  • pokud někdo položku smaže a já na ní něco edituji (což mi přijde, že pravá ruka neví, co dělá levá), tak by se logicky update vůbec něml provést, protože položka byla odtraněna a tedy už na ní není, co měnit, když ji nějaká vyšší autorita zrušila. Zjistím podle ID.

Jestli je to tak, že nějaký operátor kouká na nějaký online seznam a ten nějak libovolbě edituje, tak by se měly položky té tabulky obnovovat v nějakem intervalu přes nějaký AJAX dotaz, aby operátor měl jakžtakž aktuální obraz DB.

mcmatak
Člen | 490
+
0
-
  1. opět neřešíme problém, ale jestli správně rozumím, chceš mi naznačit, že v reálném světě nic takového nenastane? ok, nastane věř tomu
  2. je všem známé, že form se sestavuje znovu před zpracováním jeho výsledků? takže poslední příspěvky nemají skoro nic společného s realiatou? ani s problémem jako takovým? že se všichni bavíme o něčem jiném je jasné?
arron
Člen | 464
+
0
-

Myslim, ze se tu snazime naznacit, ze Tebou navrzene (a zjevne i implementovane) reseni ani neni uplne optimalni, coz se asi i v praxi ukazuje:-)

Jestli jsem to uplne spravne pochopil, tak jde o to, ze kdyz si vygeneruju formular treba pro patou stranku a nekdo smaze neco, co je o stranku (ci vice) driv, tak pri odesilani toho formulare uz pata stranka vypada jinak, takze se proste vygeneruje jiny form…

Ok, takze je potreba generovat uz ten formular nejak jinak a to tak, aby na tech strankach pred tim nebyl vubec zavisly. Coz by se dalo udelat treba tak, ze pri tom generovani bych si ulozil (do session) idecka zaznamu, ktere tam jsou. Pri odeslani bych se podival, jestli mam neco takoveho ulozeneho, a kdyz ano, tak bych vygeneroval formular na zaklade tehle dat. Tim se kazda stranka stane nezavisla na ostatnich a mel by se ten problem vyresit, protoze i kdyz nekdo nektery z tech zaznamu smaze, tak to nevadi, protoze ta data se proste zahodi, coz u smazaneho zaznamu neni az tak kriticke ne?

Jine reseni by asi bylo, aby se editacni formular vytvarel zvlast pro kazdou polozku a tim by mohl cely tento problem odpadnout. Dal by se pak generovat urcite i pres ajax a i ajaxove odesilat, coz by resilo uzivatelsky komfort (a dalo by se tam IMHO pouzivat i to zamykani zaznamu, coz je technika bezne pouzivana ve vicevlaknovem programovani, kde se resi stejne problemy exkluzivniho pristupu).

Editoval arron (17. 10. 2010 1:54)

mcmatak
Člen | 490
+
0
-
  1. ano, že není optimální to mně právě trápí, ale moc nevím co s tím
  2. oddělit editační formuláře je bohužel nemožné, ztratíme tu výhodu kvůli které se to dělá (tu rychlost uživatelského ovládání)

jinak to co popisuješ je současná implementace, nicméně problém je v tom, co když dojde k nesprávnému vyplnění dat uživatelem, potřebuji zrekonstruovat nejen formulář pro jeho zpracování, ale i umožnit uživateli opravit chyby a vidět okolí toho formuláře, data na jednotlivých řádcích, v podstatě i další věci jako stránkování apod. které už nebude aktuální

musel bych si možná do session uložit všechna data, dle kterých se konstruuje datagrid, co pak ale není jasné, kdy invalidovat session / bojím se, že neúměrně začne narůstat a hlavně celkově se v kódu začne dělat neuvěřitelný chaos, protože úplně každé místo, které se generuje na základě nějakých dat musí umět generovat na základě dvou způsobů

arron
Člen | 464
+
0
-

Dle meho nazoru, pokud je ve formulari nejaka chyba a neni mozne ho zpracovat, tak to uzivateli prece muze byt skoro jedno, jestli kouka na aktualni aktualni informace nebo ne. Dulezite je, aby videl to, co pred chvili editoval a videl, ze jsou tam nejake chyby. To co je okolo, tim se nejspis bude zabyvat az ve chvili, kdy se formular odesle v poradku a v tu chvili uz se mu daji predhodit aktualni data. Co se tyka invalidace te session…mno…rozhodne je potreba ji invalidovat na konci uspesneho submitu (ve chvili, kdy je jasne, ze to vsechno probehlo tak jak melo). No a pak me napada, ze je potreba vymyslet nejaky elegantni zpusob, jak ji invalidovat ve chvili, kdy se uzivatel rozhodne ten formular vubec nesubmitnout a prejit treba na dalsi stranku. Myslim (ale ted to nemam fakt nicim podlozene), ze by se melo nechat zjistit, jestli se ma zpracovavat nejaky handle a podle toho se treba uz ve startupu rozhodnout a pripadne ta data v session smazat vcas.

Ad. oddelene formulare: Vzdyt to, ze jsou ty formulare oddelene, tak to jeste neznamena, ze nemuzou vypadat stejne jako ted ne? Akorat se nebudou submitovat vsechna data najednou, ale postupne (ajax). Ale je pravda, ze to bude asi slozitejsi…

mcmatak
Člen | 490
+
0
-
  1. ivalidaci si moc nedokážu představit, uživatel určitě může otevřít ten grid ve více oknech
  2. co se týče chyby, ano asi není důležitý balast okolo, no ale muselo by se navrhnout další rozhraní pro řešení chyb a tak jako tak je nutné uchovávat další data v řádcích, aby uživatel poznal co to vlastně edituje
  3. ad oddelené formy a ajax, myslím že, by bylo asi docela složité poznat kdy se má form odeslat (asi ho nebudu otravovat 100 butony), jinak nevím co krom problémů navíc by to přineslo
arron
Člen | 464
+
0
-

1. mozna si posilat nejaky token v hidden fieldu?
2. no co se tyka tech dat, tak by se ta stranka prece zrekonstruovala cela (vcetne dat okolo, jestli jsem to opravdu spravne pochopil), takze by to mohlo projit:-)
3. musel by tam byt nejaky buttonek no. Pak uz by to bylo v pohode, protoze by se odesilal vzdycky jenom jeden zaznam a vytvareni toho formu by bylo v pohode…to je vlastne ta hlavni vyhoda, ze jo.

mcmatak
Člen | 490
+
0
-
  1. token nic neřeší, jak poznat kdy invalidovat?
  2. nj ale znamená to jak jsem psal každé místo které něco vykresluje nebo zpracovává nějaká data tak učit dvě metody získání dat (ze session/nebo dibi)
  3. nj ale buttonek na kazdem radku, je proste hrozne zdrzeni, takže to ztrácí význam
arron
Člen | 464
+
0
-
  1. token to resi tak, ze kdyz zjistis, ze prisel, tak vis, ze jsi odeslal nejaky formular a ze ta data nesmis invalidovat (jedine po uspesnem submitu). Kdyz ten token neprijde, tak k zadnemu submitu nedoslo a ta data uz jsou stara (protoze uzivatel pravdepodobne presel na jinou stranku nebo proste udelal cokoliv jineho nez odeslani formulare)
  2. tak nevim kolik tech mist je, podle meho jenom ta tovarnicka toho formulare, je to jeden if a kdyz, tak se to da vytahnout do nejake metody a dokonce mozna to dat primo do modelu (to uz ale zalezi na konkretni implementaci), takze az takovy problem v tom nevidim:-)
mcmatak
Člen | 490
+
0
-
  1. jenomze to ty nepoznas jestli formular odeslal, nebo sel jinam, jak?
  2. no to jaka data uchovavat a jak zpracovavat mozna rešme potom co budeme vědět jak ty data uchovávat, jediné co mne napadlo je posílat je s formulářem, ale nechci přece návštěvníkovi ukázat serializované objekty, a těžko říct jak z toho vytahat pouze data těch objektů ze kterých to sestavujeme
arron
Člen | 464
+
0
-
  1. no hodis nejaky ten token do hidden fieldu toho formulare a kdyz se ten formular odesle, tak se ten token objevi bud v postu a nebo v getu. Kdyz se tam ten token neobjevi, tak uzivatel formular neodeslal, cili asi kliknul na neco jineho. Ale taky hodne zalezi jak mas ten grid udelany…
  2. Tak netreba uchovavat vsechna data. Myslim, ze staci uschovat jenom pole prislusnych idcek a z nich uz neni problem ta data vytahnout z databaze.
mcmatak
Člen | 490
+
0
-
  1. kdy ho invalidujes, kdyz proste form neodesle? coz je asi nejbeznejsi, takovych formu mas denne tisice, nelze poznat ze sel nekam jinam
  2. no to zas tak jednoduche neni
arron
Člen | 464
+
0
-
  1. uz to asi lip vysvetlit nedokazu:-)
  2. V cem je to tak slozite?
mcmatak
Člen | 490
+
0
-

mozná to jen nedomýšlíš do konce, když někdo prostě jen prohlíží jednotlivé stránky tak během 5 sekund projde 5 stránek, tzn. vytvoří 5 formu, které neodešle, není šance zjistit jestli form odeslal nebo ne, můžeš tam dát i dvacettokenu, ale stále nechytíš to, že něco neprovedl

arron
Člen | 464
+
0
-

No a to je prave ono…pokud se ten form neodesle, tak se pri dalsi pozadavku nikde zadny token neobjevi a ja vim, ze uzivalel ten form neodeslal, tzn. dalsi form musim vytvorit s aktualnich dat, takze ty co mam ulozene nekde v session muzu zahodit.

mcmatak
Člen | 490
+
0
-

no to se pravě mýlíš a o tom jsme se také bavili, co když ten samý form, což je 100% tutovka prohlíží ve více oknech, resp. tabech firefoxu

potapnik
Člen | 127
+
0
-

Je tu na mě moc textu, takže se ztrácim, ale: nemůže to bejt live? Ajaxový? Ve chvíli kdy někdo někde něco smaže, tak se z datagridu ztratí? a prostě není? řekněme timer na 200ms, který prochází znova db a prvky, který už tam nejsou skryje, vyhodí, zničí a prvky se změnou změní? Pokud na tom dělá 10 lidí je to eště oukej ne? Zátěž na serveru zas taková nebude…

arron
Člen | 464
+
0
-

mcmatak napsal(a):

Nahodny token? Muze byt zaroven klicem od tech dat v session. Tim se resi editace ve vice oknech, ale ne ta invalidace. Cili pak bych se asi snizil k tomu, ze bych ty data v session rusil jenom po uspesnem submitu a jinak nastavil jejich vyprseni na treba 30 minut (ci proste nejakou vhodnou dobu). Kdyz se do te session bude ukladat pole nejakych id (a nebudou jich v jednom pozadavku stovky, coz asi nebudou), tak to zase nebude tak moc dat a pritom to hodne pomuze.

mcmatak
Člen | 490
+
0
-
  1. jednak za pul hodiny vygenerujes uctyhodny balicek dat, odhadem na jednoho cloveka to bude 1.5mb dat minimálně, což nevím jestli se mi líbí v session
  2. ono opět možnost editovat form jen do půl hodiny, je dost problém, to není moc user friendly, jednoduše tuhle možnost bych asi uzavřel, ať zbytečně nerozvíjíme flame, což už stejně je
  3. samozřejmě by se data dala odesílat spolu s formem, ale je taky otázka co vše chceme/můžeme ukázat uživateli ze střev systému, serializace a deserializace dat je zase další api navíc / no přijde mi to jako moc potíží na běžný problém
despiq
Člen | 320
+
0
-

myslim ze tvuj hlavni problem je moznost odeslani editace 100 polozek najednou, pri editaci kazdeho atributu kazde polozky zvlast bys problem editace neexistujici polozky vyresil snadno zpravou ze uz to neexistuje

nicmene pokud chces zachovat ten zpusob editace tak hura do html5 websockets jak uz tu bylo zmineno, pak tomu uzivateli prsknes zpravu ze 10 polozek z tech co edituje je jinde nebo to osetris proste jinak nebo to naopak zkontrolujes jestli nahodou tam ten aktivni uzivatel neco nezmenil a pokud ano pak nenechas toho co to maze to smazat

ale pridelavas si strasne prace dovedu si zive predstavit situaci kdy si to clovek necha otevrene a dva dny bude neco upravovat v 1000 polozkovem datagridu

kolaborace je podle me velice zradna vec, jeste me napada moznost ty zaznamy nemazat ale deaktivovat a pri rekonstrukci formulare pred overenim brat v podtaz i deaktivovane polozky noa pak je pripadne pri neaktivite uzivatelu mazat cronem v pul ctvrty rano :)

srigi
Nette Blogger | 558
+
0
-

@karmiq bohuzial websockets je v tomto vlakne OT, lebo:

  1. podporuju to iba najmodernejsie browsery (vypadava vsetko pod FF-4, O-10.7, IE9, Safari 5)
  2. neurobis to s PHPckom – aplikacia musi bezat ako daemon (nonstop)

Myslim, ze bod 2. si @mcmatak nemoze dovolit, znamenalo by to uplne zahodit PHP/Nette.

Editoval srigi (19. 10. 2010 16:52)

despiq
Člen | 320
+
0
-

ad 1: pokud to spravuje pouze 10 lidi, nebude problem jim prohlizec nahrat dle libosti

ad 2: tak to si teda nemyslim, tlaceni dat do prohlizece urcite pujde i s phpckem

mcmatak
Člen | 490
+
0
-
  1. obavam se ze to neni ta spravna cesta, app by měla být přístupná, jinak je to řešení spousty problémů navíc
  2. nj

mám obecný datagrid, joinuje tabulky, vytváří různé vazby, subgridy a zanoření editačních prvků, tohle všechno je problematické rekonstruovat na základě nějakého idečka, těch dat je potřeba hodně, navíc je to celé hodně dynamické, takže zachytit stav v nějakém okamžiku je prostě problém, no nic, obávám se, že jediné řešení je zpracovávat rovnou post, čemuž jsem se chtěl zásadně vyhnout :(

David Grudl
Nette Core | 8142
+
0
-

Mám takový pocit, že v tomto vlákně panuje značný jáokozetyovozeismus. Totiž už samotná otázka je trošku špatně položená a vyznívá „jak řešit paralelní zpracování“, přitom jde o „jak udělat továrničku na komponentu“. Klíčový je asi tento okamžik

mcmatak napsal(a):
Bez Nette formulářů ani žádná taková kontrola nikdy neexistovala, a tak jste zpracovávali pouze POST a tohle nebyl problém.

Stručná odpověď: tak to s Nette formuláři řeš úplně stejně, jako bez nich a máš po problému. Mělo by to jít udělat stejně a pokud snad narazíš na překážku, napiš, odstraníme ji.

Delší odpověď: může se snadno stát, že lepší abstrakce a použití komponent práci nezjednodušší, ale naopak zkomplikují. Obvykle proto, že je používáme špatně, někdy i proto, že jsou špatně navržené. Navíc v jednodušších případech se to nemusí vůbec projevit.

mcmatak prostě vytváří formulář na základě dat získaných z databáze. Vzniká tak problém, jak zajistit, aby byl sestaven stejný formulář i v okamžiku, kdy se obsah databáze změní. Lze to řešit různými způsoby, ale ptám se: proč (kua) vytváří formulář na základě dat, které se mění? Tak to prostě nedělej :-)

Továrnička mi vytvoří datagridový formulář (bez vazby na DB) a ten poté naplním výchozími hodnoty z databáze. Textová pole, checkboxy, skrytá pole s primárním klíčem atd. Po odeslání si zase vytvořím ten samý formulář (tj bez vazby na DB) a data už získávám z odeslání. Validuju, zpracuju, hotovo.

mcmatak
Člen | 490
+
0
-

nějak se to protahuje a je tady spousty balastu, nejraději bych to smazal a zeptal se znovu, ale to bych znovu musel vysvětlovat ty samé věci

pokusím se být co nejvíce konkretní

  1. ano souhlasím sestavit formulář znovu na základě odeslaného, ale co když tam bude chyba jak o tom spravím uživatele? k tomu, aby mohl ve formuláři opravit chyby potřebuje kontext a ten vzít kde
  2. jinak představ si úplně obecnou komponentu datagrid, která prostě zobrazuje na základě XY filtrů, na základě XY řazení nějaká data z dtb, jen stěží dokáži složit podobný dotaz na základě 100× ideček

ale tak to už je problém jiný, šlo mi jen o to jestli tohle někdo řeší lépe než já, výsledkem je to sestavit na základě něčeho znovu / nebo prostě zpracovat holý post no

Filip Procházka
Moderator | 4668
+
0
-
  1. připoj formulář do stromu komponent už v okamžiku první instance
protected function createComponentMyForm($name)
{
	$form = new AppForm($this, $name);
  1. udělej si jako první komponentu hidden field a ulož do něj IDčka řádků
	$form->addHidden('ids', implode(',', $datagrid->fetchAllIDs()));
  1. pokud byl formulář odeslán
	if ($form->isSubmitted()) {

poskládej ho na základě poslaných ID

	foreach ($datagrid->fetchByIds(explode(',', $form['ids']->value)) as ...

jinak podle databáze

	foreach ($datagrid as ...

někomu se to možná nebude líbit, ale funguje to :P

mcmatak
Člen | 490
+
0
-

já vím je to vlákno dlouhé na čtení no, smažme ho :) asi tady nic nevymyslíme

David Grudl
Nette Core | 8142
+
0
-

HosipLan napsal(a):

…jinak podle databáze

Proč pořád sestavujete formulář „podle databáze“?

mcmatak
Člen | 490
+
0
-

nejde o formulář, jde o to, že potřebuješ nabídnout uživateli možnost změny, když něco zapsal chybně, takže ten input potřebuji zasadit do nějakého kontextu, tzn. do řádku gridu, potřebuji rekonstruovat řádek gridu, název produktu, cenu, atd. aby si uvědomil u čeho to opravoval, s tím se asi váše odeslat komplet grid v hidden polích, další řešení

arron
Člen | 464
+
0
-

Tak tady uz by to opravdu chtelo nejake zdrojaky, protoze mam opravdu pocit, ze se tu kazdy bavime o necem jinem. Protoze kdyby ne, tak tech reseni tohohle problemu (tak jak jsem ho pochopil ja a zjevne i nekteri dalsi) tu uz bylo tolik, ze jedno si z nich vybrat, lehce ho priohnout pro konkretni zdrojak a cele to vyresit uz nemuze byt tak slozite…