Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Ahoj, v programátorské minisoutěži o modrou placku PHP (ve které je důvtipně schovaný slon) a nějaké nálepky budeme programovat validátor. Navrhněte třídu, která bude pomáhat validovat formuláře. Návrh a princip fungování nechám kompletně na vás, jistě ve svých aplikacích nějakým způsobem formuláře zpracováváte. Pokud ne, máte teď šanci se to naučit. Pokud byste neměli inspiraci, mohlo by to vypadat třeba takto:

Vytvoří se instance třídy Validator a metodou pridejPodminku se popřidávají jednotlivá omezení (email, heslo, vlastní (reg. výraz)) spolu s názvem políčka . Skript, který formulář zpracovává, následně vytvoří takovouto instanci a zavolá metodu zvaliduj(), která projede POST a zjistí zda pole mají daný formát. Takovéhle řešení úplně stačí. Samozřejmě čím chytřejší validátor bude, tím lépe, mohl by např. odhalovat jestli tam nejsou políčka navíc.

Pokročilejší si mohou zkusit udělat Formulář stylem Nette, kde se vytvoří formulář, přidají se do něj políčka s pravidly a formulář má na sobě jak metodu zvaliduj, tak metodu vypis, která vygeneruje HTML kód formuláře a přidá tam tyto podmínky jako HTML 5 atributy.

Snažte se o objektovou aplikaci, čas si dejme jako vždy do neděle 4.8. do 18:00.

Editováno 28.7.2013 19:10
Odpovědět 28.7.2013 19:00
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
aatron
Neregistrovaný
Avatar
aatron:

není už po deadlinu? :D

 
Nahoru Odpovědět 28.7.2013 19:09
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na aatron
David Čápka:

Nojo, neumím se dívat na kalendář, díky :D

Nahoru Odpovědět 28.7.2013 19:09
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Inoue Yūki
Redaktor
Avatar
Inoue Yūki:

A já už začal psát. :D

Nahoru Odpovědět 28.7.2013 19:41
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Inoue Yūki
David Čápka:

To můžeš použít v tom FW :P

Nahoru Odpovědět 28.7.2013 19:43
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na David Čápka
Inoue Yūki:

Jestli na to zbude místo, proč ne. :D Už i tak nevím, kam dát ty důležité části. :D

Nahoru Odpovědět 28.7.2013 19:55
Avatar
Martin Konečný (pavelco1998):

Opravdu musí být ty názvy česky? Raději bych to psal v angličtině. :-)

 
Nahoru Odpovědět 28.7.2013 20:03
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:

Cite: Pokud byste neměli inspiraci,...

Přemýšlím, co bych v tom formuláři asi tak validoval... Nějak mě nic nenapadá, protože skoro nic nevaliduji.

Editováno 28.7.2013 20:09
Nahoru Odpovědět 28.7.2013 20:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Nahoru Odpovědět 28.7.2013 20:45
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Nahoru Odpovědět 28.7.2013 22:15
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

A proč? S tou si přece databáze poradí sama.

Kromě toho se na SQL injekci nedělá validace, ale sanitizace.

Nahoru Odpovědět  +1 28.7.2013 22:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Milan Gallas
Redaktor
Avatar
Milan Gallas:

Tak můj kód najdete zde:
http://www.itnetwork.cz/dev-lighter/155
http://www.itnetwork.cz/dev-lighter/156

v css mám akorát následující řádek:

textarea{width: 350px;height: 100px;}
 
Nahoru Odpovědět 4.8.2013 15:44
Avatar
Kit
Redaktor
Avatar
Odpovídá na Milan Gallas
Kit:

S těmi pseudokomentáři si děláš srandu ty nebo tvoje IDE?

function jeMocDlouhy()
{ // BEGIN function jeMocDlouhy
        return(count($this->zprava) > 244);
} // END function jeMocDlouhy
Nahoru Odpovědět 4.8.2013 17:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Milan Gallas
Redaktor
Avatar
Odpovídá na Kit
Milan Gallas:

To PSPad mě se to nechce mazat tak to tam nechávám :D

 
Nahoru Odpovědět 4.8.2013 17:11
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Milan Gallas
David Čápka:

Tenhle validátor není ale přeci vůbec univerzální, když budeš chtít zvalidovat jiný formulář, musíš udělat novou třídu. To potom ztrácí smysl. Žádné další výtvory ke mne nedorazily (pokud jsem je nepřehlédl), což je škoda, je to určitě zajímavé téma. Asi za to může to horko, možná se k tomu ještě vrátíme později. Zde tedy bohužel nic.

