UserCustom ClientScript Validace?
- Endrju
- Člen | 147
Zdravim!
- Chtěl bych se zeptat, jak udělat vlastní client side (JavaScriptovou) validaci, která bude ekvivalentní server side validaci (PHP). Víte jak na to? Neexistuje v Nette nahodou něco takového, že když bych vytvořil svůj vlastní validátor, tak by k němu Nette samo vygenerovalo jeho JavaScriptový ekvivalent?
- Zároveň se chci zeptat, zda jsem dobře vytvořil tento vlastní validátor (dříve jsem to ještě nepotřeboval).
protected function createComponentEmployeeForm($name)
{
$form = new AppForm($this, $name);
$form->addText('login', 'Login:')
->addRule(Form::FILLED, 'Vyplňte login prosím.');
$form['login']
->addRule(callback($this, 'loginValidator'), 'Login ‘' . $form['login']->value . '’ je již použit, zvolte prosím jiný.');
...
return $form;
}
static function loginValidator(IFormControl $control)
{
$userModel = new UserModel();
if ($userModel->getByLogin($control->value)) {
return FALSE;
} else {
return TRUE;
}
}
Validátor funguje, ale chci se zeptat, zda je i dobře napsán a protže insiprace přišla z příspěvků z fóra datovaných k roku 2008–2009, tak zda se to v dnešní době nedá napsat i nějak lépe?
Editoval Endrju (10. 4. 2010 4:07)
- Vyki
- Člen | 388
Endrju napsal(a):
- Zároveň se chci zeptat, zda jsem dobře vytvořil tento vlastní validátor (dříve jsem to ještě nepotřeboval).
Přijde mi to zbytečné. Osobně v té základní validaci kontroluji pouze formát odeslaných dat. Po odeslání duplicitu identity kontroluji takto:
<?php
class RegisterPresenter extends BasePresenter
{
public function createComponentRegisterform()
{
[...] //definice formu
$form->addSubmit('login', 'Zaregistrovat');
$form->onSubmit[] = callback($this, 'registerFormSubmitted');
return $form;
}
public function registerFormSubmitted($form)
{
$values = $form->values;
$code = UsersAuthenticator::register($values);
if ($code === UsersAuthenticator::OK) {
$this->flashMessage('Registrace proběhla úspěšně. Vyčkejte na a plnou aktivaci účtu (maximálně 24h).');
$this->redirect(self::$home);
} else {
$form->addError($code === UsersAuthenticator::ERROR_DUPLICATION ?
'Tento e-mail je již v zaregistrován!' :
'Omlouváme se, ale momentálně se nelze registrovat.');
}
}
}
class UsersAuthenticator extends Object implements IAuthenticator
{
const OK = 1;
const ERROR_DUPLICATION = -1;
const ERROR_UNKNOWN = -2;
public function authenticate(array $credentials)
{
[...]
}
public static function register($values)
{
try {
dibi::query('INSERT INTO [users]', array(
'login' => $values['email'],
'password' => md5($values['pass1']),
'name'=> $values['jmeno'],
'email' => $values['email'],
'role' => 2,
));
} catch (DibiException $e) {
if ($e->getCode() == DibiMySQLDriver::ERROR_DUPLICATE_ENTRY) {
//pokud máš v DB už. jm. unikátní, jako že asi ano, potom ti při duplicitě Dibi vyhodí vyjímku
return self::ERROR_DUPLICATION;
}
return self::ERROR_UNKNOWN;
}
return self::OK;
}
}
?>
Proto je zavedené $form->addError()
, používám ho vždy
když zjistím problém s odeslanými daty až po odeslání.
Editoval Vyki (10. 4. 2010 9:50)
- Honza Marek
- Člen | 1664
Endrju: až na ten blbě napsaný callback je to v pořádku. Jak to má být správně, to ti neporadím, protože jsem nepochopil, kde máš umístěnou tu validační funkci.
fidLi: Tři rovnítka znamenají porovnání dvou hodnot. Rozdíl od == je
v tom, že se porovnávají i typy. Takže třeba "1" == 1
je
true, ale "1" === 1
je false. Základní znalost ;-)
- Endrju
- Člen | 147
Honza Marek napsal(a):
Endrju: až na ten blbě napsaný callback je to v pořádku. Jak to má být správně, to ti neporadím, protože jsem nepochopil, kde máš umístěnou tu validační funkci.
Ted nevim jestli ti rozumim? Jakou validacni funkci mas na mysli? Nejakou
jinou nez je uvedena v kodu – ta
static function loginValidator(IFormControl $control){...}
?
Obecne mozna nevim jak spraven psat tyhle callbacky. Kdy je dobre je psat
staticky a kdy ne.. atd. Treba v dokumentaci Nette\Forms je
zminka o tom jak volat vlastni validacni pravidlo, ale uz tam neni ta trida,
aby neznaly mohl vedet jak to ma vypadat a nejak se podle toho ridit.. Takze
diky za pripadne rady..
- fidLi
- Člen | 41
když ro upravím takhle
} catch (DibiException $e) {
if ($e->getCode() == 1062) {
return self::ERROR_DUPLICATION;
}
return self::ERROR_UNKNOWN;
}
return self::OK;
tak mě už nepíše class not found, ale vždy, za jakýchkoliv okolností
vyhodí, omlouváme se, ale nyní se nelze registrovat…
a když tam zadám bez try() jen příkaz, tak se to do tabulky zapíše
Editoval fidLi (18. 4. 2010 9:23)