Try, catch, flashMessage a redirect
- BuMoRi
- Člen | 109
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?
- BuMoRi
- Člen | 109
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
Č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.