Try, catch, flashMessage a redirect

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

Ahoj, mám v použití těch funkcí dost bordel a i když jsem zde už našel několik podobných dotazů, nedokázal jsem rady převést do mého kódu:
Presenter:

<?php
	public function signUpFormSucceeded(Form $form, $values)
	{
		try {
			$this->frontUserManager->saveTempUser(...);
			$this->flashMessage('Na Vaší adresu byl odeslán potvrzovací e-mail.', 'type-info');
			$this->redirect('Homepage:');
		} catch (Model\DuplicateException $e) {
			$form->addError('Nick nebo e-mail je již zaregistrován.');
			return;
		} catch (Model\MailException $e) {
			$this->flashMessage('E-mail s potvrzovacím kódem se nepodařilo odeslat.', 'type-danger');
		}
	}
?>

Model:

<?php
	public function saveTempUser(...)
	{
		...
		try {
			$this->database->table('...')->insert([
				...
			]);
		} catch (Nette\Database\UniqueConstraintViolationException $e) {
			throw new DuplicateException;
		}

		$mail = new Message;
		$mail->setFrom('...')
			->addTo('...')
			->setSubject('...')
			->setBody('...');

		$mailer = new SendmailMailer;
		try {
			$mailer->send($mail);
		} catch (Nette\Mail\SendException $e) {
			throw new MailException;
		}
	}

class DuplicateException extends \Exception
{
}

class MailException extends \Exception
{
}
?>

Je tam nějaká kravina. Prostě když se neodešle email, stránka se nepřesměruje a vypíšou se pod sebe 2 zprávy: „Na Vaší adresu…“ a „E-mail s potvrzovacím…“.
Pokud proběhne vše v pořádku, přesměruje se na homepage a vypíše se hláška „Na Vaší adresu…“, bohužel ale 2×.
Stejně vše proběhne, pokud redirect vyhodím z try ven.
Poradí někdo kde je chyba?

CZechBoY
Člen | 3608
+
0
-

Neodesílá se ti ten formulář dvakrát? Pošli jak vytváříš formulář a jak ho připojuješ k presenteru.

BuMoRi
Člen | 109
+
0
-

Já mám ten formulář přímo v presenteru:

<?php
	protected function createComponentSignUpForm()
	{
		$form = new Form;
		$this->flashMessage('Na Vaší adresu byl odeslán potvrzovací e-mail. V případě že jste e-mail neobdrželi, zkontrolujte prosím, zda Vám nezapadl do spamu.');
		$form->addText('jmeno')
			->setRequired('Vyplňte jméno.');

		$form->addText('prijmeni')
			->setRequired('Vyplňte příjmení.');

		$form->addText('nick')
			->setRequired('Vyplňte nick.');

		$form->addEmail('email')
			->setRequired('Vyplňte e-mail.');

		$form->addPassword('heslo')
			->setRequired('Zvolte si heslo.');

		$form->addPassword('heslo_potvrzeni')
			->setOmitted()
			->setRequired('Zvolte si heslo.')
			->addRule($form::EQUAL, 'Hesla se neshoduji', $form['heslo']);

		$form->addCheckbox('podminky')
			->setRequired('Je nutné souhlasit s podmínkami');

		$form->addSubmit('send', 'Zaregistrovat se');

		$form->onSuccess[] = [$this, 'signUpFormSucceeded'];

		return $form;
	}

?>

Tak to je dobrej trapas, teď sem si všim, že mi tam ulítla jedná řádka, tak se omlouvám za zbytečnej dotaz :). Ale když už jsem ho položil… Čili vše to try a catch mám správně?

Editoval BuMoRi (22. 10. 2017 21:36)

David Matějka
Moderator | 6445
+
+4
-

Čili vše to try a catch mám správně?

1.

    } catch (Nette\Mail\SendException $e) {
        throw new MailException;
    }
}

vzdycky, kdyz chytas vyijimku a vyvolavas novou, tak tu puvodni dej do previous (treti parametr konstruktoru)

2.

catch (Model\MailException $e) {
           $this->flashMessage('E-mail s potvrzovacím kódem se nepodařilo odeslat.', 'type-danger');
       }

kdyz chytas vyjimku, tak ji nezapomen zalogovat – staci pomoci Tracy\Debugger::log($e). takhle, jak to mas, by ses vubec nedozvedel, ze k nejake chybe vubec doslo. to uz je lepsi vyjimku vubec nechytat, nechat to propadnout az do tracy a zobrazit uzivateli 500.

BuMoRi
Člen | 109
+
0
-

OK, díky, na to co píšeš ve dvojce jsem tu už narazil, to pořeším. Moh bys mi prosimtě ještě vysvětlit tu jedničku?

rkor
Člen | 62
+
0
-

Moh bys mi prosimtě ještě vysvětlit tu jedničku?

http://php.net/…onstruct.php