Ajaxové hlášky

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

Zdravím,

s Nette začínám a potřeboval bych poradit ohledně AJAXu. Uživatel na něco klikne, čímž vyvolá nějakou akci – zavolá se příslušný Presenter->View. Při requestu nastala nějaká chyba (typicky uživatel není přihlášen). Přesměruju na autorizační Presenter, jehož cílem je vykreslit uživateli překryvnou vrstvu s přihlašovacím formulářem. Nějak nevím, jak přesně to udělat.

Napadlo mě mít {snippet #overlay} kde se budou zobrazovat chybové hlášky nebo právě přihlašovací form. Problém je, že pokud se nic špatného nestalo, nic uvnitř snippetu by se němělo zobrazit. Navíc by nemohl mít pevnou html šablonu – někdy je tam hláška o chybě, jindy potvrzovací dialog, jindy zase přihlašovací form atd.

Když to řeknu jinak, v případě, že nastane chyba potřebuji na konec html přidat html tý překryvný vrstvy (o překrytí se stará CSS). Jenže potřebuju vrátit různé html v závislosti na chybě a to jen tehdy když nastala.

Vlastně mám dojem, že snippet asi na tohle není to pravé, nebo by jich mělo být více, nebo nevím… Jak tuhle situaci v Nette řešit?

Celkově jsem z toho všeho už dost zmatenej – doufám, že jsem to alespoň napsal srozumitelně.

Díky za jakékoli nápady.

_Martin_
Generous Backer | 679
+
0
-

Tohle bych asi řešil použitím nějakého lightboxu – AJAXové udělátko by jen vytvářelo lightboxová okna a do nich načítalo potřebné presentery… Možná by to nějak takto šlo.

jtousek
Člen | 951
+
0
-

Martin:

To by šlo v případě přihlašovacího formu, ale ne v případě upozornění, že nastala chyba.

Tomik
Nette Evangelist | 485
+
0
-

jtousek napsal(a):

Martin:

To by šlo v případě přihlašovacího formu, ale ne v případě upozornění, že nastala chyba.

Nevidím důvod, proč by to nešlo i v takovém případě. :)

jtousek
Člen | 951
+
0
-

Vidím problém v tom, že když pošlu požadavek, nevím co dostanu zpátky – obvykle úspěch a něco se někde vypíše. Když ale nastane chyba potřebuju jen příslušně upravit ten snippet #overlay. Jenže nevím, jak mít v tom snippetu různý html pro různý případy. Mám dojem, že mi uniká nějakej základní princip – můžu mít stejnej snippet v několika šablonách s různym html uvnitř?

bazo
Člen | 620
+
0
-

daj si do @layout prazdny snippet, v odpovedi vytvoris html ake potrebujes, javascript to vlozi do toho snippetoveho divu. to je cele.

jtousek
Člen | 951
+
0
-

bazo:
v tom případě ale neni důvod mít to jako snippet, ne?

Tomik
Nette Evangelist | 485
+
0
-

jtousek napsal(a):

bazo:
v tom případě ale neni důvod mít to jako snippet, ne?

Pokud to nechceš ajaxově, tj. na pozadí, tak ne.

jtousek
Člen | 951
+
0
-

chci to ajaxově, ale když ten snippet bude prázdnej, kudy tam propasíruju to html? je mi líto ale začínám se v tom vážně příšerně motat :(

jtousek
Člen | 951
+
0
-

Zkusím se vyjádřit úplně jinak…

Uživatel přijde, server mu vrátí základní layout aplikace. Poté, cokoli udělá už by mělo být bez reloadu stránky. Např.:

Uživatel klikne někem do nabídky, že chce výpis kategorií. ⇒ AJAX do div#content natáhne strom kategorií.

Uživatel klikne, že chce editovat kategorii. ⇒ do #content místo tabulky výpisu se natáhne formulář editace.

Uživatel klikne na něco dalšího, ale vypršela mu session s přihlášením. ⇒ Zobraz overlay s přihlašovacím formulářem, po té, co se uživatel přihlásí JS na straně klienta zopakuje předchozí dotaz.

Defacto potřebuji aby každá akce změnila měla za následek, že server vrátí nějakou strukturu, kde bude nové HTML pro jeden nebo více prvků (divů) na stránce, dále třeba Javascript, který se má po načtení provést, nový <title> stránky, pokud nastala chyba (např. vše se povedlo, ale je třeba zobrazit upozornění) tak proveď všechny změny divů a v překryvné vrstvě zobraz chybovou hlášku nebo třeba onen přihlašovací form. Nikdy předem nevím, které části stránky server vrátí jako změněné. Např. při stránkování zůstane vše kromě jedné tabulky.

Aby aplikace fungovala s vypnutým JS nepotřebuju, vlastně bude lepší když fungovat nebude. Není mi jasné, jestli na tohle mám používat snippety, nebo jestli snippety jsou určené pro něco jiného a tohle by se mělo řešit jinak.

Editoval jtousek (5. 12. 2009 7:44)

bazo
Člen | 620
+
0
-

jtousek napsal(a):

bazo:
v tom případě ale neni důvod mít to jako snippet, ne?

pointa bola v tom, ze sa tam nic neukazuje. naplni sa az ked ty chces. a snippet kvoli tomu, ze mozes potom pouzit napr https://componette.org/search/?… na zautomatizovanie toho prekreslenia

Tomik
Nette Evangelist | 485
+
0
-

Aha, tak asi takhle:

Klidně použij snippety. Bude mít několik základních snippetů: menu, content, login form, v každém z nich bude nějaká (vykreslitelná) komponenta.

A vždy při přepisování těchto komponent (tedy jejich překreslení) musíš invalidovat konkrétní snippet.

Dále je potřeba zajistit během renderu těch komponent, zda se opravdu mají, či nemají vykreslit. Např. pokud sessions nevypršela, zobrazím vše, krom login formu, naopak, pokud vypršela, zobrazím jen login form (ale invaliduju i content, do který pošlu „prázdno“, aby se překreslil původní obsah).

Zatím takovouhle funkčnost je možné udělat pomocí výchozího jQuery Ajax Driveru (viz https://componette.org/search/?…). Pokud bys chtěl měnit ten title, je nutné si takový titulek poslat v payload (hledej v dokumnetaci, či API), a pak si jej pomocí vlastního Ajax driveru, který bude vycházet z toho výchozího vytáhnout a přepsat jím titulek stránky.

Stačí takhle?

V případě, že by to nešlo, můžu ukázat v ponděli, jak na to, až se uvidíme.

jtousek
Člen | 951
+
0
-

Tomik:

Díky, něco zkusím, ale asi budu potřebovat v pondělí podrobněji. Třeba ten titulek – není možný mít samotnej titulek jako snippet? Že by ta komponenta pak dycky měnila jak snippet s titulkem tak snippet s obsahem? Nebo může každá komponenta překreslovat jen jeden?

Tomik
Nette Evangelist | 485
+
0
-

jtousek napsal(a):

Tomik:

Díky, něco zkusím, ale asi budu potřebovat v pondělí podrobněji. Třeba ten titulek – není možný mít samotnej titulek jako snippet? Že by ta komponenta pak dycky měnila jak snippet s titulkem tak snippet s obsahem? Nebo může každá komponenta překreslovat jen jeden?

Teoreticky to možné je, ale pak by se musel trošku pozměnit způsob vykreslování snippetů pomocí jQuery. V pondělí se mi připomeň.