Jak na potvrzení registrace v NETTE?

U jednoho dříve zveřejněného příspěvku (Registrace uživatelů pomocí NETTE) se objevil komentář žádající vysvětlení, jak dále zpracovávat potvrzující odkaz z došlého mailu.
Pro nevytržení z kontextu zopakuji část, která takový odkaz tvoří a odesílá e-mail. Kód jsem upravil o dynamickou tvorbu odkazu, jak jsem byl upozorněn v diskuzi u dříve zmíněného článku.

// vytvoření kontrolního hashe
$kontrolni_link = sha1($values['nick'] . time() . 'e743dd075ff52c2');
 
unset($values['pass2']); // druhé heslo neukládáme
$values['retik'] = $kontrolni_link;
dibi::query('INSERT INTO [user]', $values);
 
#mail pro kontrolu
$mail = new Mail;
$mail->setFrom('Registrace na webu xxx.com <info @xxx.com>');
$mail->addTo($values['email']);
$mail->setSubject('Registrace na webu xxx.com');
$mail->setBody("Děkujeme za Váši registraci. Potvrďte prosím na adrese " . $this->link('//Registrace:kontrola', array('kontrola'=>$kontrolni_link)) . ".");
$mail->send();
// zase mi tu WP zlobí dále už nic nemá být ;-)
</info>

Toto je jen jedna možnost jak kontrolu dělat. Díky způsobu tvorby (používáme funkci time() a její hodnotu si nikam dále neukládáme) kontrolního HASHe, je nutné ho uložit do databáze a následně při kontrole ho testovat zda odpovídá. Jen pro informaci zmíním, že je tu i další možnost tvorby a to, že si odkazem pošleme více parametrů, díky kterým budeme schopni registraci potvrdit, bez dopomocí databáze (např.: $this->link(‚//Registrace:kontrola‘, array(‚nick’=>$values[‚nick‘], ‚kontrola’=>sha1($values[‚nick‘] . ‚e743dd075ff52c2‘)))).

A nyní samotné MINIMALISTICKÉ (=jedná se o koncept, ne o deklaraci dokonalého zpracování) zpracování (budu se držet první možnosti):

if (empty ($_GET['kontrola'])) {
	die('CHYBA!');
} else {
	$kod = $_GET['kontrola'];
	dibi::query('UPDATE [user] SET [retik]="" WHERE [retik]=%s', $kod);
 
	if (dibi::affectedRows() == 1) {
		echo 'Registrace dokončena.';
	} else {
		echo 'Registraci se nepodařilo dokončit.';
	}
}

Nutno podotknout, že při přihlašování mám podmínku na nevyplněnost sloupce retik v tabulce user.

...
$row = dibi::fetch('SELECT [id], [nick], [pass], [retik], [role] FROM [user] WHERE [nick]=%s', $username);
 
if ($row->retik !== '') {
    throw new AuthenticationException("Registrace nebyla dosud potvrzena.", self::NOT_APPROVED);
}
...

Celá ukázka nevyužívá plné síly NETTE. Ukázka vznikla jako návaznost na původní článek, kde se NETTE použilo v již hotové aplikaci. Doufám ale, že postup je z popisu jasný a přepsání do plného NETTE nebude činit problém.

Napsat komentář

Vaše emailová adresa nebude zveřejněna.

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..