Šablona se ihned vypíše, nefunguje ob_start ani (string)$template

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
CZechBoY
Člen | 3608
+
0
-

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)

enumag
Člen | 2118
+
0
-

V testech bude asi lépe použít Kdyby/FakeSession.

CZechBoY
Člen | 3608
+
0
-

Jo bude toho víc… Spíš mně zajmalo jak je možný, že ob_start nefunguje :-)

enumag
Člen | 2118
+
0
-

Podle mne to možný není. :-D

CZechBoY
Člen | 3608
+
0
-

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.

enumag
Člen | 2118
+
0
-

Aha tak to je hláška kterou hází Nette. Můžeš ji vypnout když nastavíš tohle na false.

kolsi
Člen | 131
+
0
-

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 | 8212
+
0
-

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
+
0
-

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)

David Grudl
Nette Core | 8212
+
+1
-

V nejnovější verzi Tracy se vyčištění output bufferu už řeší.