Pomoc s ajaxovou aplikaciou

vladimir.biro
Člen | 163
+
0
-

Ahojte.

Skusil by mi prosim pomoct niekto s nasledujucou vecou?

Mam web, kde mam menu a toto menu chcem zajaxovat, cize po kliku na polozku v menu sa stranka nebude refreshovat, ale sa cez ajax do snippetu nacita obsah.

No problem je v obsahu stranku mam dalsie snippety, ktore chcem ajaxovo spustat, ale uz bez hlavneho snippetu, ktory mam na nacitavanie celeho obsahu.

redrawControl mam v presenteri takto:

if ($this->isAjax()) {
$this->redrawControl(‚container‘);
}

no ten sa mi samozrjeme spusti po kazdom ajaxovom poziadavku, aj po takom, ktory nevyzaduje nacitanie novej stranky.

Ako priklad uvediem, ze mam napriklad formular a v nom mam multiplier, ktory vyzaduje ajax a kde sa nacita novy obsah iba pre multiplierove polozky. No mne sa tu nacita komplet cely obsah, lebo sa spusi redrawControl(‚container‘), co robi samozrejme bordel na inych miestach obsahu. A to je len jeden priklad…

Riesil niekto tento problem prosim? Uz sa s tym realne mordujem dva dni :/

MajklNajt
Člen | 471
+
0
-

Sám si odpovedal, pri každom requeste prekresluješ container, prekresli ho iba vtedy, keď potrebuješ

vladimir.biro
Člen | 163
+
0
-

MajklNajt napsal(a):

Sám si odpovedal, pri každom requeste prekresluješ container, prekresli ho iba vtedy, keď potrebuješ

A ako zistim, ze toto je request vyvolany buttonom z menu a toto je iny request? Napriklad multiplier. Kedze ten redrawControl, ktory preklresluje container (hlavny obsah webu) mi spusta aj multiplier. Je mozne tam poslat nejaku premennu, podla ktorej by som mohol urobit nejaku podmienku?

vladimir.biro
Člen | 163
+
0
-

Skusim sem dat modelovy priklad.

Dajme tomu, ze mam jednoduchu stranku, kde mam len menu a obsah. V menu mam iba dve polozky. About me a Contacts.
Mam to v dvoch presenteroch a prepinanie funguje standardne. Ked ho chcem prerobit na ajaxove, tak odkazom About me a Contacts v menu pridam class = ajax, obsah obalim do snippet = ‚obsah‘ a zrejme niekde do BasePresenteru pridam:

protected function beforeRender()
{
	if ($this->isAjax()) {
    	$this->redrawControl('obsah');
	}
}

Tak a teraz sa mi obsah prekresluje ajaxovo, bez refreshu stranky. Super.

Lenze teraz si chcem do podstranky Contacts pridat generator nahodneho cisla, ktory bude tiez fungovat ajaxovo.

Takze do presenteru pre podstranku Contacts pridam nieco ako

$this->template->number = rand();

a do latte pre Conacts pridam

{snippet nahodneCislo}
	{$number}
{/snippet}

<a n:hred="vygeneruj!">vygeneruj</a>

Nasledne v signalil handleVygeneruj() spustim iba:

function handleVygeneruj()
{
	$this->redrawControl('nahodneCislo');
}

A malo by mi to fungovat.

No problem je, ze sa neprekresli iba snippet nahodneCislo, ale spolu s nim sa prekresli aj snippet obsah (pretoze to spusti redrawControl v base presenteri), co je pre mna neziaduce. Viem, ze v tomto priklade je to jedno, ale v mojom realnom pripade to robi problemy a nemozem prekreslovat zakazdym cely obsah.

Dokonca sa snippet nahodneCislo nevygeneruje vobec, nakolko sa generuje iba hierarchicky najvyssi snippet, co je v tomto pripade snippet obsah.

Povedzme, ze chceme mat na podstranke Contacts dve nahodne generovane cisla. Ale po nacitani stranky Contacts sa maju vygenerovat obe nahodne cisla {$number} aj {$number2}, no po kliknuti na button [ vygeneruj ] sa ma nanovo vygenerovat a prekreslit iba {$number}.

Takze to v Contacts bude nejako takto:

Presenter:

$this->template->number = rand();
$this->template->number_2 = rand();

Latte:

{snippet nahodneCislo}
	{$number}
{/snippet}

<a n:hred="vygeneruj!">vygeneruj</a>

{$number_2}

Je sposob, ako urpavit kod tak, aby sa prekresloval iba snippet nahodneCislo?

Dakujem za pomoc.

Editoval vladimir.biro (13. 1. 2023 9:40)

mystik
Člen | 289
+
0
-

Zkus to takhle:

protected function beforeRender()
{
	if ($this->isAjax() && $this->getSignal() === null) {
    	$this->redrawControl('obsah');
	}
}

To by mělo vypnout překreslení celého obsahu pokud request míří na nějaký signál třeba to tvoje vygeneruj

Editoval mystik (13. 1. 2023 9:40)

vladimir.biro
Člen | 163
+
0
-

mystik napsal(a):

Zkus to takhle:

protected function beforeRender()
{
	if ($this->isAjax() && $this->getSignal() === null) {
    	$this->redrawControl('obsah');
	}
}

To by mělo vypnout překreslení celého obsahu pokud request míří na nějaký signál třeba to tvoje vygeneruj

Tohle je super!! … jenomze v mem realnim pripade to moc nefunguje, protoze se nejedna jenom o requesty ze signalu. :(

mystik
Člen | 289
+
0
-

V signalech si usis prekreslovani resit sam. Tohle prekresli cely obsah pokud request neobsahuje signal. Pokud mas pripady, kdy nemas signal, ale nechceš překreslit celý obsah budeš je muset nějak identifikovat.

vladimir.biro
Člen | 163
+
0
-

mystik napsal(a):

V signalech si usis prekreslovani resit sam. Tohle prekresli cely obsah pokud request neobsahuje signal. Pokud mas pripady, kdy nemas signal, ale nechceš překreslit celý obsah budeš je muset nějak identifikovat.

No a prave to „nejak identifikovat“ potrebuju vyresit. :)

MajklNajt
Člen | 471
+
0
-

tak si vyrob v tom presenteri property, ktorá bude bool, a v prípade, že v nejakej akcii budeš chcieť potlačiť prekreslenie celého obsahu, tak jej iba nastav false a do beforeRender daj do podmienky hodnotu tejto property.

MajklNajt
Člen | 471
+
+2
-
private bool $redrawContent = true;

protected function beforeRender()
{
	if ($this->isAjax() && $this->getSignal() === null && $this->redrawContent ) {
    	$this->redrawControl('obsah');
	}
}

public function actionTest()
{
	if ($this->isAjax()) {
    	$this->redrawControl('kusok');
		$this->redrawContent = false;
	}
}

Editoval MajklNajt (13. 1. 2023 12:54)

Marek Znojil
Člen | 76
+
0
-

Taky by mohlo posloužit:
https://doc.nette.org/…ication/ajax#…

vladimir.biro
Člen | 163
+
0
-

MajklNajt napsal(a):

private bool $redrawContent = true;

protected function beforeRender()
{
	if ($this->isAjax() && $this->getSignal() === null && $this->redrawContent ) {
    	$this->redrawControl('obsah');
	}
}

public function actionTest()
{
	if ($this->isAjax()) {
    	$this->redrawControl('kusok');
		$this->redrawContent = false;
	}
}

Mozes mi vysvetlit, ako to, ze mi nieco tak proste nenapadlo? :D

Dik kamo.