Flash message / vyhození erroru v manageru
- popcorn
- Člen | 28
Ahoj, jak mohu vytvořit error / flash message v Manageru kde zpracovávám data? Mám Manager:
public function newServer($server)
{
if ($server == NULL)
{
$this->flashMessage('Wrong input format. Please try again.');
exit();
}
$this->database->query('INSERT INTO '. self::TABLE_NAME. '', [
'name' => $server
]);
}
Formulář si generuju ve FormFactory:
public function create(callable $onSuccess): Form
{
$form = $this->factory->create();
$form->addText('server', 'Server name:');
$form->addSubmit('submit', 'Add server');
$form->onSuccess[] = function (Form $form, ArrayHash $values) use ($onSuccess) : void {
$this->serverManager->newServer($values->server);
$onSuccess();
};
return $form;
}
a Presenter:
protected function createComponentServerForm(): Form
{
return $this->serverFactory->create(function (): void {
$this->redirect('Home:');
});
}
- filsedla
- Člen | 101
Tohle je docela zajímavý problém. Jak, přesně, byste to v téhle nové
struktuře udělali?
Jediné logické místo, kam dát zachycení výjimky,
try {
$this->serverManager->newServer($values->server);
} catch(InvalidServerParametersExceptio $e) { ... }
je do $form->onSuccess[] = function ...
v
ServerFormFactory
. Ale tam také nejde volat
flashMessage()
.
- Andy3
- Člen | 15
Asi nejak takto, urcite to pujde lepe… Pointa je: Neodchytavat Exception Nette (a uz vubec ne je vyhazovat, muzou v budoucnu zmizet). Pokud chces ten flashMessage, tak si to tam callbackem poslat taky, ale spis by ty errory mely byt na formulari a ne na Presenteru.
public function newServer($server)
{
if ($server == NULL)
{
throw new \MyInvalidArgsException('bla');
}
try {
$this->database->query('INSERT INTO '. self::TABLE_NAME. '', [
'name' => $server
]);
} catch(\Exception $e) {
\Tracy\Debugger::log($e, ILogger::ERROR);
throw new \MyDatabaseProblemException($e->getMessage(), $e->getCode());
}
//nebo - ted nevim jestli to vraci false/null nebo vyhazuje vyjimku
$result = $this->database->query('INSERT INTO '. self::TABLE_NAME. '', [
'name' => $server
]);
if(!$result) {
$e = new \MyDatabaseProblemException('bla');
\Tracy\Debugger::log($e, ILogger::ERROR);
throw $e;
}
}
public function create(callable $onSuccess, callable $onError): Form
{
$form = $this->factory->create();
$form->addText('server', 'Server name:');
$form->addSubmit('submit', 'Add server');
$form->onSuccess[] = function (Form $form, ArrayHash $values) use ($onSuccess, $onError) : void {
try{
$this->serverManager->newServer($values->server);
} catch(\MyInvalidArgsException $e) {
$form->addError('spatny nazev serveru')
$onError();
} catch(\MyDatabaseProblemException $e) {
$form->addError('Nepovedlo se vytvorit server');
$onError();
}
$onSuccess();
};
return $form;
}
protected function createComponentServerForm(): Form
{
return $this->serverFactory->create(
function (): void {
$this->redirect('Home:');
},
function (): void {
$this->redirect('this');
});
}
Jen technicka, pokud nekam posilas nejakou metodu z presenteru jako callback, tak na pozadi vlastne posilas cely presenter. Ono v podstate nicemu „nevadi“, jen dobre to mit na pameti.
Editoval Andy3 (11. 7. 2019 6:26)