Jak zavést filtry v latte: 2.9?

Alsatian
Člen | 164
+
0
-

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 | 16
+
+1
-

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 | 472
+
+2
-

@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.

Alsatian
Člen | 164
+
0
-

No vy jste úžasní, moc děkuji. A do konfiguračního souboru, jako jsem to měl původně, to umístit tedy nemám? :)