predani flashMessage do presenteru z handlu
- vlkodlak
- Člen | 175
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
Pokud chceš ajaxem překreslit flashmsg presenteru, tak si místo jejich výpisu obal snippetem a ten invaliduj.
- vlkodlak
- Člen | 175
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
{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
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
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
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
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)