potvrzeni registrace odkazem v emailu
- wicked
- Člen | 290
Zdravím Vás kolegové,
mám takový dotaz, jak řešíte potvrzeni registrace přes email?
Mam vytvořeny klasický formátu na registraci, po jeho odeslání mě to do db uloží data + token.
Odešle se email s informacemi pro uživatele + link na aktivaci, bohužel zde končím, absolutně mě nenapadá jak to řešit dal?
Do homepagepresenteru vložit funkční na ověření? Nebo soubor úplně zvlášť?
Respektive jak ověřit i pravost tokenu z linku?
Je mi jasné, převzít token z linku, ověřit v db a update data v db + další věci.
Bohužel mě nenapadá jak převzít token z linku na kontrolu.
Děkuji za odpověď a nakopnuti
Wicked
- Jan Endel
- Člen | 1016
co takhle:
class CheckPresenter extends Presenter
{
/**
* @var My\App\Validator
* @inject
*/
public $validator;
public function actionVerify($code)
{
if ($this->validator->isValid($code)) {
$this->redirect('User:welcome');
} else {
$this->redirect('User:codeIsInvalid');
}
}
}
link uděláš v šabloně emailu:
<a href="{link Check:verify, $code}">Zde klikněte pro ověření emailové adresy</a>
- Tomáš Votruba
- Moderator | 1114
Možná je to teď jinak, ale dříve bylo potřeba do emailu uvádět absolutní odkaz (přidá doménu) – pomocí //.
<a href="{link //Check:verify, $code}">Zde klikněte pro ověření emailové adresy</a>
- wicked
- Člen | 290
Buďto jsem přepracovaný, nebo blbý …
Co dělám špatně?
public function isValidToken($code) {
return $this->findAll()->get($code)->update('aktivni', '1')->where('token', $code);
}
Vrací
`Fatal Error
Call to a member function update() on a non-object`
Jenže mě absolutně nenapadá, co je blbě …
Sorry za lamerský dotaz …
- David Matějka
- Moderator | 6445
- get vybira dle primarniho klice.
- where musis uvadet pred update
takze:
return $this->findAll()->where('token', $code)->udpate('aktivni', 1)
- wicked
- Člen | 290
Tahle to vypadá celé
HomepagePresenter:
/**
* @autowire
* @var \App\Model\UsersModel
*/
protected $user;
/**
* @autowire
* @var \App\Model\LogModel
*/
protected $log;
// Akce na oveření tokenu
public function actionVerify($token) {
if ($this->user->isValidToken($token)) {
$this->flashMessage('Aktivace účtu byla úspěšná.', 'alert alert-success');
// Po odeslani zapisem zaznam do logu
$this->log->insert(array(
'typ' => 'info',
'text' => 'Úspěšná aktivace účtu',
'datum' => new Nette\DateTime
));
$this->redirect('Homepage:default');
} else {
$this->flashMessage('Registrace nebyla úspěšná, prosím kontaktujte podporu.', 'alert alert-warning');
// Po odeslani zapisem zaznam do logu
$this->log->insert(array(
'typ' => 'chyba',
'text' => 'Neúspěšná aktivace ůčtu',
'datum' => new Nette\DateTime
));
$this->redirect('Homepage:default');
}
}
UserModel
/** @return Nette\Database\Table\Selection */
public function findAll() {
return $this->database->table('users');
}
/** @return Nette\Database\Table\ActiveRow */
public function isValidToken($token) {
return $this->findAll()->where('token', $token)->update('aktivni', 1);
}
V šabloně emailu to posílám
<a href="{link //Homepage:verify, $token}">Aktivovat účet</a>
Cache promazána
Děkuji Vám za každou radu
Wicked
Editoval wicked (20. 5. 2014 8:23)
- wicked
- Člen | 290
Vrchní část laďěnky:
Nette\InvalidArgumentException
search►
Source file
Call stack
…/app/model/UsersModel.php:40 source Nette\Database\Table\Selection-> update (arguments)
30: }
31:
32: /** @return Nette\Database\Table\ActiveRow */
33: public function insert($values) {
34: return $this->findAll()->insert($values);
35: }
36:
37:
38: /** @return Nette\Database\Table\ActiveRow */
39: public function isValidToken($token) {
40: return $this->findAll()->where(‚token‘,
$token)->update(‚aktivni‘, 1);
41: }
42: }
43: