Odeslani odpovedi az po zpracovani cele sablony

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

Na skoleni matne tusim ze bylo receno ze lze nejakym nastavenim pockat s odeslanim odpovedi az po zpracovani cele sablony. Pouziva se to napriklad k tomu, aby se neodeslalo nic, pokud dojde k chybe pri zpracovani sablony…

Nevite jak na to? Nemuzu to ted najit.

nAS
Člen | 277
+
0
-

Já bych každopádně doporučil dělat operace při kterých může dojít k chybě před fází render, aby se případně dalo snadno přesměrovat na ErrorPresenter. Pak by tento problém odpadl.

washo
Člen | 88
+
0
-

nAS napsal(a):

Já bych každopádně doporučil dělat operace při kterých může dojít k chybě před fází render, aby se případně dalo snadno přesměrovat na ErrorPresenter. Pak by tento problém odpadl.

No taky proto chci aby se vystup zacal odesilat az pak.

add output_buffering… no jasne… ale jde to nak v ramci frameworku.

nAS
Člen | 277
+
0
-

Framework sám od sebe nic před fází render neodesílá, takže pokud něco nevypisuješ sám (což bys určitě neměl), tak můžeš přesměrovat snadno.

Jinak pokud chceš používat Output buffering, tak stačí dát například do konstruktoru BasePresenteru, nebo přímo do bootstrapu:

ob_start();
David Grudl
Nette Core | 8228
+
0
-

Fakt je ten, že s hlediska frameworku by bylo čisté volat ob_start v objektu IPresenterResponse, tedy to třeba přidat do RenderResponse.

Druhou možností je globální nastavení v config.ini (viz manuál):

[common]
php.output_buffering = on

Na druhou stranu, ob_start zpomalí reakce serveru, protože stránka se odešle až po jejím kompletním vygenerování, což v případě skutečně velkých výstupů (nějaké XML) může být dost problematické. Dá se to řešit omezením bufferu třeba na 10kB, takže prvních 10kB se bufferuje a pak teprve odesílá:

[common]
php.output_buffering = 10000

Oprava: direktivu output_buffering nejde nastavit v prostředí PHP, je potřeba zavolat ob_start(NULL, 10000).

Nicméně k chybě musí dojít během těch prvních 10kB, což je trošku magické.

Aby to ale fungovalo dle očekávání, je potřeba v error presenteru buffer smazat, tedy (třeba vícekrát) volat ob_end_clean. A dát bacha na to, aby se tímto nevypnul případný ob_gzhandler, protože ten už odeslal HTTP hlavičku, že data jsou komprimovaná a prohlížeč je takové očekává.