Ověření emailu v db (zakázání vícenásobné registrace na 1 email)
- wicked
- Člen | 290
Dobrý den,
na svém projektu bych chtěl udělat, aby 1 emailová adresa mohla být registrována pouze jednou.
V presenteru registrace mám následující zdojový kód:
$form->addText('email', 'E-mail')
->setRequired('Musíte vyplniť %label!')
->addRule($form::EMAIL, 'Musíte vyplniť validný e-mail!');
Když jsem vycházel z tohoto článku , doplnil jsem toto:
->addRule(callback('MyApplication\Models\Users', 'isUsernameAvailable'), //v databázi ověříme, že dané jméno ještě není registrováno
'Toto uživatelské jméno je již registrováno');
Přepsal jsem to a nasadil takto:
$form->addText('email', 'E-mail')
->setRequired('Musíte vyplniť %label!')
->addRule($form::EMAIL, 'Musíte vyplniť validný e-mail!')
->addRule(callback($form, 'isUsernameAvailable'), 'Toto uživatelské jméno je již registrováno');
Bohužel při provedení registrace mě to hodí chybu:
*Nette\MemberAccessException
Call to undefined method Nette\Application\UI\Form::isUsernameAvailable()*
Omlouvám se, možná je to maličkost, ale v Nette teprvé začínám a s tímto si lámu hlavu.
Mohl by mi prosím někdo z Vás poradit?
Děkuji
PS: Verze PHP 5.3.2 Nette Framework 2.0
- Ot@s
- Backer | 476
Stačí maličkost.
->addRule(callback($form, 'isUsernameAvailable'),...)
přepiš
na ->addRule(callback($this, 'isUsernameAvailable'), ...)
a do
registračního presenteru si přidej public metodu
isUsernameAvailable
na ověření duplicity emailu. $form
nemůžeš použít, protože to je instance objektu
Nette\Application\UI\Form
a ten žádnou metodu
isUsernameAvailable
nezná/nemá.
- duke
- Člen | 650
Prostuduj si dokumentaci (alespoň
část o vlastních validátorech).
Obsahem metody bude pochopitelně kód, který zjistí, zda dané username je
k dispozici, tj. zeptá se na to modelu. Pokud je k dispozici, vrátí TRUE,
v opačném případě vrátí FALSE.
- Hurass
- Člen | 114
duke napsal(a):
Prostuduj si dokumentaci (alespoň část o vlastních validátorech).
Obsahem metody bude pochopitelně kód, který zjistí, zda dané username je k dispozici, tj. zeptá se na to modelu. Pokud je k dispozici, vrátí TRUE, v opačném případě vrátí FALSE.
Chápu co musí metoda vracet, ale potřeboval bych vědět co přesně se metodě předává? Popřípadě jak zjistím obsah vyplněného políčka pro porovnávání do databáze? Děkuji
- jiri.pudil
- Nette Blogger | 1034
Callbacku se předává instance controlu, na který je pravidlo navěšené
(z toho controlu si snadno vytáhneš vyplněnou hodnotu) a případně
cokoliv, co si do něj předáš skrze třetí argument metody
addRule()
.
OT: příště možná prosím raději založ nové vlákno, než oživovat dva roky uleželé.
Editoval jiri.pudil (27. 11. 2013 18:42)
- Hurass
- Člen | 114
To jsem zrovna moc nepochopil. :-( Mám položku ve formuláři:
$regForm->addText('mail', 'E-mail:', 18, 75)
->setRequired('E-mail musí být vyplněn')
->addRule(Form::EMAIL, 'E-mail nemá správný formát')
->addRule(callback($this->usersRepository, 'checkMailInRegistration'), $this->flashMessage('Tento e-mail je již zaregistrován', 'error'));
A metodu checkMailInRegistration:
public function checkMailInRegistration() {
}
Jak tedy v této medotě zjistím, co mi uživatel vyplnil ve formuláři?
Editoval Hurass (27. 11. 2013 18:54)
- romiix.org
- Člen | 343
$regForm->addText('mail', 'E-mail:', 18, 75)
->setRequired('E-mail musí být vyplněn')
->addRule(Form::EMAIL, 'E-mail nemá správný formát')
->addRule(callback($this, 'checkMailInRegistration'), 'Tento e-mail je již zaregistrován');
public function checkMailInRegistration(Nette\Forms\IControl $control)
{
// $control->value
// $isInDatabase = ...
// ...
return ($isInDatabase) ? TRUE : FALSE;
}
Editoval romiix.org (27. 11. 2013 19:04)
- Hurass
- Člen | 114
Právě že jsem to chtěl takto.
Už mi to funguje. Ale ještě se zeptám, jde uděat aby mi chybová
hláška, že email nebo uživatel již je zaregistrován zobrazovala jako
flashMessage? Nebo jako alert co je třeba u kontroly vyplnění? Protože
pokud tam hodím flashMessage jak jsem posílal předtím tak mi to hodí
chybu:
Object of class stdClass could not be converted to string
Editoval Hurass (27. 11. 2013 20:38)
- romiix.org
- Člen | 343
Prečo flashMessages
? Formulárová validácia nepoužíva
flashMessages
, ale má vlasné vykreslovanie chýb (príklad je
v dokumentácií).
$form->render('errors');
alebo
<ul class="errors" n:if="$form->hasErrors()">
<li n:foreach="$form->errors as $error">{$error}</li>
</ul>
- iNviNho
- Člen | 352
Ja to robím takto:
V tabulke mám pri e-mailovej adrese unique;
Priamo pri vytváraní komponenty to neriešim, ale po callbacku mám niečo ako
<?php
foreach ($maily as $mail) {
if ($tvojmail == $mail) {
$this->flashmessage("existuje");
$mailexist = true;
}
if ($mailexist == false} {
// úspech
}
}
?>
- thunderbuff
- Člen | 164
iNviNho napsal(a):
Ja to robím takto:
V tabulke mám pri e-mailovej adrese unique;
Priamo pri vytváraní komponenty to neriešim, ale po callbacku mám niečo ako
<?php foreach ($maily as $mail) { if ($tvojmail == $mail) { $this->flashmessage("existuje"); $mailexist = true; } if ($mailexist == false} { // úspech } } ?>
<lehký_OT>
Malý tip pro oveřování unikátnosti emailu: http://php.vrana.cz/…databazi.php
</lehký_OT>
Editoval thunderbuff (29. 11. 2013 18:15)
- iNviNho
- Člen | 352
VERY SEXY! To teda vyskúšam :)
thunderbuff napsal(a):
iNviNho napsal(a):
Ja to robím takto:
V tabulke mám pri e-mailovej adrese unique;
Priamo pri vytváraní komponenty to neriešim, ale po callbacku mám niečo ako
<?php foreach ($maily as $mail) { if ($tvojmail == $mail) { $this->flashmessage("existuje"); $mailexist = true; } if ($mailexist == false} { // úspech } } ?>
<lehký_OT>
Malý tip pro oveřování unikátnosti emailu: http://php.vrana.cz/…databazi.php
</lehký_OT>