Ověření emailu v db (zakázání vícenásobné registrace na 1 email)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
wicked
Člen | 290
+
0
-

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
+
0
-

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á.

wicked
Člen | 290
+
0
-

Děkuji přepsání jsem zoušel, ale nenapadlo mě do presenteru (toto je prave v RegisterPresenter.php) pridat public metodu.

Děkuji

wicked
Člen | 290
+
0
-

Jen bych měl prosím ještě dotaz, co přesně mám přidat do toho presenteru? obsah té metody? S Nette opravdu začínám.

Děkuji

duke
Člen | 650
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-
$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)

Jan Suchánek
Člen | 404
+
0
-

A není lepší jen vyhazovat vyjímku a předat zprávu do $form->addError?

Hurass
Člen | 114
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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>