Nette - výpis proměnných

Datum vydání: 2014-07-10 12:14:00

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.

  1. 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.

  2. 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!