Flash message zobrazená všude v modulární aplikaci

Petr Parolek
Člen | 455
+
0
-

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
+
0
-

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
+
0
-

@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)