Formy na WWW ------------
obecne posila 'data' (as-is) na danou stranku (v 'action'). Nedela sam zadne kontroly, netrakuje multirequest-form (form na vice 'strankach) Aby neslo form itemy 'generovat' (napr. roboti a dalsi nebudou shcopni automaticky 'generovat' formy, coz je jedine dobre) tak itemname bude 'generovat' ve forme cwfiXXXXXXXXXXXX kde 'X' je HASH z session ID, 'name' (nazev itemu) a 'form'. Form je pak alias formu (z hlediska TPL - pokud je pouzito VICE formu na jedne strance, aby mohli mit stejne itemy). Forms vystupuji jako "forms" library. Je tedy treba tuto library prez {:lib webforms} nacist. Pro generovani nazvu form itemu slouzi funkce {:forms.itemname name} {:forms.itemname formname.name} Jak formname, tak itenmane jsou klasicke aliasy jako v CBS. Pokud 'formname' schazi, pouzije se 'form'. Nejvetsi problem je, ze nelze poznat, JESLI formualr BYL nebo NEBYL odeslan. TPL tedy bud item 'ma' nebo 'nema', ale neni mozne zjistit, jesli uzivatel 'klikl' na nebo je to 'zobrazeni' formu. S timto se TPL musi poprat (napr. testovat item, ktery ma vzdy nejakou hodnotu, nebo napr. HIDDEN ITEM s aliasem 'odeslano' a ten pak testovat) Templata ma moznost 'trackovat' si form itemy jako takove a samotne formy. To se deje na urovni databaze. TPL ma tedy moznost 'ulozit' si stav formu (itemy) a posleze je dle pozadavku nacist. 'stav' formu (ktera stranka a podobne) si pak muze rpedavat prez nejaky item, nebo 'dynamicky' urovat podle toho, jake itemy jsou jiz vyplne (a jak). V realu bude asi rozumna kombinace obou dvou. Form jakozto takovy je preprezentovan 'tabulkou' o techto sloupcich: alias - item alias * vyplnuje TPL val - hodnota (as-is) * vyplnuje user v prohlizeci format - 'format' hodnoty (viz nize) - retezec, dle ktereho se tesuje 'val' jesli VYHOVUJE * vyplnuje TPL state - status itemu: * vyplnuje system miss - neni dostupny bad - value je 'spatna' (neodpovida) ok - no comment origin - odkud item pochazi * vyplnuje system - (nic) neni dostunej post - odeslano 'formem' (TED) cache - nacten pomoci 'read' Co radek to 'item' ve formu. Form je platny v ramci jednoho requestu. Lze ale zaroven nacist/ulozit a uchovat ho tak mezi ruznymi requesty - typicky formular na 'vice' stranek Prace s itemama {:forms.itemval form.alias} vraci hodnotu form itemu ('' pokud je nedostupny) {:forms.itemval form.alias def} vraci hodnotu form itemu (def pokud je nedostupny) Vystup je entitiovan. Tato funknce akceptuje 'flagy' pred jmenem: ! - potlaci entitiovani vystupu {:forms.itemvalif form.alias val a|b} pokud je form item roven 'val' vraci 'a' jinak 'b'. Cast |b neni povinna {:forms.itemstate form.alias} vraci status itemu {:forms.itemorigin form.alias} vraci origin itemu {:forms.itemattr form.alias} vraci 'atribut' itemu Obecne: type - 'file' nebo 'char' podle typu itemu Pro soubor: size - velikost mime - mime typ name - originalni filename ext - pripona {:forms.itemread form.alias TYP} precte 'item' z formulare (fyzicky poslaneho prohlizecen) item se ulozi k formu (tabulce). Pokud hodnota nevyhovuje, pak jeho status je 'bad' jinak 'ok' (viz ! modifikator) pokud se na zacatku pouzije @ tak to znamena, ze item se pro formwrite NEMA ukladat (pokud neni uvedem, tak se ulozi) pokud jiz item ve formu existuje (napr. po read), tak nove prichozi prepise drive ulozeny (pokud se nespecifikuje flag #) ? na zacatku negeneruje chybu, pokud item NEXISTUJE v POST datech (form item se nezalozi) - item je volitelny # pokud jiz item existuje, neprepisovat novou hodotou @ neukladat item jako soucast 'formu' ! pokud item generuje chybu, neukladat jako soucast 'formu' - pozor, nasledny dotaz na exists bude vracet 'miss' stav a ne 'err' {:forms.itemread form.alias TYP errtable txt} dtto, pokud chyba, do tabulky 'table' vlozi sloupec 'text' o hodnote txt (viz nize) a slopec 'form/item' s patricnou hodnotou {:forms.itemtest form.alias} testuje pritomnost item (fyzicky poslaneho _nebo_ jiz formoveho) - vraci 'state', item se NEULOZI k formu, pokud je zjisten v POST datech {:forms.itemtest form.alias TYP} dtto, ale zaroven testuje 'typ' {:forms.itemdel form.alias} vymaze form item z formularove 'tabulky' Formulatova tabulka je zaroven PRIMO dostupna jako 'wwwForms_X' kde X je alias daneho formu (pro tloop a pod.) Veskery form.alias lze zkratit jen na alias, kde form je potom 'form'. Prace s formem {:forms.errcount form.errtable} vraci pocet chyb v 'errtable' (viz table v formitemread) {:forms.exists form} vraci 1 pokud form existuje (ma alespon 1 item), jinak 0 {:forms.write form} vrati 'formular' (hatmatilka) {:forms.read form.item} nacte form z itemu (hatmatilky) tak jako kdyby byl odeslana na kazdy item provedeno prislusne formitemread pokud existuje '_form_xxx' (kde xxx je form name, priapdne jen _form) ve WWW link variables, tak pretizi pripadny POST data a naimportuje se odsud. takze lze udela primo link na form. {:forms.rollback form} vrati form do stavu, v jakem byl pri startu 'requestu' - po poslednim formread OBECNE POZOR na jendu vec : nektere zkurvene prhlizece (napr. MsIe) maji rady chyb a OMEZENI - mezi ne patri i maximalni DELKA 'linku' - 2047 znaku, takze pri vyplnovani VELKYCH FORMULARU nejde pozuit na navraceni stranek primo WWW link, ale je treba udelat 'form' (skript na link, nebo tlacitko, to je fuck) Jak se nakonec 'nalozi' s form itemama je kapitola jina a nedulezita, defato to nakonec bude 'insert' to tabulky, kterezto radek se pak fyzicky ulozi do prislusnych dat. {:ife {:forms.itemtest posted}} MAME FORMULAR {:else} PRVNI ZOBRAZENI {:endif} Na hodnote 'posted' nezalezi, jde o to, ze byla poslana. Potom, kdyz uzivatel klikne nekam a vrati se na form, bude resetovan, coz by byt mel (!!!) jinak muze nastat chaos s daty. Datove typy: do same jako parametr 'type' v cbsRequestVar napr: id alias idi cislo id. alias s teckama '' (nic) text 'as-is' list:x carkama odelenej seznam typu 'x' (alias, ...) email .... v pripade souboru, se jedna o , oddeleny seznam, ve tvaru [name:]val pokud neni uvedeno name, val oznacuje povoleny mime - image/jpeg, image/*, */* a pod. Mozne hodnoty k nastaveni: maxsize maximalni velikost souboru b jatech (vyzadovano) Priklad - mame formular kde je: jmeno prijmeni email Pri zorbazeni formu jsou vsechny itemu prazdne az na 'prijmeni' kde je napsano 'zde vyplne prijmeni' Pri spatem odeslani se form vypise znova, napise to chybu a 'vyplni' to hodnoty zpet (i chybne, muze jit jen o preklep) -------------------------------------TPL---------------------------- zpracujme form jesli ho mame {:if {:forms.itemtest posted}=shit} {:if {:forms.itemread jmeno text.30}} 'text s maximalne 30ti znaky' {:tinsert errors err=Spatne jmeno vole !} {:endif} {:if {:forms.itemread prijmeni text.10}} 'text s maximalne 10ti znaky' {:tinsert errors err=Spatne prijmeni vole !} {:endif} {:if {:forms.itemread email email} 'a@b.c' {:tinsert errors err=Spatnej email debile...} {:endif} TO je opruz... Uplne STEJNY vysledek sa udelat i takto: {:forms.itemread jmeno text.30 errors Spatne jmeno vole!} {:forms.itemread prijmeno text.10 errors Spatne prijmeni vole!} {:forms.itemread email email errors Spatne email debile....} vyrobili jsme si 3 zaznamy do 'formu', pokracujeme testem na chybu: {:ife {:table.len errors}=0} formular je OK, neco udelame (insert) {:www.redir .....} 'www.redir' je to same jako 'link', ale OKAMZITE presmerovani - provadeni templaty tim OKAMZITE KONCI v nasem pripade na 'theank you for registering' DALSI moznost je: Thank you for registering. It was processed sucesfully..... bla bla {:learn formdone 1} {:else} je tu CHYBA VOLE mas tu chyby debile ! {:table.loop errors} {:table.val text}
{:table.loop} a pokracujeme, form se zobrazi s hodnotama co 'zname' {:endif} {:endif} pokud uz je formular 'odeslat' nezobrazovat ho.... (v pripade ze jsme nepouzili redirekt !!!) {?:if formdone=} {:endif} REALNY FORM CO JE JAKO TESRTOVACI NA WEBU ----------------------------------------- (outdated, syntaxe dle stare TPL - cili pouze pseudokod) je jedne PRIVATNI item 'show' - integer.... form tests

{?:ife show=0} {:forms.itemread !@pass idi} {:if :forms.itemtest pass=miss} Vyborne, vitejne u naseho formu. Muzete si bud polibit prdelku, nebo zadecek, podle vaseho uvazeni

{:endif} {:learn show 1} {:else} A pan si pral skocit na nejakou stranku... Tak dobra

{:endif} {:forms.read form} {:if :forms.itemval pass=1} {:forms.itemread name text errs Name neni platne !!!} {:forms.itemread nick id errs Nick neni platne !!!} {:forms.itemread ltype list:ssh,telnet,vnc errs Login type neni platne !!!} {:if :tlen errs=0} {:learn show 2} {:endif} {:endif} {:if :forms.itemval pass=2} {:learn show 2} {:forms.itemread heslo idi errs Helso josu jenom cisla trupko !} {:if :forms.errcount errs=0} GRATULUJI ! Formatuju disk.

Odeslana data:

Name:{:forms.itemval name}
Nick:{:forms.itemval nick}
Login:{:forms.itemval ltype}
Heslo:{:forms.itemval heslo}

Pokud se vam to nelibi, muzete se vratit na stranku {*www _page=4&_form=\{:forms.write\}&show=1|[1]} nebo {*www _page=4&_form=\{:forms.write\}&show=2|[2]}
{:return} {:endif} {:endif} {:if :forms.errcount errs!=0} Jsou tu nejake chyby, opakovani je matka moudrosti...

{:tloop errs} ---> {:tval text} <---
{:tloop} {:endif}
{:if show=1} Zadejte jmeno a podobne...

Name: 
Nick: 
Login type: 

{:endif} {:if show=2} Jeste login info a uz to budes mit za sebou !

Heslo: 
{:endif}