Snippety, Naja a volaní modelu z renderDefault
- Vred
- Člen | 9
Zdravím všechny pracující občany :).
Potřeboval bych trochu nakopnout abych se posunul někam dál :). Používám Snippety společně s Jquery a jsem tak nějak spokojený.
Můj problém je, že jakmile volám /?do=NECO tak se zavolá handle a vše proběhne v pořádku ale i s handle se volá renderDefault, kde mám několik spojení s modelem a zbytečně se tyto modely volají.
Vyřešil jsem to takto
public function renderDefault(){
$getUser = $this->getUser();
if(!$this->isAjax()){
$getCountPeople = $this->homeModel->getCounPeople();
$this->template->getFolders = $this->favoritesModel->getFolders($getUser);
}
}
Tímto jsem omezil volání v renderDefault a handle dělá jen to co má. Moje otázka je, zda je tento přístup správný? Popřípadě prosím, o pomoc jak tohle řešit na lepší úrovni, než pokaždé dávat IF do renderu.
- Marek Bartoš
- Nette Blogger | 1260
Můžeš problém zredukovat používáním komponent → když se nevykreslí snippet obsahující komponentu, tak se ani neprovede dotaz.
Pokud ale jde o aktuální komponentu, tak bez nějaký úprav neprovedení dotazu do databáze udělat nejde. Ta render metoda předává do šablony i data potřebná pro snippety, vždy se musí volat.
Jestli nechceš ifovat, tak můžeš data získávat lazy v šabloně. Tak se model zavolá jen v případě, že se daná část šablony překreslí. A nemusíš tak rozlišovat, který snippet potřebuje která data, jen rozlišení zda je/není ajax na tohle nestačí
$this->template->getFolders = fn() => $this->favoritesModel->getFolders($getUser);
{foreach $getfolders() as $folder}
{* ... *}
{/foreach}
Editoval Marek Bartoš (1. 8. 2023 13:55)
- mskocik
- Člen | 61
Alternativne, ak celá logika tj. vrátane nastavenia premenných
v šablóne je zapúzdrená v handle*
metóde, môžeš na konci
handle*
odoslať šablónu priamo:
public function handleSignal(): void
{
/** signal handler... */
$this->redrawControl('snippet-to-redraw');
$this->sendTemplate();
}