Přeskočit obsah
V
Pro vývojáře
Architektura, konvence, jádro systému a bezpečnost
UI vrstva / Šablony Latte

Š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#

  1. Zjisti, jestli patří do existujícího rozšíření. Formátování ceny do PriceLatteExtension, práce s textem do StringLatteExtension.
  2. Když ne, založ nové rozšíření v app/Core/Latte/Extensions/, extends Latte\Extension, a implementuj getFilters() / getFunctions() / getTests().
  3. Do konfigurace nic nepiš. Rozšíření se samo najde: LatteExtensionsCompiler prochází robotloaderem složky Extensions/ a Macros/, zaregistruje každou instanciovatelnou třídu dědící z Latte\Extension a navěsí ji na LatteFactory.
  4. Logiku dej do helperu, ne do těla uzávěry — filtr má být jednořádkové přesměrování.
  5. 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.

{snippetArea linksSnippetArea}
    {snippet linksSnippet}
    {/snippet}
{/snippetArea}
$this->redrawControl('linksSnippet');

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