Snippety, Naja a volaní modelu z renderDefault

Vred
Člen | 6
+
0
-

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 | 1175
+
+2
-

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 | 53
+
-2
-

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