IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Machr na PHP - Validátor formulářů

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:28.7.2013 19:00

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
New kid back on the block with a R.I.P
Avatar
aatron
Neregistrovaný
Avatar
aatron:28.7.2013 19:09

není už po deadlinu? :D

 
Nahoru Odpovědět
28.7.2013 19:09
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na
David Hartinger:28.7.2013 19:09

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

Nahoru Odpovědět
28.7.2013 19:09
New kid back on the block with a R.I.P
Avatar
Neaktivní uživatel:28.7.2013 19:41

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

Nahoru Odpovědět
28.7.2013 19:41
Neaktivní uživatelský účet
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Neaktivní uživatel
David Hartinger:28.7.2013 19:43

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

Nahoru Odpovědět
28.7.2013 19:43
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Neaktivní uživatel:28.7.2013 19:55

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
Neaktivní uživatelský účet
Avatar
Martin Konečný (pavelco1998):28.7.2013 20:03

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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:28.7.2013 20:06

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 Hartinger
Vlastník
Avatar
Odpovídá na Martin Konečný (pavelco1998)
David Hartinger:28.7.2013 20:45

Můžeš je udělat i anglicky :)

Nahoru Odpovědět
28.7.2013 20:45
New kid back on the block with a R.I.P
Avatar
Odpovídá na Kit
Michal Žůrek - misaz:28.7.2013 22:15

validuj SQL injekci :D

 
Nahoru Odpovědět
28.7.2013 22:15
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:28.7.2013 22:22

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
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
Tvůrce
Avatar
Milan Gallas:4.8.2013 15:44

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
Tvůrce
Avatar
Odpovídá na Milan Gallas
Kit:4.8.2013 17:06

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
Tvůrce
Avatar
Odpovídá na Kit
Milan Gallas:4.8.2013 17:11

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 Hartinger
Vlastník
Avatar
Odpovídá na Milan Gallas
David Hartinger:4.8.2013 18:08

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
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:4.8.2013 18:16

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):4.8.2013 18:21

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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Martin Konečný (pavelco1998):4.8.2013 18:31

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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Martin Konečný (pavelco1998)
David Hartinger:4.8.2013 20:21

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

Nahoru Odpovědět
4.8.2013 20:21
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Martin Konečný (pavelco1998):4.8.2013 20:39

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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Martin Konečný (pavelco1998)
David Hartinger:4.8.2013 20:42

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
New kid back on the block with a R.I.P
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.