Nette Debugger a Nette Forms

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

Ahojte,

Mam problem s Nette Debuggerom s spolupraci s Nette Formami. Pouzivam Framework CodeIgniter, do ktoreho som si pridal spominany debugger a formy:

Tato postupnost sposobi, ze Debugger nezachyti notice na poslednom riadku, Debug bar sa zobrazi ale nehlasi ziadnu chybu a samotna chyba sa vypise priamo do stranky.

use Nette\Forms\Form;
use Nette\Diagnostics\Debugger;

class Test extends CI_Controller
{
	function index()
	{
		Debugger::enable();

		$form = new Form('region');

		$form->addText('test', 'test');

		$a = array(); echo $a['x']; // notice - undefined index
	}
}

Screenshot

Ak dam Nette formu prec, resp nepridam jej ziadny prvok, tak sa chyba zobrazi spravne v debug bare:

use Nette\Forms\Form;
use Nette\Diagnostics\Debugger;

class Test extends CI_Controller
{
	function index()
	{
		Debugger::enable();

		$form = new Form('region');

		$a = array(); echo $a['x']; // notice - undefined index
	}
}

Screenshot

Chcel by som aby vsetky chyby (aj notice) zachytaval nette debugger, pretoze ked sa niektore chyby zobrazuju v stranke a niektore v nette debuggeri, tak sa to strasne zle odladuje. Dakujem za rady.

Milo
Nette Core | 1283
+
0
-
Nette\Diagnostics\Debugger::$strictMode = TRUE;
fliper333
Člen | 36
+
0
-

Milo diky za tip, skusal som nepomohlo (robi to to iste)

fliper333
Člen | 36
+
0
-

Nasiel som pricinu co sposobovala to divne chovanie Debuggera pri pouziti Nette foriem.

Je to funkcia restore_error_handler() v subore Http/Session.php (riadok 102 a 107).

Kedze ja session vyuzivam mimo Nette (autoloadom v Codeigniteri), je uz session v dobe vytvarania formulara inicializovana.

To znamena ze volanie funkcie session_start() – Http/Session.php:105 zavola hned funkciu set_error_handler() – Http/Session.php:99 so spravou „A session had already been started – ignoring session_start()“ ta zaroven vykona funkciu restore_error_handler(), teda preda error handler Nette debuggeru. Potom je funkcia restore_error_handler() znova zavolana na riadku 107, a v tomto pripade zase preda error handler o 1 uroven vyssie – teda Codeigniteru.

Session kniznica sa v mojom pripade inicializuje az pridanim formularove prvku do Nette Formy, preto sa problem vyskytoval iba v prvom pripade a nie v druhom.

Teraz rozmyslam aky rozumny workaround pouzit, pretoze kombinaciu Codeigniter + Nette formy + Nette debugger vyuzivam na uplne vsetkych svojich projektoch.

Napadli ma 3 moznosti. Zakomentovat bud riadok 102 alebo 105 alebo 107. Najrozumnejsie sa mi zda zakomentovat riadok 105, kedze session su uz v tomto momente spustene, ale popravde do Nette Frameworku az tak dobre nevidim a preto by som chcel poradit, mozno existuje lepsie riesenie.

PS: zakomentovat som musel logicky aj riadok 92:$this->configure($this->options); pretoze v opacnom pripade som dostal chybu Unable to set ‚session.gc_maxlifetime‘ to value ‚10800‘ when session has been started by session.auto_start or session_start()

Milo
Nette Core | 1283
+
0
-

Poslal jsem návrh na opravu: https://github.com/…te/pull/1154

fliper333
Člen | 36
+
0
-

To by bolo super keby sa to da riesit priamo opravou v Nette.

Uz ked sme pri tych opravach, myslis ze by sa dalo navrhnut ako oprava aj ten riadok 92 – $this->configure($this->options);?

V novej verzii Nette sa to snazi nastavit gc_maxlifetime co sposobi fatal error ak su session uz spustene.

Ako som spominal vyssie, z Nette vyuzivam iba Debugger a Formy a prave tie Nette Forms sa snazia z nejakeho dovodu automaticky inicializovat Nette Session, co sposobi problemy, pokial tam nezakomentujem ten riadok 92.