Template::registerFilter() is deprecated (z nette 2.0.1 na 2.2.7)
- neznamy_uzivatel
- Člen | 115
Zdravím,
v nette 2.0.1 jsem používal toto:
public function templatePrepareFilters($template) {
$latte = new Nette\Latte\Engine;
$macroSet = new Nette\Latte\Macros\MacroSet($latte->compiler());
$macroSet->addMacro(
'makro1',
'echo $presenter->funkceMakro1(%node.args)'
);
$macroSet->addMacro(
'makro2',
'echo $presenter->funkceMakro2(%node.args)'
);
$template->registerFilter($latte);
}
Chtěl bych přejít na 2.2.7, tam mi ale na
$template->registerFilter($latte);
vyhazuje deprecated.
Nějaké snadné rychlé řešení bez nutnosti tvořit další
hromady kódu?
Našel jsem např.: https://forum.nette.org/…ring-filters
, ale abych řekl pravdu, vůbec tomu nerozumím..
Další je toto: https://forum.nette.org/…-v-nette-2-2
, to už je pochopitelnější, ale stejně si nejsem jistý, jestli je to
přesně to co hledám a hlavně jestli by to nešlo udělat mnohem
jednodušeji?
díky
- David Matějka
- Moderator | 6445
Jako $template
ti prijde Nette\Bridges\ApplicationLatte\Template,
z toho pomoci getLatte
ziskas Latte\Engine a
tam jen pridas
makro, nebo ziskas
compiler, ktery predas macro setu
registerFilter
z predchozich verzi prestal existovat…
- neznamy_uzivatel
- Člen | 115
Diky za nasmerovani :)
Bohuzel samotne makro uz musi byt objekt (implements latte/imacro ??)
Skoda ze tam nejde dat normalne callback na funkci v presenteru… S tim se
jeste potrapim :(
- David Matějka
- Moderator | 6445
prave to zastresuje onen MacroSet (ktery IMacro implementuje)… takze vytvor MacroSet a predej mu compiler
- David Grudl
- Nette Core | 8282
Nějak takto tipuju
public function templatePrepareFilters($template) {
$latte = $template->getLatte();
$macroSet = new Nette\Latte\Macros\MacroSet($latte->compiler());
$macroSet->addMacro(
'makro1',
'echo $presenter->funkceMakro1(%node.args)'
);
$macroSet->addMacro(
'makro2',
'echo $presenter->funkceMakro2(%node.args)'
);
//$template->registerFilter($latte);
}
- neznamy_uzivatel
- Člen | 115
:) super. Tak hlavne ze uz jsem to prepsal :D
Takze v basePresenter.php mam
public function templatePrepareFilters($template) {
\LatteMacros::install($template->getLatte()->getCompiler());
}
a LatteMacros:
class LatteMacros extends Latte\Macros\MacroSet {
/** @var Nette\Database\Context @inject */
public $database;
public static function install(\Latte\Compiler $compiler) {
$me = new static($compiler);
$me->addMacro('LepsiCena', array($me, 'macroLepsiCena'));
}
public function macroLepsiCena(Latte\MacroNode $node, Latte\PhpWriter $writer) {
var_dump($node->args);
die();
}
Ted jeste dotaz k tomu $node->args
Volam to v sablone jako {lepsicena $item->price}
V te promenne $item->price je treba 150. Ale $node->args mi nevrati
ocekavany int 150, ale string ‚$item->price‘
- David Matějka
- Moderator | 6445
@neznamy_uzivatel to je spravne. Ta makra se volaji behem kompilace a hodnota promenne neni znama. Tvym ukolem je v tom makru vytvorit PHP kod, ktery onu hodnotu zpracuje v runtime
- neznamy_uzivatel
- Člen | 115
Uz tedy chapu, diky :)
Nicmene tim zpusobem jak pise David Grundl mi to vraci v pohode tu int hodnotu a ne nazev promenne ve stringu. Ale to je uz jedno, MacroSet se mi libi trochu vic, takze jdu do toho :)
- David Matějka
- Moderator | 6445
@neznamy_uzivatel to, co pise David, je „inline“ verze. fci addMacro muzes bud predat tuto inline verzi, nebo callback (jako to delas ty). Ekvivalentni zpracovani v tom callbacku by pak bylo
public function macroLepsiCena(Latte\MacroNode $node, Latte\PhpWriter $writer) {
return $writer->write('echo $presenter->funkceMakro1(%node.args)');
}