web.php5.sk

Ako si nakešovať menu v Nette

7. február 2016 / Čamo

Ahoj kamaráti! Možno viete, možno nie, že generovanie odkazov v Nette frameworku je dosť náročná operácia. V nasledujúcom článku si preto ukážeme, ako nakešovať dynamické menu. Pripusťme, že menu pre stránku generuje komponenta. Šablóna pre túto komponentu vyzerá nasledovne.

{cache 'menu_key', tags => [ 'menu_tag' ] }

{block menu}
<ul>
{foreach $section as $item}
{var $children = $item->related( 'categories', 'parent_id' )->order( 'priority ASC') }
<li id="{$item->id}">
{if $item->url_params}
<a href="{plink $item->url (expand)explode(' ', $item->url_params)}">{$item->title}</a>
{else}
<a href="{plink $item->url}">{$item->title}</a>
{/if}

{if $children->count() }
{include menu, section => $children } {* RECURSION *}
{/if}
</li>
{/foreach}
</ul>
{/block}

{/cache}

V šablone je blok menu, ktorý rekurzívne volá sám seba, aby vytvoril stromovú štruktúru html kódu. Prechádza premennú $section, ktorá je typu Nette\Database\Table\Selection, ktorý umožňuje traverzovať cez jednotlivé položky ako cez pole. Celý tento kód je obalený makrom {cache}{/cache}. Všetko vo vnútri sa teda uloží do keše. Ku keši je pripojený tag - menu_tag, aby bolo možné keš invalidovať. Trieda komponenty sa kešou vôbec nemusí zaoberať. Všetko sa deje na úrovni šablony.

Predpokladáme, že toto menu je možné editovať cez adminstráciu (alebo cez import), kde môžeme položky vytvárať, upravovať, meniť poradie a mazať. Existuje teda nejaký App\Admin\Presenters\MenuPresenter, ktorý sa špeciálne o tieto veci stará. Do presentera potrebujeme najprv dosťať inštanciu triedy Nette\Caching\Cache ako popisuje dokumentácia.

V mojom prípade to vyzerá nasledovne. Najprv si do MenuPresentera injektujem Nette\Caching\Storages\FileStorage.

/** @var Nette\Caching\IStorage @inject */
public $storage;

Následne si v startUp metóde uložím inštanciu Nette\Caching\Cache pre namespace categories 

$this->categories_cache = new Nette\Caching\Cache( $this->storage, 'categories' );

Takže máme šablonu, ktorá uloží do keše daný kus kódu a máme pripravenú inštanciu keše v MenuPresentery, ktorú budeme potrebovať k invalidácii tejto keše. Teraz sa pozrime na MenuPresenter, ktorý umožňuje editáciu. Všetky jeho metódy, ktoré nejakým spôsobom menia toto menu, musia po úspešnom dokončení editácie zavolať jednoduchú metódu cleanCache(), ktorá vyzerá takto

protected function cleanCache()
{
$this->categories_cache->clean( [ Cache::TAGS => [ 'menu_tag' ] ] );
}

Metóda invaliduje keš zviazanú s tagom menu_tag, ktorý je uvedený v šablone v makre {cache}. 

A sme na konci. Dovidenia kamaráti.

Ak chcete pridávať komentáre musíte sa prihlásiť