Šablona se ihned vypíše, nefunguje ob_start ani (string)$template
- CZechBoY
- Člen | 3608
Zdravím,
funguje vám uložení vyrenderované šablony do proměnné v konzoli?
Zkouším to přes
$requestGet = new Request('Sign', 'GET',
array ('action' => 'in')
);
$this->presenter->invalidLinkMode = Presenter::INVALID_LINK_SILENT;
$responseGet = $this->presenter->run($requestGet);
Assert::type('Nette\Application\Responses\TextResponse', $responseGet);
$html = (string)$responseGet->getSource();
ale vždy se mi to vypíše do konzole a potom se nemůže nastartovat session :/
Dělám něco špatně?
Editoval CZechBoY (20. 10. 2015 15:24)
- CZechBoY
- Člen | 3608
ob_start funguje, ale session protestuje :/
Asi pokud se používá session a jede se přes cli tak se session
nespustí.
Jinak chybová hláška, kterou dostávám:
E_USER_NOTICE: Possible problem: you are starting session while already having some data in output buffer. This may not work if the outputted data grows. Try starting the session earlier.
- kolsi
- Člen | 131
Ahoj, mám podobný problém. Chci otestovat výstup šablony:
$response = $presenter->run($request);
// Ověříme, zda odpověď je skutečně šablona:
Assert::true( $response instanceof Nette\Application\Responses\TextResponse );
// Necháme šablonu vygenerovat HTML kód:
$html = (string)$response->getSource();
$dom = DomQuery::fromHtml($html);
ale pokud při generování šablony dojde k chybě, tak je její HTML kód (až do místa výskytu chyby) vypsán na výstup.
Je to záměr, nebo jsem někde něco opomněl?
- David Grudl
- Nette Core | 8218
Převod na string používá output buffer a ten, pokud není uzavřený, což se může při chybě stát, se standardně vypíše na výstup.
- kolsi
- Člen | 131
Aha, jestli to dobře chápu, tak je to kvůli:
98: /**
99: * Renders template to string.
100: * @return string
101: */
102: public function renderToString($name, array $params = array())
103: {
104: ob_start();
105: try {
106: $this->render($name, $params);
107: } catch (\Exception $e) {
108: ob_end_clean();
109: throw $e;
110: }
111: return ob_get_clean();
112: }
Kde dojde k vyčištění v případě Exception, ale pokud dojde k neodchycené chybě (např. E_NOTICE: Undefined variable), tak už se buffer nevyčistí a vypíše se tedy na výstup.
Dá se to řešit jinak než definováním vlastního error handleru, který to bude čistit?
set_error_handler(function() {
if (error_reporting() === 0) {
return FALSE;
}
restore_error_handler();
@ob_end_clean();
return FALSE;
});
$html = (string)$response->getSource();
restore_error_handler();
Editoval kolsi (24. 11. 2015 19:19)