Jak volat IPub\FlashMessages z komponenty

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

Ahoj,

zkouším IPub\FlashMessages volat z komponenty – vytvořit modal po odeslání formuláře, ale nedaří se mi.
Pokud to volám v presenteru, je to v pořádku.

Netuším jak tady zavolat flashNotifier z komponenty

<?php
		// Cannot read an undeclared property App\FrontModule\Presenters\ContactUsPresenter::$flashNotifier.
		// ale přitom v renderDefault tohoto presenteru to jede...
		$this->presenter->flashNotifier->overlay('Message text', 'info', 'My message title');

		if ($this->presenter->isAjax()) {
			$this->redrawControl('contactFormSnippet');
			$this->presenter->redrawControl();
		} else {
			$this->redirect('this', array('sent' => true));
		}
?>

A pokud použiju trait v komponentě a volám jen

<?php
$this->flashNotifier->overlay('Message text', 'info', 'My message title');
?>

Pak dostávám chybu Call to a member function overlay() on null

Budu vděčný za jakékoliv rady.

Děkuji.

Editoval Phalanx (20. 2. 2017 9:17)

CZechBoY
Člen | 3608
+
+1
-

Přes $this->presenter->flashMessage(...) by to mohlo jít.
Případně zkus v komponentě povolit inject (1), nebo přes decorator zavolat injectFlashMessages metodu (2).

1)

  1. přes nastavení služby
services:
	-
		class: App\mojekomponenta
		inject: yes
  1. přes decorator
decorator:
	App\mojekomponenta:
		inject: yes

2)

decorator:
	App\mojekomponenta:
		setup:
			- injectFlashMessages

Editoval CZechBoY (20. 2. 2017 9:44)

Phalanx
Člen | 310
+
0
-

@CZechBoY Děkuju, ale chová se to fakt podivně. Přepsal jsem si kousek Traity a vložil si do konstruktoru potřebné třídy. Bohužel se to ale ukázalo jako hodně šílené řešení.

Chtěl jsem mít modální dialog, v něm formulář, který po odeslání zobrazí flash message v dalším dialogu… Udělal jsem to raději tak, že to dělám bez ajaxu a posílám jen parametr v GET.

Při $this->presenter->flashMessage(…) a následném ajaxu se mi zobrazuje v response tohle… což je pro UIKIT i když mám jasně definovaný bootstrap.

<div class=„ipub-flash-messages uk-text-left“ id=„snippet-flashMessages-messages“>↵</div>

akadlec
Člen | 1326
+
+1
-

@Phalanx Do komponent si to musíš dopravit konstruktorem a nebo komponentě zapnout inject jak padlo výše.

To že vidíš v šabloně uk-text-left ještě neznamená že máš šablonu uikitu, koukám do šablony bootstrapu a dostalo se to i do ní. Klidně PR na odstranění, já TWBS nepoužívám takže jej netestuji.

Když to děláš ajaxem tak je potřeba aby sis invalidoval správné snippety, jinak ti to nebude fungovat jak chceš.

akadlec
Člen | 1326
+
0
-

resp. lépe, podívej se co ti přijde v response v ajaxu zda se ti vrací jen klasická flash nebo i s overlayem.

Phalanx
Člen | 310
+
0
-

@akadlec taky děkuji. Vidíš, já viděl uk-text-left a už jsem se domníval, že jde o chybnou šablonu. Každopádně se budu snažit tomuto balíku vyhnout, protože ho nedokážu zprovoznit tak, aby to fungovalo na 100 procent.

Příklady:

  • nepřekládá se v šabloně text (chybí translator) i když při vytváření komponenty uvádím – tzn. asi se nepředává až do šablon
  • když použiju vlastní template šablonu, nepředávají se mi proměnné title a body

Balíček ale beru jako dobrou inspiraci, jak se dají věci dělat jinak.

akadlec
Člen | 1326
+
0
-
  1. Jaký text v šabloně? Extension má k dispozici inject pro translator, taky podporuje Frázové překlady z kdyby. V šabloně je jen jeden nepřeložitelný text a to v modalu.
  2. Zřejmě si ji použil špatně. Extension používám se šablonou systému kde ji mám a nemám problém v tom že bych tam neměl proměnné.

Jinak jak ext použít sepsal docela pěkně Honza Černý