Template::registerFilter() is deprecated (z nette 2.0.1 na 2.2.7)

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

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

Etch
Člen | 403
+
-2
-

Použij addFilter() viz api

David Matějka
Moderator | 6445
+
+2
-

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
+
0
-

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
+
0
-

prave to zastresuje onen MacroSet (ktery IMacro implementuje)… takze vytvor MacroSet a predej mu compiler

David Grudl
Nette Core | 8282
+
0
-

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
+
0
-

:) 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
+
+1
-

@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
+
0
-

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
+
0
-

@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)');
    }