Vytváření vlastních filtrů
Filtry jsou výkonné nástroje pro formátování a úpravu dat přímo v šablonách Latte. Nabízejí čistou
syntaxi pomocí symbolu roury (|
) pro transformaci proměnných nebo výsledků výrazů do požadovaného
výstupního formátu.
Co jsou filtry?
Filtry v Latte jsou v podstatě PHP funkce navržené speciálně pro transformaci vstupní hodnoty na výstupní
hodnotu. Aplikují se pomocí zápisu s rourou (|
) uvnitř výrazů šablony ({...}
).
Pohodlnost: Filtry vám umožňují zapouzdřit běžné úlohy formátování (jako formátování datumů, změna velikosti písmen, zkracování) nebo manipulace s daty do znovupoužitelných jednotek. Místo opakování složitého PHP kódu ve vašich šablonách můžete jednoduše aplikovat filtr:
Čitelnost: Používání filtrů činí šablony přehlednějšími a více zaměřenými na prezentaci, protože transformační logika je přesunuta do definice filtru.
Kontextová citlivost: Klíčovou předností filtrů v Latte je jejich schopnost být kontextově citlivé. To znamená, že filtr může rozpoznat typ obsahu, se kterým pracuje (HTML, JavaScript, prostý text atd.), a aplikovat odpovídající logiku nebo escapování, což je zásadní pro bezpečnost a správnost, zejména při generování HTML.
Integrace s aplikační logikou: Stejně jako vlastní funkce může být PHP callable za filtrem uzávěr (closure), statická metoda nebo metoda instance. To umožňuje filtrům přistupovat k aplikačním službám nebo datům, pokud je to potřeba, i když jejich hlavním účelem zůstává transformace vstupní hodnoty.
Latte ve výchozím nastavení poskytuje bohatou sadu standardních filtrů. Vlastní filtry vám umožňují rozšířit tuto sadu o formátování a transformace specifické pro váš projekt.
Pokud potřebujete provádět logiku založenou na více vstupech nebo nemáte primární hodnotu k transformaci, je pravděpodobně vhodnější použít vlastní funkci. Pokud potřebujete generovat složitý markup nebo řídit tok šablony, zvažte vlastní tag.
Vytváření a registrace filtrů
Existuje několik způsobů, jak definovat a registrovat vlastní filtry v Latte.
Přímá registrace pomocí addFilter()
Nejjednodušší způsob, jak přidat filtr, je použití metody addFilter()
přímo na objektu
Latte\Engine
. Zadáte název filtru (jak bude použit v šabloně) a odpovídající PHP callable.
Použití v šabloně:
Předávání argumentů:
Hodnota nalevo od roury (|
) je vždy předána jako první argument funkci filtru. Jakékoliv parametry
uvedené za dvojtečkou (:
) v šabloně jsou předány jako následující argumenty.
Registrace pomocí rozšíření
Pro lepší organizaci, zejména při vytváření znovupoužitelných sad filtrů nebo jejich sdílení jako balíčky, je doporučeným způsobem registrovat je v rámci rozšíření Latte:
Tento přístup udrží logiku vašeho filtru zapouzdřenou a registraci jednoduchou.
Použití načítače filtrů
Latte umožňuje registrovat načítač filtrů pomocí addFilterLoader()
. Jde o jediné volatelné callable,
které Latte požádá o jakýkoliv neznámý název filtru během kompilace. Načítač vrací PHP callable filtru nebo
null
.
Tato metoda byla primárně určena pro líné načítání filtrů s velmi náročnou inicializací. Avšak moderní praktiky vkládání závislostí (dependency injection) obvykle zvládají líné služby efektivněji.
Načítače filtrů přidávají složitost a obecně se nedoporučují ve prospěch přímé registrace pomocí
addFilter()
nebo v rámci rozšíření pomocí getFilters()
. Používejte načítače pouze pokud
máte závažný, specifický důvod související s výkonnostními problémy při inicializaci filtrů, které nelze
řešit jinak.
Filtry používající třídu s atributy
Další elegantní způsob, jak definovat filtry, je použití metod ve vaší třídě parametrů šablony. Stačí přidat atribut
#[Latte\Attributes\TemplateFilter]
k metodě.
Latte automaticky rozpozná a zaregistruje metody označené tímto atributem, když je objekt TemplateParameters
předán do šablony. Název filtru v šabloně bude stejný jako název metody (shortify
v tomto případě).
Kontextové filtry
Někdy filtr potřebuje více informací než jen vstupní hodnotu. Může potřebovat znát typ obsahu řetězce, se kterým pracuje (např. HTML, JavaScript, prostý text) nebo ho dokonce upravit. To je situace pro kontextové filtry.
Kontextový filtr je definován stejně jako běžný filtr, ale jeho první parametr musí být typově označen jako
Latte\Runtime\FilterInfo
. Latte automaticky rozpozná tento podpis a při volání filtru předá objekt
FilterInfo
. Následující parametry obdrží argumenty filtru jako obvykle.
$info->contentType
je řetězcová konstanta z Latte\ContentType
(např.
ContentType::Html
, ContentType::Text
, ContentType::JavaScript
, atd.) nebo
null
, pokud je filtr aplikován na proměnnou ({$var|filter}
). Můžete tuto hodnotu číst,
abyste zkontrolovali vstupní kontext, a zapisovat do ní, abyste deklarovali typ výstupního kontextu.
Nastavením typu obsahu na HTML sdělujete Latte, že řetězec vrácený vaším filtrem je bezpečné HTML. Latte pak na tento výsledek nebude aplikovat své výchozí automatické escapování. To je zásadní, pokud váš filtr generuje HTML markup.
Pokud váš filtr generuje HTML, jste zodpovědní za správné escapování jakýchkoliv vstupních dat
použitých v tomto HTML (jako v případě volání htmlspecialchars($formatted)
výše). Opomenutí může
vytvořit XSS zranitelnosti. Pokud váš filtr vrací pouze prostý text, nemusíte nastavovat
$info->contentType
.
Filtry na blocích
Všechny filtry aplikované na bloky musí být kontextové. Je to proto, že obsah bloku má definovaný typ obsahu (obvykle HTML), kterého si filtr musí být vědom.
Kontextové filtry poskytují silnou kontrolu nad tím, jak jsou data zpracovávána na základě jejich kontextu, umožňují pokročilé funkce a zajišťují správné chování escapování, zejména při generování HTML obsahu.