Naja snippet cache první pokus
- Teapack666
- Člen | 9
Zdravím, mám „snad“ jednoduchou otázku ohledně naja.js.
Chtěl bych, aby mi po refreshi stránky a nebo kroku zpět v historii
zobrazilo snippet v podobě v jaké se byl před akcí…
Příklad:
Mám stránku s aktuálními akcemi v kalendáři. Tlačítkem „Historie“
volám ajaxově handle signálu a překreslím snippet na akce historické. Vše
funguje, jen bych chtěl aby při refreshi stránky, zůstal snippet překreslen
na „historie“, to stejné pokud si zobrazím nějakou akci z historie,
přejdu na akci „AKCE:Detail“ a pak se vrátím zpět v prohlížeči.
Pochopil jsem, že toto vyřeším přes Naju a její history snippet cache, ale
za boha se nemohu dobrat k výsledku. Dle dokumentace a videonávodu
z youtube, to vše vypadalo jako brnkačka, ale asi vůbec netuším.
šablona
<div n:snippet="shows">
<div class="row justify-content-center px-1 my-3" id="actions">
<div class="col-12 col-md-8 content">
{foreach $shows as $show}
....Výpis dat
{/foreach}
</div>
</div>
{if $actualShows == 1}
<div class="row justify-content-center">
<a n:href="showHistory!" type="button" class="ajax btn btn-success col-6 col-md-1" data-naja-history="replace">Co už je za námi</a>
</div>
{/if}
</div>
Presenter
public function beforeRender(): void {
$this->redrawControl("shows");
}
public function actionDefault() {
$this->template->shows = $this->showsModel->getShows($pastShows = false);
}
public function handleShowHistory() {
if ($this->isAjax()) {
$this->template->actualShows = 0;
$this->template->shows = $this->showsModel->getShows($pastShows = true);
$this->redrawControl("shows");
$this->payload->postGet= true;
$this->payload->url = $this->link('this');
} else {
$this->redirect('this');
}
}
Při kontrole response ajax requestu jsou ve snippet–shows správná data.
Jak tedy docílit, aby se při obnově stránky překreslili znovu jako
ShowHistory ?? Nikde mi z logiky nevychází, jak a kdy by k tomu mělo
dojít.
Bude mnou požadovaná funkčnost nějak zprovoznitelná nebo jsem to vše
špatně pochopil ?
Díky za konstruktivní rady a nějaké lehké popostrčení směr výsledek.
- jiri.pudil
- Nette Blogger | 1029
Ahoj, když obnovíš stránku, browser obejde jakýkoliv JS a prostě pošle
přímý, ne-ajaxový request na tu URL, kterou má v adresním řádku.
V tvém případě bude (díky $this->link('this')
v postGetu)
ta URL vždycky stejná a povede na actionDefault
. Pokud chceš
stav stránky zachovat i po jejím obnovení (nebo třeba nasdílení URL
kamarádovi), pak musí být ten stav součástí URL – a tedy i parametrem
metody actionDefault
.
Píšu z hlavy, ale asi by ten odkaz dost možná neměl mít
data-naja-history="replace"
(to slije aktuální a uplynulé
události zdánlivě do stejného requestu/URL, což myslím nechceš) a měl by
spíš směřovat na:
<a n:href="this, showHistory: true" ...>
a v presenteru:
public function actionDefault(bool $showHistory = false) {
$this->template->shows = $this->showsModel->getShows($showHistory);
if ($this->isAjax()) {
$this->redrawControl('shows');
}
}