Registracia uzivatelov, problem s vynimkami

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

Zdravim,
pouzivam najnovsie Nette (z 12.12.2011) a PHP 5.3.
Snazim sa vytvorit si vlastny registracny formular. Cast som odkopiroval od prihlasovacieho formulara avsak pri samotnej registracii nastava ten problem, ze ked sa nehodi vynimka duplicity tak sa nevykona redirect. Toto je moja prva skusenost s vynimkami tak budte prosim ohladuplny :). Skusal som tam dosadit aj NS\AuthenticationException namiesto Exception a vtedy to slo podla ocakavani, ale nieco mi hovori ze NS\AuthenticationException su vynimky urcene pre prihlasovanie :)

	public function RegisterFormSubmitted($form)
	{
		try {
			$values = $form->getValues();
			$row = $this->model->getUsers()->where(array('username' => $values->username))->count();
			if($row > 0) {
			    throw new Exception("Zadane meno uz existuje, zvolte ine.");
			}
			unset($row);

			$this->redirect('Homepage:');


		} catch (Exception $e) {
			$form->addError($e->getMessage());
		}
	}
Filip Procházka
Moderator | 4668
+
0
-

… ked sa nehodi vynimka duplicity tak sa nevykona redirect …

To je přeci očekávané chování, ne? Nebo chceš, aby se uživateli stránka přesměrovala a musel formulář vyplňovat znovu?

Aurielle
Člen | 1281
+
0
-

Zachytáváš všechny výjimky, tedy i AbortException, kterou vyhazuje redirect. Uprav catch větev.

cuchi
Člen | 17
+
0
-

HosipLan napsal(a):

… ked sa nehodi vynimka duplicity tak sa nevykona redirect …

To je přeci očekávané chování, ne? Nebo chceš, aby se uživateli stránka přesměrovala a musel formulář vyplňovat znovu?

Samozrejme, takto to funguje pri prihlasovani. Jednoducho vyplnis udaje, odosles a pokial sa nehodila vynimka, presmerovalo ta to niekam inam.

Ani pri prihlasovani nie je nutnost vyplnat formular viac krat pokial sa samozrejme nehodila vynimka.

gmvasek napsal(a):

Zachytáváš všechny výjimky, tedy i AbortException, kterou vyhazuje redirect. Uprav catch větev.

Mohol by si mi prosim napisat ako to upravit, resp. ak je to nutne, ako napisat vlastnu vynimku (kam ju ulozit)?

duke
Člen | 650
+
0
-

Můžeš vyhodit a zachytávat např. \RuntimeException nebo si na to napsat svou vlastní výjimku, která dědí buď z této, nebo přímo z \Exception. Jde o to, abys nezachytával přímo \Exception, protože redirektovací metoda sama vyhazuje výjimku Nette\Application\AbortException za účelem ukončení činnosti presenteru, a pokud zachytáváš přímo \Exception (ze které Nette\Application\AbortException dědí), pak zachytneš i tuto a narušíš tento mechanismus životního cyklu presenteru.

Vlastní výjimku napíšeš např. takto:

class UsernameDuplicityException extends \RuntimeException
{
}

Kam ji uložíš je celkem jedno. Jde o to, aby ji našel robotLoader.

Editoval duke (26. 12. 2011 20:24)

cuchi
Člen | 17
+
0
-

duke napsal(a):

Můžeš vyhodit a zachytávat např. \RuntimeException nebo si na to napsat svou vlastní výjimku, která dědí buď z této, nebo přímo z \Exception. Jde o to, abys nezachytával přímo \Exception, protože redirektovací metoda sama vyhazuje výjimku Nette\Application\AbortException za účelem ukončení činnosti presenteru, a pokud zachytáváš přímo \Exception (ze které Nette\Application\AbortException dědí), pak zachytneš i tuto a narušíš tento mechanismus životního cyklu presenteru.

Vlastní výjimku napíšeš např. takto:

class UsernameDuplicityException extends \RuntimeException
{
}

Kam ji uložíš je celkem jedno. Jde o to, aby ji našel robotLoader.

Vyborne, toto som potreboval. Vlastnu vynimku si teraz pisat nebudem ale do buducna budem vediet. Zatial budem pouzivat RuntimeException. Dakujem za rychlu odpoved.