Nette Debugger a Nette Forms
- fliper333
- Člen | 36
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
}
}
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
}
}
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.
- fliper333
- Člen | 36
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()
- fliper333
- Člen | 36
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.