Kešování dotazů datagridu – jde to?
- raketoplan2005
- Člen | 147
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 | 1838
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
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)