Kešování dotazů datagridu – jde to?

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

Zdravím. Mám tabulků s velkým množstvím řádků, kterou bych rád na frontendu zobrazil lidem buď formou vlastní tabulky se stránkováním, nebo datagridu (v projektu používám Nifty). Vzhledem k tomu, že dat je docela dost a přístupů očekávám taky (na tato konkrétní data) hodně, určitě by bylo vhodné zapojit cache. Jak ale navěsit kešování na grid? Nifty grid si vytváří vlastní datasource a nedokážu asi kešovat ani fetchPairs z Nette\Database (PDO). Co si myslíte že by bylo rozumné řešení?

hrach
Člen | 1834
+
0
-

Pokud bys pouzil datagrid z nextras, tak to jde naprosto jednoduse. Jinak predpokladam, ze nifty snad zvladne jakykoliv \Traversable. Ale to je proste nevyhoda vsech tech datagridu, ze je nikdy neohnes dle sebe a proto sem to napsal jinak.

// misto tohoto
$grid->setDataSourceCallback($this->getData);
// udelas toto
$grid->setDataSourceCallback(function($filter, $order) {
	if (empty($filter) && empty($order)) {
		return $this->cache->load(
			"datagrid-".md5(json_encode($filter).json_encode($order)),
			$this->getData
		);
	} else {
		return $this->getData($filter, $order);
	}
});

(Samozrejme zalezi na mire co chces vsechno cachovat, invidualni filtrovani asi ne, takze jen zakladni strankovani na zakladnim razeni. Na druhou stranu nextras Datagrid nepodporuje paginator, musis si ho naprogramovat sam. Ale to je vcelku easy.)

raketoplan2005
Člen | 147
+
0
-

Bezva, děkuji. Nicméně mám ještě začátečnický dotaz – getData() já standardně beru jen selection – jak tohle můžu nakešovat? Tím skončím na tom, že PDO nejde serializovat, to samé když udělám fetchPairs(), tam je zase activeRow. Nicméně tvojemu gridu jde předat i fetchAll() po query což je super.

Editoval raketoplan2005 (24. 2. 2013 20:59)

hrach
Člen | 1834
+
0
-

Ha, vidis, to mi nedoslo, ze Selection nepujde serializovat, ale jak rikam. Zaklad je, aby grid umel pracovat s \Traversable.