Signál komponenty uloží HTML layoutu do souboru – jak na to?
- Ot@s
- Backer | 476
Prosím znalé o radu. Jak z komponenty, resp. jejího signálu, uložit HTML celé stránky/layoutu do souboru (tj. render ne do prohlížeče, ale do souboru). Níže uvedený kód (fragment komponenty) neudělá to, co bych očekával (tj. nevytvoří soubor /tmp/tmp.html). Díky za nasměrování.
public function handleSavePage() {
// spec. layout
$this->presenter->setLayout('summary');
// ulozeni sablony
$this->presenter->template->save('/tmp/tmp.html');
}
- Filip Procházka
- Moderator | 4668
To proto, že presenter si nastavuje šablonu až v metodě
sendTemplate
, kterou volá sám v run
. Nemůžeš tedy
chtít, aby renderoval šablonu, když neví jakou. Je to docela problém
slepice a vejce.
Teoreticky by jsi mohl volat sendTemplate
, odchytit
AbortException
a odpoveď si vytáhnout, ale je zabetonovaná
v private, takže jedině reflexí a to je tfuj, nebo z šablony
presenteru, jak připomněl @**Foowie**.
nebo taky můžeš udělat
$presenter = clone $this->getPresenter();
$response = $presenter->run($this->getPresenter()->getRequest()); // we need to go deeper
$response->getSource()->save('/temp/page.html');
jestli to nepůjde naclonovat, tak budeš muset vytvořit novou instanci sám.
PS: bacha na rekurzi
Editoval HosipLan (5. 1. 2012 10:21)
- Ot@s
- Backer | 476
Díky za rady. Nakonec jsem to nedal (vyskytly se nové problémy a chyby) a
udělal to jinak. Poslední věc, kterou řeším je že v takto
vygenerované/uložené šabloně mám debugbar. Prosté zavolání
\Nette\Diagnostics\Debugger::enable(false);
v komponentě
nezabírá. Nechce se mi věřit, že tento signál budu muset „detekovat“
někde v bootstrapu, kde se zobrazení debugbaru inicializuje. Otázka tedy
zní – lze debugbar zakázat z komponenty? Díky za pomoc.