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.