Sdílení informací v rámci Presenteru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
microcz
Člen | 62
+
0
-

Omlouvám se za dnešní záplavu začátečnických otázek :o)

V rámci jednoho presenteru mám

  • metodu renderDetail, která připraví data pro šablonu s detailem objednávky
  • několik „create“ metod, které získávají data pro komponenty zobrazované na stránce
  • několik „handle“ metod, které obsahují akce jako zrušení objednávky atd.

Všechny tyto metody pracují s databázovou tabulkou, kterou načítám přes dibi a která je poměrně velká. Já bych tuto tabulku chtěl nějakým způsobem „nacachovat“ v presenteru, aby se nemusel její select volat opakovaně v každé metodě, lze to nějak zařídit?

Editoval microcz (18. 5. 2014 18:53)

David Matějka
Moderator | 6445
+
0
-

render* metody se volaji az po handle. Pokud chces nacist data, se kterymi bude pote presenter pracovat, pouzij radeji action* metody.

sKopheK
Člen | 207
+
0
-

Pokud si natahání dat z databáze dáš do samostatné metody, stačí mít v presenteru chráněnou/soukromou proměnnou, do které výsledek uložíš, a při dalším volání metody jen zkontroluješ, jestli už tam je nějaký obsah, abys to netahal zbytečně víckrát.

class xPresenter
{
	protected $data = NULL;

	protected function getData()
	{
		if ($this->data == NULL)
		{
			// získání dat

			$this->data = ...;
		}
		return $this->data;
	}

	...
}

Samozřejmě při tahání dat podle nějakých podmínek to bude trošku složitější.

Jan Endel
Člen | 1016
+
0
-

Pokud potřebuješ cachovat celou db tabulku, tak buďto řešíš nějaký hodně edge case a nebo to používáš špatně. Napiš prosim podrobně co s ní chceš provádět.

microcz
Člen | 62
+
0
-

Ahaa, takže jestli Vaše rady chápu dobře tak mám tabulku načíst v action místo render a pak jí nacachovat do atributu, který zůstane přístupný pro ostatní metody po dobu existence daného presenteru.

Jan Endel: Vyjádřil jsem se nepřesně :o) Nepotřebuji cachovat celou tabulku jen řádek určitého view, jehož vyselektování zabere nějaký čas.