Proměnnou lze v nette vypsat na obrazovku například přes templatu. V presenteru naplníme proměnnou a následně ji vypíšeme v šabloně. Tento přístup je však pro ladění programu dosti nepohodlný. Pokud je v programu chyba, která způsobí volání laděnky, lze obsah proměnných někdy vidět přímo v laděnce.
Zpočátku si asi každý povzdechne, že nemůže jednoduše vypsat proměnnou přes echo či funkce print_r či var_dump tak, jak byl zvyklý.
Výpis jednoduché proměnné
Latte
Výpis obyčejné proměnné, např. stringu, čísla apod., lze udělat jednoduše přes naplnění proměnné do templaty (šablony). V presenteru se proměnná naplní např. kódem:
$this->template->jmeno = 'Petr';
a v šabloně se nechá vypsat např. kódem:
{$jmeno}
Příkaz echo přímo v šabloně .latte
Tutéž proměnnou naplněnou v presenteru kódem:
$this->template->jmeno = 'Petr';
lze v šabloně vypsat pomocí příkazu echo
:
<?php echo $jmeno ?>
viz dokumentace k nette ohledně šablon.
Výpis pole array()
Pokud se do proměnné presenteru pokusíme uložit pole např. kódem:
$this->template->jmeno = array('Petr', 'Zdeněk');
předchozí postup nám přestane fungovat a ozve se laděnka s hláškou Array to string conversion.
Příkaz print_r či var_dump přímo v šabloně .latte
Stejně, jako lze použít příkaz echo
přímo v šabloně, tak lze použít i příkaz print_r
či var_dump
. Např. v presenteru si naplníme pole:
$arr = array( 'Europe' => array( 'CZ' => 'Česká Republika', 'SK' => 'Slovensko', 'GB' => 'Velká Británie', ), 'CA' => 'Kanada', 'US' => 'USA', '?' => 'jiná', ); $this->template->arr = $arr;
a v šabloně vypíšeme pole přes klasiku
<?php print_r($arr); ?>
Výpis pak bude vypadat následovně v případě použití print_r:
Array ( [Europe] => Array ( [CZ] => Česká Republika [SK] => Slovensko [GB] => Velká Británie ) [CA] => Kanada [US] => USA [?] => jiná )
Pokud použijeme v šabloně výpis pomocí var_dump
<?php var_dump($arr); ?>
výpis pak bude vypadat takto:
array(4) { ["Europe"]=> array(3) { ["CZ"]=> string(17) "Česká Republika" ["SK"]=> string(9) "Slovensko" ["GB"]=> string(16) "Velká Británie" } ["CA"]=> string(6) "Kanada" ["US"]=> string(3) "USA" ["?"]=> string(5) "jiná" }
V obou případech chybí vhodné naformátování výstupu. Tento problém řeší debugger, zabudovaný v nette.
Dump proměnných přes debugger – NEJLEPŠÍ
Dump proměnných elegantně řeší Debugger. V presenteru se uvede např. kód:
$arr = array( 'Europe' => array( 'CZ' => 'Česká Republika', 'SK' => 'Slovensko', 'GB' => 'Velká Británie', ), 'CA' => 'Kanada', 'US' => 'USA', '?' => 'jiná', ); Nette\Diagnostics\Debugger::dump($arr);
a výstup je zrhuba následující:
array (4) Europe => array (3) CZ => "Česká Republika" (17) SK => "Slovensko" (9) GB => "Velká Británie" (16) CA => "Kanada" (6) US => "USA" (3) "?" => "jiná" (5)
Do samotné šablony se nic nepíše.
Dumpování proměnných {dump}
Proměnné by měly jít také vypsat přes šablonu pomocí makra {dump}
viz Dumpování proměnných {dump}. Nicméně, toto makro mi nějak ve verzi nette 2.2.1 nefungovalo.
Vypsání proměnné v laděnce?
Bohužel můžeme se setkat se situací, že nám vyběhne laděnka, či nefunguje vypsání proměnné pomocí zmiňovaného
Nette\Diagnostics\Debugger::dump($values);
Při pokusu o přímé echo či o výpis přes debagger se nám může z důvodu bufrování výstupu vyhodit hláška laděnky:
User Notice
Possible problem: you are sending a HTTP header while already having some data in output buffer. Try OutputDebugger or start session earlier.
a my s tím nic moc nenaděláme. Zrušit bafrování výstupu se mi nepodařilo.
K této situaci dojde např. při pokusu o ladění ve funkci validateMyForm($form)
při validaci celého formuláře či v jiných situacích. Přímé napojení na templatu, kde bychom si proměnnou nechali vypsat, nám zde chybí. Pokud pracujeme přitom s lokálními proměnnými v metodě objektu, tak tyto lokální proměnné nemusí být vždy vidět v laděnce mezi Variables či Nette Application.
Napadly mne pouze dvě možnosti, jak proměnné dočasně vypsat.
Z lokální proměnné dané metody si udělat proměnnou třídy presenteru či jiné třídy. K proměnné trídy lze přistupovat přes
$this->mojePromenna = //... naplním si zde proměnnou ...
Takovouto proměnnou nám laděnka zobrazí v oddílu Nette Application.
Další možností je si proměnnou nechat vyhodit ve formě hlášky flashMessage např.
$this->flashMessage('Moje proměnná: ' . $mojePromenna);
Proměnná se nám vypíše formou hlášky po přesměrování na patřičnou html stránku.
Ještě lepší řešení, např. v případě zpracovávání formuláře, by byl výpis přes
$form->addError('Moje proměnná: ' . $mojePromenna);
Takto ani nedojde ke zpracování formuláře.
Možná to jde i nějak elegantněji, ale zatím nevím, jak to dělat jinak… Občas mám chuť se vrátit, ke starému surovému dobrému PHP a MySQL, když spoustu času laboruji vůbec nad tím, jak si vypsat obsah nějaké proměnné kvůli ladění a standardní příkaz echo nefunguje!