Autor Zpráva
martindeveloper
Profil
Dobrý den.

Rád bych chtěl slyšet Váš názor na následující kód.
Jedná se mi o přehlednost a hlavně jednoduchost tvorby formulářů.
Snažím se možným vývojářům komponent/modulů poskytnout co největší komfort.

Výsledek kódu lze vidět zde : http://vcms.ifrit.eu/testForm

Mimochodem třetí parametr u pravidel určuje zda-li se pro něj má generovat JS (defaultně true pokud je $form->useJs = true).

Děkuji za názory.

<?php

$form = new Form;
$form->useJs = true;

$form->setQuestion('Kolik kol má osobní automobil');
$form->setAnswer(4);

$form->addGroup('Hlavní');

$form->addTextbox('name', 'Uživatel')->addRegex('/^[a-z0-9]*$/i', 'Uživatel nesmí obsahovat speciální znaky !')
                                     ->notEmpty('Položka "Uživatel" nesmí být prázdná !')
                                     ->setMinLength(4, 'Minimální délka uživatele jsou 4 znaky !')
                                     ->equal('martin', 'Nesprávný uživatel !', false);
                                     
$form->addPassword('pass', 'Heslo')->onlyNumeric(0, 'Heslo může být pouze celočíselné !')
                                   ->equal('1425', 'Nesprávné heslo !', false);
                                   


$form->addTextbox('email', 'Email')->notEmpty('Položka "Email" musí být vyplněna !')
                                   ->addRegex(Form_vars::Email, 'Neplatný formát emailu !');

$form->addTextbox('url', 'Web')->notEmpty('Položka "Web" musí být vyplněna !')
                                   ->addRegex(Form_vars::Url, 'Neplatný formát adresy webu (např.: http://mujweb.cz/) !');

$form->addTextbox('date', 'Datum narození (rok-měsíc-den)')->addRegex(Form_vars::DateFormat, 'Neplatný formát data !');

$form->addGroup('Pravidla');

$form->addCheckbox('licence', 'Souhlasíte s pravidly', 'yes')->equal('yes', 'Pro pokračování musíte souhlasit s pravidly !');

$form->addGroup('Ostatní');

$form->addTextarea('signature', 'Podpis')->notEmpty('Podpis nesmí být prázdný !');

$form->addTextbox('ip', 'Vaše IP adresa', $_SERVER['REMOTE_ADDR'])->addRegex(Form_vars::IPv4, 'Neplatná IP adresa !');

$form->addCaptcha();

$form->addLine('<br />', true);

$form->addSubmit('submit', 'Odeslat');
$form->addReset('reset', 'Smazat');

if ($form->isSubmitted()) {

    if ($form->isHuman()) {
        if ($form->isValid()) {
            Text::h2('Gratuluji ! Vše je správně !');
        }
    }else{
        Text::p('Neplatná odpověď !', 'form_message');
    }

}

echo $form;
Alphard
Profil
Dost mi to připomíná Nette. Ale zrovna formuláře v něm moc neznám, četl jsem jen pár náborových článků. Vcelku se mi to ale líbí. Doplním tady spíš pár tipů, co doplnit.

->setMinLength(4, 'Minimální délka uživatele jsou 4 znaky !')

Tady se mi nelíbí, že je nutné dvakrát měnit hodnotu, nešlo by tam dát zástupný znak, třeba %i?

$form->setQuestion('Kolik kol má osobní automobil');
$form->setAnswer(4);

Tady by se mohlo třeba umožnit více otázek a jedna by se náhodně vybrala.

$form->setCaptcha('Kolik kol má osobní automobil', 4);
$form->setCaptcha('Hlavní město Francie', "Paříž");



$form->addTextbox('ip', 'Vaše IP adresa', $_SERVER['REMOTE_ADDR'])

Kdybych chtěl při editaci dat jen předat pole formuláří s tím, že zadané hodnoty doplní na základě klíče a name, bylo by to moc? Např.

$form->addTextbox('name', 'Uživatel');                                  
$form->addPassword('pass', 'Heslo');       
$form->addTextbox('email', 'Email');
$form->addTextbox('url', 'Web');

$values = array ('name' => 'Uživatel', 'url' => 'adresa');

$form->addValues($values);
martindeveloper
Profil
Díky za tipy, určitě dodělám.
Jinak Nette sice znám, ale nikdy jsem ho nepoužíval takže podobnost je pouze náhodná.

Nějaké další tipy ?
Aesir
Profil
martindeveloper:
Jinak Nette sice znám, ale nikdy jsem ho nepoužíval takže podobnost je pouze náhodná.
On skoro každý framework obsahuje podobnou třídu (komponentu) pro vytváření formulářů.

Nějaké další tipy ?
Spíš otázky, jak bych mohl jako vývojář ovlivnit způsob vykreslení formuláře? A jakým způsobem bych mohl rozčlenit formulář do více, na sobě, závislých částí, abych mohl jednodušše vytvářet vícekrokové formuláře?
martindeveloper
Profil
Vykreslení formuláře lze zatím ovlivnit pomocí třetího parametru v konstruktoru (v budoucnu chci doplnit metodu loadTemplate() pro valstní šablony ), který může být : table (default), paragraph (řádky do <p> názvy skupin do <h3>), ulist (<ul>, <li>, <li><h3>) nebo fieldset (<fieldset>, <p>, <legend>).

Vícekrokové formuláře to zatím neumí, ale dobrý tip pro další featuru (resp. jednoduše by to šlo přes JS, ale pokud každé odeslání má být refresh stránky tak to zatím neumí).

A jako další featuru právě dodělávám $form->useAjax = true; $form->ajaxTargetDiv = 'id divu do kterého se nacpe výsledek ajax requestu'.

Nějaké další návrhy ?

EDIT:

Ještě jsem zapomněl že každému prvku lze nastavit class a i celému formuláři lze nastavit class nebo id.

Hotovo
- Zástupný znak %i dodělán
- Více otázek do captcha doděláno (náhodné vybírání)

Pracuje se
- Ajax (90%)
- addValues (50%)
- Vícestránkové formuláře (přes JS - 100%, přes refresh 20%)
- loadTemplate (0%)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: