Signál komponenty uloží HTML layoutu do souboru – jak na to?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ot@s
Backer | 476
+
0
-

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');
}
Ot@s
Backer | 476
+
0
-

Poslední pokus s prosbou o radu. Dík.

Filip Procházka
Moderator | 4668
+
0
-

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)

Foowie
Člen | 269
+
0
-
		try {
			$this->sendTemplate();
		} catch(Nette\Application\AbortException $e) {
		}

		ob_start();
		$this->template->render();
		$content = ob_get_clean();

		file_put_contents("page.html", $content);
Filip Procházka
Moderator | 4668
+
0
-

@**Foowie**: Template::save()

Ot@s
Backer | 476
+
0
-

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.

Filip Procházka
Moderator | 4668
+
0
-
Nette\Diagnostics\Debugger::$productionMode = TRUE;
Ot@s
Backer | 476
+
0
-

HosipLan napsal(a):

Nette\Diagnostics\Debugger::$productionMode = TRUE;

Dík, zabralo.

Azim
Člen | 41
+
0
-

jak se to teda vyresilo? taky potrebuju ukladat vystup sablony do souboru a taky mi to nejde