Makro nemůže mít počáteční a atributouvou část najednou
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- jtousek
- Člen | 951
Když se podívám na API Nette\Latte\Macros\MacroSet::addMacro(), má tato metoda 4 parametry. Pokud je makro použito jako atribut, tj. n:macro, mají jednotlivé parametry tento význam:
- $name – název makra
- $begin – kód vložený před HTML tag (např. if)
- $end – kód vložený za HTML tag (např. endif)
- $attr – kód vložený dovnitř HTML tagu (generování atributů)
Problém nastal když jsem napsal makro obsahující všechny tyto části:
/**
* @static
* @param Nette\Latte\Compiler $compiler
*/
public static function install(Compiler $compiler)
{
$me->addMacro('shref', array($me, 'macroSecuredLinkStart'), 'endif', array($me, 'macroSecuredLinkAttr'));
}
public function macroSecuredLinkStart(\Nette\Latte\MacroNode $node, \Nette\Latte\PhpWriter $writer)
{
return $writer->write('$_link = $_control->link(%node.word, %node.array?); if ($_presenter->isLinkAvailable()):');
}
public function macroSecuredLinkAttr(\Nette\Latte\MacroNode $node, \Nette\Latte\PhpWriter $writer)
{
return $writer->write(' ?> href="<?php echo %escape(%modify($_link)) ?>"<?php ');
}
Bohužel pokud je definovaná atributová část a makro je použito v n:macro formě, počáteční a koncová se vynechají. Problém je v této funkci, makro by totiž potřebovalo jak if tak else větev.
Zkusil jsem druhou část vybalit z toho else
, aby se
prováděla vždy. Po spuštění testů jsem ale zjistil, že některá makra
toto chování naopak vyžadují, např. makro
{input}
.
Je možné přidat i podporu pro možnost kterou potřebuji? Má smysl abych připravil pull request?