Pomoc s ajaxovou aplikaciou
- vladimir.biro
- Člen | 163
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 :/
- vladimir.biro
- Člen | 163
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
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 | 308
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
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. :(
- vladimir.biro
- Člen | 163
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 | 493
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)
- vladimir.biro
- Člen | 163
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.