Jak zavést filtry v latte: 2.9?
- Alsatian
- Člen | 175
Ahoj. Poprosím o radu, jak správně zavést filtry v latte: 2.9
Po přechodu na novou verzi latte se mi nedaří vlastní filtry zaregistrovat.
Návod jsem použil tento: https://latte.nette.org/…ending-latte
Vytvořil jsem soubor Filters s namespace App a s třídou Filters (podle návodu – respektive jsem upravil svou původní).
Kam přesně mám umístit
$latte->addFilterLoader([new Filters, 'load']);
Mám base presenter, tak jsem to dal tam, konkrétně:
public function beforeRender()
{
parent::beforeRender();
$latte = new \Latte\Engine;
$latte->addFilterLoader([new \App\Filters, 'load']);
...
}
V třídě Filters mám definovaný filtr „sklonuj“, při pokusu vypsat
latte soubor s filtrem dostanu hlášku:
Filter ‚sklonuj‘ is not defined.
Soubor Filters.php vypadá zkráceně takto:
<?php
namespace App;
use Nette\Utils\DateTime;
use Nette\Utils\Strings;
class Filters
{
public function load(string $filter): ?callable
{
if (in_array($filter, get_class_methods($this))) {
return [$this, $filter];
}
return null;
}
public function sklonuj($pocet = 0, $tvar1 = '', $tvar2 = '', $tvar3 = '', $mezera = ' ') {
if ($pocet == 0 || $pocet >= 5) return $pocet . $mezera . $tvar3;
elseif ($pocet == 1) return $pocet . $mezera . $tvar1;
else return $pocet . $mezera . $tvar2;
}
...
}
PS: původně jsem zaváděl filtry hromadně v konfiguračním souboru common.neon, to ale nevím, zda-li lze ještě použít:
latte.latteFactory:
setup:
- addFilter(NULL, [App\Filters, loader])
Předem moc děkuji za nakopnutí :)
Editoval Alsatian (21. 7. 2022 7:28)
- Martin Dřímal
- Člen | 20
Jen tak naslepo střelím :)
Co místo $latte = new \Latte\Engine;
vytáhnout v presenteru už
existující instanci
$latte = $this->template->getLatte(); //
?
- nightfish
- Člen | 517
@Alsatian
public function beforeRender(): void
{
parent::beforeRender();
$this->getTemplate()->getLatte()->addFilterLoader([new \App\Filters, 'load']);
}
Jde o to, že jsi ve svém kódu vytvořil novou instanci Latte enginu, pro který jsi zaregistroval filter loader – avšak tu instanci reálně pro vykreslení šablon nepoužíváš. Nette si vytvoří svou instanci Latte enginu při instanciaci šablony – a této instanci chceš nastavovat filter loader.