Použití render nebo action

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

Zdravím, řeším teď takový možná drobný problém, ale nevím co s tím. Jedná se o primitivní proces ověření – verifikace uživatele. Po příchod na určitou adresu(která se dříve odeslala na email) se aktivuje účet.
Adresa je zhruba taková – http://stranka.com/verifikace/hash. Moc nevím, v jaké fázi by se měl samotný kód provést. Zatím to mám takto v actionVerify($hash):

<?php
      public function actionVerify($hash){
      //Look for an entry in the users table containing the corresponding hash
      $values = dibi::query('SELECT id,username,verified,hash FROM users WHERE hash=%s', $hash);
      if(empty($values)){
        $message = "The verification link is broken or the user has already been verified.";
        $somethingHasGoneWrong = TRUE;
      } else {
        dibi::query("UPDATE users SET verified='1',hash='' WHERE id=%i", $values['id']);
        $message = "The user <u>$values[username]</u> has been successfully verified.";
        $somethingHasGoneWrong = FALSE;
      }
    }
?>

Hodil jsem to do action, protože jestli jsem to pochopil správně, tak v render fázi by se měly provádět jen akce společné s šablonou a vykreslováním, což update dat v DB moc není. Když to mám takhle v action, tak ale vůbec nevím, jak renderu předat parametry – tj. výslednou message popř. jestli byla verifikace úspěšná nebo ne.

newPOPE
Člen | 648
+
0
-

Jednou z moznosti je predat hodnoty priamo v action.

$this->template->foo = "foo";

za co ma asi ostatni nebudu mat radi :-D.

dalsia moznost je pouzit atributy Presenteru

private $foo;

public function actionFoo() {
	$this->foo = "...";
}

public function renderFoo() {
	$this->template->foo = $this->foo;
}

tu je viac pisania. mne osobne sa viac paci prva moznost, kedze tie hodnoty este mozes ovplyvnit aj v `render`. No asi zalezi od konkretne od situacie...
joe
Člen | 313
+
0
-

newPOPE – první možnost +1 (nějak nevidím důvod si to zbytečně ukládat do atributu třídy, zbytečné psaní navíc :))

Psal jsem něco podobného a ještě jsem chtěl dodat, že ta aktivace se dá udělat jenom jedním dotazem (UPDATE), pak jsem si ale všimnul, že tam vypisuješ i jméno…

Newbiek
Člen | 12
+
0
-

Já osobně bych použil session (resp. to samé jako píše newPOPE s těmi atributy presenteru) a nebo flashMessage + redirect (a tim padem se vykaslat na render a nebo renderovat jen v pripade, ze byla verifikace uspesna a jinak presmerovat).

Editoval Newbiek (24. 7. 2011 0:36)

Under
Člen | 23
+
0
-

Asi použiju ty atributy presenteru, protože v renderu budu tu message dál formátovat.
To přesměrování v případě chyby je taky dobrej nápad. Ty flash zprávy bych si asi měl nastudovat.
Díky moc za odpovědi.

JakubJarabica
Gold Partner | 184
+
0
-

Nebolo by fajn v action vytvoriť flashMessage a presmerovať na prihlásenie? Tým pádom už v action skončí životný cyklus verifikačného presenteru – nebude render, je to čisté a imho viac user friendly.