predani flashMessage do presenteru z handlu

vlkodlak
Člen | 175
+
0
-

zdravím,

narazil jsem na následující kamen úrazu, pro mně.

Běžná stránka, obyčejný ajax … vše proběhne odeslání, zpracování (zpracování signalu), ale co se mi nedaří při zpracování dat občas vyskytné chyba o které bych rad informoval uživatele

  public function handleSaveweekdatatime(array $param): void
   {

     ....
     ....
     ....


    if ($dataset['success'] == false)
    {
 		$this->flashMessage('Neco se nepovedlo. Opakujte zadani znovu.', 'error');
      	$this->redrawControl('timesheet');
    }
    else
    {
	 	$this->flashMessage('Item submited.', "info");
    }
    $this->redrawControl('timesheet');
   }

zkusil jsem i předaní do presentru což bych ve finále potřeboval nechal vyobrazit zprávu presentrem na hlavní šabloně

$this->presenter->flashMessage('Item submited.', "info");
Kamil Valenta
Člen | 815
+
+1
-

Pokud chceš ajaxem překreslit flashmsg presenteru, tak si místo jejich výpisu obal snippetem a ten invaliduj.

vlkodlak
Člen | 175
+
0
-

Kamil Valenta napsal(a):

Pokud chceš ajaxem překreslit flashmsg presenteru, tak si místo jejich výpisu obal snippetem a ten invaliduj.

rozumím správně, že tím chceš řičí nepoužit flashmsg, ale proste vytvořit vlastní proměnou a tu pak zobrazit?
nebo je jiná možnost jak zobrazit / načíst zprávy z flashmsg?

Kamil Valenta
Člen | 815
+
+1
-
{snippet flash}
    {foreach $flashes as $flash}
        <div>{$flash->message}</div>
    {/foreach}
{/snippet}


$this->presenter->flashMessage('Item submited.', "info");
$this->redrawControl('timesheet');
$this->presenter->redrawControl('flash');

vlkodlak
Člen | 175
+
0
-

Kamil Valenta napsal(a):

{snippet flash}
    {foreach $flashes as $flash}
        <div>{$flash->message}</div>
    {/foreach}
{/snippet}


$this->presenter->flashMessage('Item submited.', "info");
$this->redrawControl('timesheet');
$this->presenter->redrawControl('flash');

tak jsem to zkusil pridat kod

 {snippet flash}
     {foreach $flashes as $flash}
         <div>{$flash->message}</div>
     {/foreach}
 {/snippet}

layout.latte a do default.latte

 $this->presenter->flashMessage('Item submited.', "info");
 $this->redrawControl('timesheet');
 $this->presenter->redrawControl('flash');

jsem přidal na konec do handleSaveweekdatatime() a bohužel nic se mi nevypsalo

edit: respektive když jsem použit prázdny sand box tak to funguje ale dle toolu a odesíláni neproběhne jako Ajax
edit2: tak ajaxove je hláska ‚Item submited‘ je vytvořena v snippetu, ale nezobrazí se

edit3: tak se zda nasel chybu. pouzil jsem ajax misto nette.ajax

Editoval vlkodlak (2. 5. 2021 23:52)

dakur
Člen | 493
+
+1
-

edit3: tak se zda nasel chybu. pouzil jsem ajax misto nette.ajax

Ajax je způsob, jakým odesílat požadavky na server bez toho, aniž by se musela obnovovat celá stránka (asynchronně). Je to součást HTTP standardu, pokud se nepletu. Implementované je to pak tak, že člověk může použít XMLHttpRequest objekt (starší; např. přes $.ajax), nebo Fetch API (aktuální).

nette.ajax je konkrétní nástroj integrující tuto funkcionalitu s Nette frameworkem. Takže krom toho, že umí samotný „ajax“ (tedy ten asynchronní request), tak umí dělat framework-specific věci – např. překreslit část view, které je ve snippetech, přesměrovat uživatele na jiné view etc. Výhodou je, že pak stačí zavolat příkaz v PHP ($this->invalidateControl(), $this->redirect()) a ono „samo se“ na straně klienta udělá. Pokud člověk potřebuje jen poslat request na server, nepotřebuje k tomu vůbec nette.ajax.

Krom nette.ajax pak existuje pro Nette framework ještě Naja. nette.ajax je vhodnější tam, kde člověk moc neumí JS a pracuje s jQuery, Naja se zase hodí tam, kde se na frontendu pracuje s moduly.

Editoval dakur (5. 5. 2021 9:34)

vlkodlak
Člen | 175
+
0
-

dakur napsal(a):
Krom nette.ajax pak existuje pro Nette framework ještě Naja. nette.ajax je vhodnější tam, kde člověk moc neumí JS a pracuje s jQuery, Naja se zase hodí tam, kde se na frontendu pracuje s moduly.

ano, využívám mix nette pro překreslovaní snippetu a komunikaci se serverem pomoci jQry.

teď jsem narazil na to, že po odeslaní ajaxove na server, se mi vše vykoná a zastaví se v nějakém momentě, kdy stránka na nic nereaguje a pomůže jen reload stránky, jako kdyby stále probíhal nějaký proces? a teď mne nenapadá jak ho ukončit.

dakur
Člen | 493
+
+2
-

stránka na nic nereaguje

Pravděpodobně máte na mysli to, že nefungují javascriptové handlery, ne? Když totiž používáte snippety, musíte počítat s tím, že při jejich překreslení (tj. ve chvíli, kdy nette.ajax přijme nové HTML snippetů) se DOM předchozího stavu snippetů zahodí a je nahrazeno novými DOM nody. Jenže JS handlery jsou zavěšené na konkrétních nodech v DOM a pokud staré nody zahodíte, zmizí s nimi i handlery.

Jednoduše řečeno je tedy třeba při překreslení snippetů reinicializovat i jejich handlery. Něco ve smyslu:

document.addEventListener('DOMContentLoaded', function () {
	initializeForm(getSomeEl()); // inicializace po načtení stránky

	$netteajax.afterRerender(function () { // jen pseudokód, přesnou konstrukci z fleku nevím
		initializeForm(getSomeEl()); // inicializace po každém překreslení snippetů
	});
});

function getSomeEl()
{
	return document.getElementById('someElement'); // pokaždé je třeba vytáhnout ten element znovu, nestačí toto zavolat jen na začátku, protože by to pak už odkazovalo na neexistující node
}

function initializeForm()
{
	// zde např. nějaká JS logika nad formulářovými prvky
}

Editoval dakur (3. 5. 2021 15:58)