správný přístup práce v šablonách s ajaxem
- Reloecc
- Člen | 15
Nette 2.1-dev, PHP 5.4
Dobrý den,
šetříme čas, rovnou k věci. Rád bych se zeptal, zda existuje lepší
řešení pro:
Vytvořil jsem si systém záložek (přepínáných javascriptem) tímto
způsobem:
v presenteru:
function createComponentMainTabs(){
return new MainTabs();
}
MainTabs.php
class MainTabs extends Control
{
function render(){
$this->template->tabs = $this->findAllTabs();
$this->template->setFile('mainTabs.latte');
$this->template->render();
}
}
mainTabs.latte
<!-- zde chybí kód pro vykreslení hlavičky záložek -->
<!-- vykreslení obsahu záložek -->
{foreach $tabs as $tab}
{include $tab->fileName} <!-- inkluduje se .latte soubor -->
{/foreach}
tento způsob řešení splňuje požadavky, které jsem si stanovil:
- vykreslení záložek (hlavičky i obsahu) provést jen makrem {control mainTabs}
- mít pro každý obsah záložky vlastní .latte soubor
- sdílet komponenty záložek s ostatníma záložkama
- přistupovat ke komponentám záložek přímo, ne hledáním v jíné komponentě
Pro splnění těchto požadavků jsem tedy zvolil schopnost
nette ‚spojovat‘ šablony makrem {include}.
Při ajaxových requestech jsem však narazil na bug
při inkludování snippetů, který jsem obešel implementací snippetRunneru.
Nemám však (pochopitelně) dobrý pocit z používání neimplementované modifikace nette, pull existuje už dlouho a kdo ví, co se s ním stane.
Rád bych tedy požádal Vás ostatní o nakopnutí. Je možné změnit (klidně celý) koncept tak, aby zůstaly splněny zmíněné požadavky a nenarazit na inkludování snippetů?
Jednou možností je definovat dynamické snippety (v mainTabs.latte):
<!-- vykreslení obsahu záložek -->
{snippet tabsContainer}
{foreach $tabs as $tab}
{snippet $tab->name}
{include $tab->fileName}
{/snippet}
{/foreach}
{/snippet}
v takovém případě je však potřeba invalidovat i statický snippet (kontejner těch dynamických) a tedy v payload zasílat veškerý obsah záložek: neefektivní
Dokážu definovat záložky, které vykreslit a zasílat v payload jen ty invalidní – což však vyžaduje volání jiné funkce než invalidateControl() a v menší míře přetrvává neefektivnost, neboť by se odesílal celý obsah záložky tam, kde by bylo možné odeslat jen jeden snippet z mnoha možných.
Někde kolem jsem se dočetl, že je možné obejít neschopnost inkludovat snippety dědičností šablon, což se mi při splnění požadavků nepovedlo zprovoznit.
Všem děkuji za případné rady..
Editoval Reloecc (16. 7. 2013 15:47)