{linkBase} přináší konzistenci do odkazování
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:defaultProducts:Overview:→Admin:Products:Overview:defaultUsers:list→Admin: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í.
Komentáře
Existuje obdoba
absoluteUrli pro{link}? Napriklad v google structured json data je treba mit odkazy v absolutni podobe a nemuzu tedy pouzit{link :Home:home}ale musim si odkaz predpripravit v presenteru jako$jsonUrl = $this-publicUrl . $this->link(':Home:home');#1 Blujacker Stačí přidat //, takže takto {link //:Home:home}.
Více v https://doc.nette.org/…eating-links#….
#2 froggy Dekuji, zase jsem o neco moudrejsi!
Chcete-li odeslat komentář, přihlaste se