{linkBase} přináší konzistenci do odkazování

před 6 hodinami od David Grudl  

Jednou z nejcennějších vlastností Nette Application je flexibilní adresářová struktura, která se plynule přizpůsobuje rostoucím potřebám projektu. Představte si, že vytváříte e-shop. Začnete s frontendem a administrací, každý má své presentery. Postupně se ale aplikace rozrůstá – třeba původně jednoduchý OrderPresenter se časem promění v celý modul objednávek s presentery OrderDetail, OrderEdit, OrderDispatch a dalšími. Díky flexibilní struktuře tuto reorganizaci uděláte velmi snadno a elegantně.

Právě tato flexibilita ale může přinést jednu vývojářskou výzvu: co když jeden layout začnou najednou používat presentery, které jsou „různě hluboko“ v adresářové struktuře?

Například máme @layout.latte pro administraci, ve kterém chceme mít navigaci s odkazy na různé sekce:

<nav>
    <a n:href="Dashboard:">Dashboard</a>
    <a n:href="Products:Overview:">Produkty</a>
    <a n:href="Users:list">Uživatelé</a>
</nav>

Když tento layout použije presenter Admin:Dashboard, odkazy povedou správně na Admin:Dashboard:default, Admin:Users:list atd. Ale co když stejný layout použije presenter Admin:Products:Detail? Relativní odkazy se najednou budou odvíjet od něj a povedou na neexistující cíle (např. Admin:Products:Dashboard:default).

Dosud se to řešilo psaním všech odkazů absolutně (případně používání aliasů):

{* Všechno absolutně *}
<nav>
    <a n:href=":Admin:Dashboard:">Dashboard</a>
    <a n:href=":Admin:Products:Overview:">Produkty</a>
    <a n:href=":Admin:Users:list">Uživatelé</a>
</nav>

Funguje to, ale má to své nevýhody. Zejména pokud se později rozhodnete modul přesunout jinam nebo přejmenovat.

Řešením je {linkBase}

Nette Application 3.2.7 přináší elegantní řešení v podobě nové Latte značky {linkBase}. Definuje základ, od kterého se budou odvíjet všechny relativní odkazy v šabloně.

{linkBase Admin}

<nav>
    <a n:href="Dashboard:">Dashboard</a>
    <a n:href="Products:Overview:">Produkty</a>
    <a n:href="Users:list">Uživatelé</a>
</nav>

Teď už je úplně jedno, odkud layout voláte. Všechny relativní odkazy se budou odvíjet od Admin modulu:

  • Dashboard:Admin:Dashboard:default
  • Products:Overview:Admin:Products:Overview:default
  • Users:listAdmin:Users:list

{linkBase} ovlivňuje pouze relativní odkazy – ty, které nezačínají dvojtečkou. Absolutní odkazy (:Admin:Dashboard) a odkazy na aktuální presenter (this, show) zůstávají beze změny.

Značka platí pro celou šablonu a funguje se všemi způsoby vytváření odkazů: {link}, {plink}, n:href.

Bonus: filtr |absoluteUrl

Nette Application 3.2.7 přináší ještě jeden užitečný doplněk – Latte filtr |absoluteUrl. Ten normalizuje URL do absolutní podoby, což se hodí tam, kde potřebujete zaručeně absolutní adresu:

<meta property="og:image" content={$imagePath|absoluteUrl}>

Aktualizujte na Nette Application 3.2.7 a napište, jak se vám novinky líbí.

David Grudl Programátor, blogger a AI evangelista. Vytvořil Nette Framework používaný statisíci webů. Píše na Uměligence o umělé inteligenci a phpFashion o webovém vývoji. Každý týden moderuje Tech Guys a učí lidi pracovat s ChatGPT a dalšími AI nástroji. Fascinují ho technologie, které mění náš svět, a rád je přibližuje široké veřejnosti.