potvrzeni registrace odkazem v emailu

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

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

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>
wicked
Člen | 290
+
0
-

Ano, tato presenterovska část mi je jasná, ale nevím jak získat ten kód z adresy v prohlížeči…

Tedy vlastně ta vaše funkce isValid()

Jan Endel
Člen | 1016
+
0
-

jak jsem naznačil v url se objeví ?code=abcdefgh a nette si to díky této akce přechroustá do proměnné $code a dál se s ní dá pracovat jako v klasickém kódu.

Tomáš Votruba
Moderator | 1114
+
0
-

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>
Jan Endel
Člen | 1016
+
0
-

Pravda, na lomítka jsem pozapomněl :-).

wicked
Člen | 290
+
0
-

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
+
0
-
  1. get vybira dle primarniho klice.
  2. where musis uvadet pred update

takze:

return $this->findAll()->where('token', $code)->udpate('aktivni', 1)
wicked
Člen | 290
+
0
-

Děkuji za nakopnutí, where před update jsem si nějak neuvědomil…

Ale když to teď udělám podle Tebe, tak to hodí laděnku ale bez popisu chyby a jenom označený ten řádek …

wicked
Člen | 290
+
0
-

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)

Jan Endel
Člen | 1016
+
0
-

V laděnce musí být alespoň něco, takhle na blind ti asi nikdo neporadí.

wicked
Člen | 290
+
0
-

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:

Oli
Člen | 1215
+
0
-

Metoda update vyžaduje array

wicked
Člen | 290
+
0
-

@Oli: Ano měl jsi pravdu :-)

Toto pomohlo

/** @return Nette\Database\Table\Selection */
    public function isValidToken($token) {
        return $this->findAll()->where('token', $token)->update(array(
            'aktivni' => '1'
        ));