Flash message zobrazená všude v modulární aplikaci
- Petr Parolek
- Člen | 455
Ahoj,
mám modulární aplikaci seskládanou z DI extensions a vůbec mi nejde do hlavy, jak mám implementovat chybovou flash message, která se ukáže všude v aplikaci napříč moduly, která bude implentovaná třeba v TestB balíčku. Jde mi o upozornění uživatele, že musí něco doplnit v profilu, aby mu fungovali všechny funkce aplikace.
Ukázku aplikace je na https://github.com/…dular-sample
Pomohl by mi někdo prosím, jak na to?
Editoval Petr Parolek (31. 8. 2021 18:49)
- Rick Strafy
- Nette Blogger | 81
Ahoj, over si to v startup() v BasePresenteri a posli
$this->flashMessage('sprava', 'error')
, tej ukazke to je celkom
jednoduche kedze to bude na 1 mieste lebo tam je len 1 BasePresenter.
- Petr Parolek
- Člen | 455
@RickStrafy takto to mám na jednom místě, kde nepožaduju modularitu systému. Ale pokud chceš řešení napříč částmi aplikaci v DI extesions, tak to nepůjde.
Odpovím si sám – vymyslel jsem řešení přes symfony event:
do composer.json jsem přidal:
"contributte/event-dispatcher": "^0.8",
"contributte/event-dispatcher-extra": "^0.8",
a tuto třídu jsem zaregistroval do DI:
<?php declare(strict_types = 1);
namespace TestPackage\TestB\Events;
use Contributte\Events\Extra\Event\Application\ApplicationEvents;
use Contributte\Events\Extra\Event\Application\PresenterStartupEvent;
use Nette\Http\Response;
use Nette\Utils\ArrayHash;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class AppErrorsFlashMessagesSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
PresenterStartupEvent::class => 'presenterStartup',
];
}
public function presenterStartup(PresenterStartupEvent $event): void
{
$alerts[] = [
'message' => 'Text chybové flash zprávy',
'type' => 'danger',
];
$alerts = ArrayHash::from($alerts);
$event->getPresenter()->template->appError = true;
$httpResponse = $event->getPresenter()->getHttpResponse();
$httpResponse->setCode(Response::S403_FORBIDDEN);
foreach ($alerts as $alert) {
$event->getPresenter()->flashMessage($alert->message, $alert->type);
}
}
}
Editoval Petr Parolek (31. 8. 2021 23:26)