K argumentom vlastného makra sa nedá pristupovať cez indexy poľa %node.array

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

Ahoj, vytváram si vlastné makro s dvoma parametrami, ale nedarí sa mi získať argumenty samostatne. Tu je makro:

{loader "ajax-loader-2", "great"}

Kód makra:

public static function install(\Nette\Latte\Compiler $compiler)
    {
        $set = new static($compiler);
        $set->addMacro('loader', array($set, 'loaderMacro'));
    }

    public function loaderMacro(MacroNode $node, PhpWriter $writer)
    {
    	return $writer->write('echo \'<span class=\' . %node.array[0] . \' style=\' . %node.array[1] . \'></span>\'');
    }

Problém je ten, že sa nedá pristupovať k jednotlivým argumentom, teda položkám poľa %node.array. Vyhadzuje mi chybu „Undefined offset“. Keď si však dumpnem celé pole, tak to tie prvky vypíše so správnymi indexami. Zaujímavé je, že iteráciou pomocou foreach to funguje. Skúšal som už aj skopírovanie poľa, asociatívne indexy a nič, priamy prístup nejde.

SparkCZ
Člen | 22
+
0
-

Co takhle?

return $writer->write('$array = %node.array;echo \'<span class=\' . $array[0] . \' style=\' . $array[1] . \'></span>\'');
Filip Procházka
Moderator | 4668
+
0
-

Když píšeš vlastní makro, nikdy nezapomínej escapovat výstup

return $writer->write(
	'$_something = %node.array;' .
	'?><span class="<?php echo %escape($_something[0]) ?>" ' .
		'style="<?php echo %escape($_something[1]) ?>"></span><?php'
);
sabrx
Člen | 47
+
0
-

SparkCZ napsal(a):

Co takhle?

return $writer->write('$array = %node.array;echo \'<span class=\' . $array[0] . \' style=\' . $array[1] . \'></span>\'');

Skúšal som, to tiež nefungovalo, dokonca som skúšal ArrayObject a nakopírovať pole vo foreach, a tiež nič, pritom ale pole sa vždy zaplnilo, ale nešlo priamo pristupovať k prvkom, len cez foreach.

sabrx
Člen | 47
+
0
-

Filip Procházka napsal(a):

Když píšeš vlastní makro, nikdy nezapomínej escapovat výstup

return $writer->write(
	'$_something = %node.array;' .
	'?><span class="<?php echo %escape($_something[0]) ?>" ' .
		'style="<?php echo %escape($_something[1]) ?>"></span><?php'
);

Predané argumenty nie sú užívateľský vstup, ale už vopred známe vstupy (napr. ajax-loader-1, float:left atd.) aj v takom prípade to mám escapovať?

Filip Procházka
Moderator | 4668
+
0
-

Naprosto vždycky bys měl escapovat, i vlastní vstupy.

Nette automaticky rozpoznává když mu do proměnné, kterou má vypsat, přijde instance Nette\Utils\Html. Díky ní můžeš pak vkládat kusy HTML do stránky i když máš proměnné escapované.

Opravdu vždy escapuj.