Naja snippet cache první pokus

Teapack666
Člen | 9
+
0
-

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 | 1028
+
0
-

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');
    }
}