K argumentom vlastného makra sa nedá pristupovať cez indexy poľa %node.array
- sabrx
- Člen | 47
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.
- Filip Procházka
- Moderator | 4668
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
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
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
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.