Nahoru Odpovědět 4.8.2013 18:08
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

No jo, úplně tam chybí validace e-mailu.

Nahoru Odpovědět 4.8.2013 18:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Martin Konečný (pavelco1998):

Ahoj,

když sem nikdo nic nedal, tak sem jen pro ukázku hodím to, co jsem sepsal já. Bylo by ale potřeba doladit ještě hodně věcí, např.:

  1. Nevím, jak by fungovalo radio, to jsem nezkoušel.
  2. Atributy se zadávají pomocí pole, ze kterého se jednak vytvoří HTML atributy, tak i podmínky pro validaci - funguje zde jen required.
  3. Metoda Form::process() by určitě šla napsat lépe.
  4. Nepodporuje všechny inputy (texterea, upload, ...).
  5. Checkboxy se nedají vytvářet tak, aby se jejich výsledky odeslaly jako pole (např. name="nazev[]").

Na druhou stranu jsem se pokusil o možnost callbacků při odeslání, úspěšném zpracování a chybě. Callbacky se uloží do pole, tudíž lze volat i více callbacků na jednu událost.
Třída Form obsahuje metodu, která vám vrátí formátovaný obsah chyb (nečíslovaný seznam). Lze si vytvořit funkci, kterou registrujete jako callback pro událost onFailure, která vám chyby vypíše (tzn. se nemusíte o vypsání chyb starat sami).

Zde přikládám aktuální zdrojáky:

Form
http://www.itnetwork.cz/dev-lighter/148

Element
http://www.itnetwork.cz/dev-lighter/149

Textové pole
http://www.itnetwork.cz/dev-lighter/150

Heslo
http://www.itnetwork.cz/dev-lighter/151

Odesílací tlačítko
http://www.itnetwork.cz/dev-lighter/152

Checkbox
http://www.itnetwork.cz/dev-lighter/153

Radio
http://www.itnetwork.cz/dev-lighter/154

 
Nahoru Odpovědět 4.8.2013 18:21
Avatar
Martin Konečný (pavelco1998):

Omlouvám se za double post, jen kdyby to někoho zajímalo, tak primitivní použití by mohlo vypadat třeba takto:

// Funkce, která vypíše seznam chyb.
function displayFormErrors($form)
{
        $form = $form[0];
        echo $form->getErrorsAsString();
}

// Vytvoření formuláře a jeho elementů.
$loginForm = new Form("login");
$loginForm->addInput("Jméno", array(
        "name" => "name",
        "minlength" => 3,
        "maxlength" => 10,
        "pattern" => "^[a-zA-Z0-9]+$",
        "required" => "required"
));
$loginForm->addPassword("Heslo", array(
        "name" => "password",
        "minlength" => 5,
        "required" => "required"
));
$loginForm->addCheckbox("remember_login", array(
        "name" => "remember_login",
        "value" => 1
));
$loginForm->addSubmit(array(
        "name" => "login",
        "value" => "Přihlásit se"
));

// Registrace callbacku
$loginForm->onFailure[] = array("displayFormErrors", $loginForm);

// Vykreslení formuláře
echo $loginForm;

// Zpracování formuláře
if ($_POST) {
        $loginForm->process($_POST);

        if (!$loginForm->hasErrors()) {
                if ($loginForm->values->name === "magnus" && $loginForm->values->password === "magnus") {
                        echo "Přihlášení admina 'magnus'.";
                } else {
                        echo "Přihlášení uživatele '" . $loginForm->values->name . "' pod heslem '" . $loginForm->values->password . "'.";
                }

                if ($loginForm->values->remember_login) {
                        echo "<br />Zapamatovat si přihlášení.";
                }
        }
}
 
Nahoru Odpovědět 4.8.2013 18:31
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Martin Konečný (pavelco1998)
David Čápka:

Jo, tohle vypadá docela použitelně :) Proč jsi to nepřihlásil? :P

Nahoru Odpovědět 4.8.2013 20:21
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Martin Konečný (pavelco1998):

Jednak protože jsem to dopisoval asi před dvěma hodinami, jednak jsem myslel, že bude větší počet soutěžících, tak jsem nechtěl vkládat nedokončený výtvor. :-)

 
Nahoru Odpovědět 4.8.2013 20:39
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Martin Konečný (pavelco1998)
David Čápka:

On většinou je, ale prázdniny a horko dělají své :D Můžeš to tu publikovat, třeba si z toho někdo něco vezme.

Nahoru Odpovědět 4.8.2013 20:42
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 21 zpráv z 21.