URL linkek létrehozása
Linkek létrehozása a Nette-ben egyszerű, mint az ujjal mutogatás. Csak rá kell mutatni, és a keretrendszer elvégzi az összes munkát Ön helyett. Megmutatjuk:
- hogyan hozzunk létre linkeket sablonokban és máshol
- hogyan különböztessük meg az aktuális oldalra mutató linket
- mit tegyünk az érvénytelen linkekkel
Az kétirányú routingnak köszönhetően soha nem kell majd keményen beírnia az alkalmazás URL-címeit a sablonokba vagy a kódba, amelyek később megváltozhatnak, vagy bonyolultan összeállítani őket. A linkben elegendő megadni a presentert és az akciót, átadni az esetleges paramétereket, és a keretrendszer maga generálja az URL-t. Valójában nagyon hasonlít egy függvényhívásra. Ez tetszeni fog Önnek.
A presenter sablonjában
Leggyakrabban sablonokban hozunk létre linkeket, és nagyszerű segítő az n:href
attribútum:
<a n:href="Product:show">részletek</a>
Figyelje meg, hogy a HTML href
attribútum helyett az n:attribútumot n:href
használtuk. Ennek értéke nem
URL, ahogy az href
attribútum esetében lenne, hanem a presenter és az akció neve.
Egy linkre kattintás, leegyszerűsítve, olyan, mintha a ProductPresenter::renderShow()
metódust hívnánk meg.
És ha annak szignatúrájában paraméterek vannak, argumentumokkal hívhatjuk meg:
<a n:href="Product:show $product->id, $product->slug">termék részletei</a>
Lehetőség van elnevezett paraméterek átadására is. A következő link a lang
paramétert adja át
cs
értékkel:
<a n:href="Product:show $product->id, lang: cs">termék részletei</a>
Ha a ProductPresenter::renderShow()
metódusnak nincs $lang
a szignatúrájában, a paraméter
értékét a $lang = $this->getParameter('lang')
segítségével vagy a property-ből tudhatja meg.
Ha a paraméterek tömbben vannak tárolva, kibonthatók a ...
operátorral (Latte 2.x-ben az
(expand)
operátorral):
{var $args = [$product->id, lang => cs]}
<a n:href="Product:show ...$args">termék részletei</a>
A linkekben automatikusan átadódnak az ún. perzisztens paraméterek is.
Az n:href
attribútum nagyon praktikus a HTML <a>
tag-ekhez. Ha máshol szeretnénk kiírni a
linket, például szövegben, használjuk a {link}
-et:
A cím: {link Home:default}
A kódban
Link létrehozásához a presenterben a link()
metódus szolgál:
$url = $this->link('Product:show', $product->id);
A paramétereket tömb segítségével is át lehet adni, ahol elnevezett paramétereket is meg lehet adni:
$url = $this->link('Product:show', [$product->id, 'lang' => 'cs']);
Linkeket presenter nélkül is lehet létrehozni, erre való a LinkGenerator és annak
link()
metódusa.
Linkek presenterhez
Ha a link célja egy presenter és egy akció, akkor a szintaxisa a következő:
[//] [[[[:]module:]presenter:]action | this] [#fragment]
A formátumot minden Latte tag és minden presenter metódus támogatja, amely linkekkel dolgozik, tehát n:href
,
{link}
, {plink}
, link()
, lazyLink()
, isLinkCurrent()
,
redirect()
, redirectPermanent()
, forward()
, canonicalize()
és a LinkGenerator is. Tehát még ha a példákban n:href
szerepel is, bármelyik
függvény lehetne ott.
Az alapforma tehát Presenter:action
:
<a n:href="Home:default">kezdőlap</a>
Ha az aktuális presenter akciójára hivatkozunk, kihagyhatjuk a nevét:
<a n:href="default">kezdőlap</a>
Ha a cél a default
akció, kihagyhatjuk, de a kettőspontnak maradnia kell:
<a n:href="Home:">kezdőlap</a>
A linkek más modulokba is
mutathatnak. Itt a linkeket megkülönböztetjük relatívakra egy beágyazott almodulba, vagy abszolútakra. Az elv analóg a
lemezen lévő elérési utakkal, csak perjelek helyett kettőspontok vannak. Tegyük fel, hogy az aktuális presenter a
Front
modul része, akkor így írjuk:
<a n:href="Shop:Product:show">link a Front:Shop:Product:show-ra</a>
<a n:href=":Admin:Product:show">link az Admin:Product:show-ra</a>
Speciális eset a saját magára mutató link, amikor célként a
this
-t adjuk meg.
<a n:href="this">frissítés</a>
Hivatkozhatunk az oldal egy bizonyos részére az ún. fragment segítségével a kettőskereszt #
jel után:
<a n:href="Home:#main">link a Home:default-ra és a #main fragmentre</a>
Abszolút utak
A link()
vagy n:href
segítségével generált linkek mindig abszolút utak (azaz /
jellel kezdődnek), de nem abszolút URL-ek protokollal és domainnel, mint https://domain
.
Abszolút URL generálásához adjon hozzá két perjelet az elejére (pl. n:href="//Home:"
). Vagy átkapcsolhatja
a presentert, hogy csak abszolút linkeket generáljon a $this->absoluteUrls = true
beállításával.
Link az aktuális oldalra
A this
cél linket hoz létre az aktuális oldalra:
<a n:href="this">frissítés</a>
Ugyanakkor átadódnak az összes paraméter, amelyek a action<Action>()
vagy
render<View>()
metódus szignatúrájában szerepelnek, ha az action<Action>()
nincs
definiálva. Tehát ha a Product:show
oldalon vagyunk és id: 123
, a this
-re mutató link
ezt a paramétert is átadja.
Természetesen a paramétereket közvetlenül is meg lehet adni:
<a n:href="this refresh: 1">frissítés</a>
Az isLinkCurrent()
függvény ellenőrzi, hogy a link célja megegyezik-e az aktuális oldallal. Ezt például a
sablonban lehet használni a linkek megkülönböztetésére stb.
A paraméterek ugyanazok, mint a link()
metódusnál, de ezen felül lehetőség van egy konkrét akció helyett
a *
helyettesítő karakter megadására, amely az adott presenter bármely akcióját jelenti.
{if !isLinkCurrent('Admin:login')}
<a n:href="Admin:login">Jelentkezzen be</a>
{/if}
<li n:class="isLinkCurrent('Product:*') ? active">
<a n:href="Product:">...</a>
</li>
Az n:href
-fel kombinálva egy elemen belül használható a rövidített forma:
<a n:class="isLinkCurrent() ? active" n:href="Home:">...</a>
A *
helyettesítő karakter csak az akció helyett használható, a presenter helyett nem.
Annak megállapítására, hogy egy adott modulban vagy annak almoduljában vagyunk-e, használjuk az
isModuleCurrent(moduleName)
metódust.
<li n:class="isModuleCurrent('Forum:Users') ? active">
<a n:href="Product:">...</a>
</li>
Linkek signálhoz
A link célja nemcsak presenter és akció lehet, hanem signál is (ezek a handle<Signal>()
metódust hívják). Ekkor a szintaxis a következő:
[//] [sub-component:]signal! [#fragment]
A signált tehát a felkiáltójel különbözteti meg:
<a n:href="click!">signál</a>
Lehet linket létrehozni egy alkomponens (vagy al-alkomponens) signáljára is:
<a n:href="componentName:click!">signál</a>
Linkek a komponensben
Mivel a komponensek önálló, újrafelhasználható egységek,
amelyeknek nem kellene semmilyen kapcsolatban állniuk a környező presenterekkel, a linkek itt egy kicsit másképp működnek.
A Latte n:href
attribútuma és a {link}
tag, valamint a komponens metódusai, mint a
link()
és mások, a link célját mindig signál névként kezelik. Ezért még a felkiáltójelet sem kell
megadni:
<a n:href="click">signál, nem akció</a>
Ha a komponens sablonjában presenterekre szeretnénk hivatkozni, használjuk a {plink}
taget:
<a href={plink Home:default}>kezdőlap</a>
vagy a kódban
$this->getPresenter()->link('Home:default')
Aliasok
Néha hasznos lehet egy könnyen megjegyezhető aliast rendelni egy Presenter:akció párhoz. Például a
Front:Home:default
kezdőlapot egyszerűen home
-nak nevezni, vagy az
Admin:Dashboard:default
-ot admin
-nak.
Az aliasokat a konfigurációban definiáljuk az
application › aliases
kulcs alatt:
application:
aliases:
home: Front:Home:default
admin: Admin:Dashboard:default
sign: Front:Sign:in
A linkekben ezután a kukac jellel írjuk őket, például:
<a n:href="@admin">adminisztráció</a>
Támogatottak minden olyan metódusban is, amely linkekkel dolgozik, mint a redirect()
és hasonlók.
Érvénytelen linkek
Előfordulhat, hogy érvénytelen linket hozunk létre – vagy azért, mert nem létező presenterhez vezet, vagy azért,
mert több paramétert ad át, mint amennyit a célmetódus a szignatúrájában elfogad, vagy ha a célakcióhoz nem lehet URL-t
generálni. Az érvénytelen linkek kezelését a Presenter::$invalidLinkMode
statikus változó határozza meg. Ez a
következő értékek kombinációját veheti fel (konstansok):
Presenter::InvalidLinkSilent
– csendes mód, URL-ként a # karaktert adja visszaPresenter::InvalidLinkWarning
– E_USER_WARNING figyelmeztetést dob, amely éles módban logolásra kerül, de nem szakítja meg a szkript futásátPresenter::InvalidLinkTextual
– vizuális figyelmeztetés, a hibát közvetlenül a linkbe írjaPresenter::InvalidLinkException
– InvalidLinkException kivételt dob
Az alapértelmezett beállítás InvalidLinkWarning
éles módban és
InvalidLinkWarning | InvalidLinkTextual
fejlesztői módban. Az InvalidLinkWarning
éles környezetben
nem szakítja meg a szkript futását, de a figyelmeztetés logolásra kerül. Fejlesztői környezetben a Tracy elfogja és bluescreen-t jelenít meg. Az InvalidLinkTextual
úgy
működik, hogy URL-ként egy hibaüzenetet ad vissza, amely #error:
karakterekkel kezdődik. Hogy az ilyen linkek
első pillantásra észrevehetők legyenek, adjunk hozzá a CSS-hez:
a[href^="#error:"] {
background: red;
color: white;
}
Ha nem szeretnénk, hogy fejlesztői környezetben figyelmeztetések keletkezzenek, beállíthatjuk a csendes módot közvetlenül a konfigurációban.
application:
silentLinks: true
LinkGenerator
Hogyan hozzunk létre linkeket hasonló kényelemmel, mint a link()
metódus, de presenter jelenléte nélkül?
Erre való a Nette\Application\LinkGenerator.
A LinkGenerator egy szolgáltatás, amelyet a konstruktoron keresztül kérhetünk, majd a link()
metódusával
hozhatunk létre linkeket.
A presenterekkel szemben itt van egy különbség. A LinkGenerator minden linket rögtön abszolút URL-ként hoz létre.
Továbbá nincs “aktuális presenter”, így nem lehet célként csak az akció nevét megadni (link('default')
)
vagy relatív utakat megadni a modulokhoz.
Az érvénytelen linkek mindig Nette\Application\UI\InvalidLinkException
-t dobnak.