Šablony Latte#
Tahle kapitola je o PHP straně šablon: co si systém do Latte přidal, jak napsat vlastní filtr a jak spolu drží snippety a signály.
Kam patří co
Jak se šablona dělí na soubory, jak si systém vybere layout a co do šablony přiteče z presenteru — to je v sekci pro kodéry: Dělení šablony na Latte soubory. Tady je jen to, co potřebuje programátor, který do šablon něco přidává z PHP.
Vlastní rozšíření#
app/Core/Latte/Extensions/ — devět rozšíření, každé přidává filtry, funkce nebo
testy:
| Rozšíření | Co přidává |
|---|---|
Url |
práce s adresami |
Date |
formátování data a času |
Price |
formátování ceny podle měny |
Email, Phone |
formátování kontaktů |
String |
textové úpravy (např. nahrazení zakázaných slov) |
FormPair |
vykreslení dvojice popisek–pole |
SafeLink |
funkce safeLink() — odkaz, který nespadne na chybějícím cíli |
Theme |
themeAsset(), themeUrl(), test isTheme() |
K tomu tři makra v app/Core/Latte/Macros/: MultiControlMacros, SafeLinkMacro
a ThemeMacro.
Postup: přidávám vlastní filtr#
- Zjisti, jestli patří do existujícího rozšíření. Formátování ceny do
PriceLatteExtension, práce s textem doStringLatteExtension. - Když ne, založ nové rozšíření v
app/Core/Latte/Extensions/,extends Latte\Extension, a implementujgetFilters()/getFunctions()/getTests(). - Do konfigurace nic nepiš. Rozšíření se samo najde:
LatteExtensionsCompilerprochází robotloaderem složkyExtensions/aMacros/, zaregistruje každou instanciovatelnou třídu dědící zLatte\Extensiona navěsí ji naLatteFactory. - Logiku dej do helperu, ne do těla uzávěry — filtr má být jednořádkové přesměrování.
- Ověř v obou sekcích, pokud má filtr fungovat na frontu i v administraci.
Formátování patří do filtru, ne do šablony
Podmínka na měnu uprostřed šablony se za rok objeví na patnácti místech — a na čtrnácti z nich se zapomene opravit.
Nové rozšíření se projeví až po smazání cache kontejneru
Registrace běží při sestavení DI kontejneru. Dokud se nesmaže temp/cache, filtr
v šabloně neexistuje a Latte hlásí neznámý filtr — což vypadá jako překlep
v názvu.
Snippety a jejich PHP protějšek#
Jméno snippetu je zároveň argument redrawControl(). Konvence:
krátké lowerCamelCase jméno, Wrapper zkrácené na Wrap, obalová oblast se jmenuje
jako vnitřní snippet plus Area.
Název snippetu musí být LITERÁL
Jméno složené z proměnné se nezaregistruje a redrawControl() pak tiše nic
neudělá. Nevypíše se chyba — stránka se jen nepřekreslí.
AJAX překreslí jen VNITŘEK snippetu
Atributy elementu, který snippet nese, zůstanou staré — třída i data- atribut.
Když má překreslení změnit stav vyjádřený třídou, musí být ta třída uvnitř.
{var} uvnitř {snippet} má vlastní rozsah
Proměnná definovaná vně snippetu v něm po překreslení nemusí existovat — při AJAX překreslení se totiž vykresluje jen ten snippet, ne celá šablona kolem.
Překreslovat naslepo se nemá
redrawControl() bez argumentu překreslí všechno. Cíl vždycky pojmenuj — jinak se
do odpovědi dostanou i snippety, které se mezitím změnily z jiného důvodu.
Podrobně Komponenty a Konvence kódu.
Překlady v šabloně#
Tři různá chování podle toho, kde jste — Front presenter potřebuje
{translator $translatorDomain}, Admin presenter a komponenty ne. Je to nejčastější
zdroj „proč se to nepřeložilo“ a má vlastní kapitolu: Překlady.
Chybějící překlad v routě může shodit celou jazykovou verzi
Ne prázdné místo — chybu stránky. Týká se to textů, ze kterých se skládá adresa, ne popisků. Podrobně Překlady, oddíl o databázové vrstvě.
Vyhrazené názvy proměnných#
Některá jména jsou obsazená šablonovým systémem
$form, $flashes, $control, $presenter, $lang, $locale, $theme
a další. Přepsání se neprojeví chybou, ale podivným chováním — typicky tím, že
přestane fungovat něco úplně jiného na téže stránce.
Ladicí režim a AJAX#
Zastaralé volání v ladicím režimu rozbije AJAX odpověď
Tracy přidá do odpovědi výpis, který rozbije JSON. Projeví se to jako „AJAX nefunguje" — bez varování a bez chyby v konzoli, protože odpověď se prostě nedá naparsovat.
Kam sáhnout#
| Chci | Kde |
|---|---|
| rozšíření a jejich filtry | app/Core/Latte/Extensions/ |
| makra | app/Core/Latte/Macros/ |
| automatickou registraci | app/Core/DI/LatteExtensionsCompiler.php |
| nastavení engine | config/Shared/latte.neon |
| strukturu šablon a layoutů | Dělení šablony na Latte soubory |
Navazující kapitoly: Komponenty · Formuláře · Překlady · Témata frontendu