Nette Documentation Preview

syntax
URL hivatkozások létrehozása
****************************

<div class=perex>

A linkek létrehozása a Nette-ben olyan egyszerű, mint egy ujjal mutogatni. Csak mutasson rá, és a keretrendszer elvégzi az összes munkát Ön helyett. Megmutatjuk:

- hogyan hozhatunk létre linkeket a sablonokban és máshol
- hogyan lehet megkülönböztetni az aktuális oldalra mutató linket
- mi a helyzet az érvénytelen linkekkel

</div>


A [kétirányú útválasztásnak |routing] köszönhetően soha nem kell a sablonokban vagy a kódban keményen beprogramoznia az alkalmazás URL-címeit, amelyek később megváltozhatnak, vagy bonyolult lehet az összeállításuk. Csak adja meg a bemutatót és az akciót a linkben, adjon át bármilyen paramétert, és a keretrendszer maga generálja az URL-t. Valójában ez nagyon hasonlít egy függvény meghívásához. Tetszeni fog.


A bemutató sablonban .[#toc-in-the-presenter-template]
======================================================

Leggyakrabban a sablonokban hozunk létre linkeket, és ebben nagy segítségünkre van a `n:href` attribútum:

```latte
<a n:href="Product:show">detail</a>
```

Figyeljük meg, hogy a `href` HTML attribútum helyett az [n:attribútumot |latte:syntax#n:attributes] `n:href` használjuk. Ennek értéke nem egy URL, ahogyan azt a `href` attribútummal megszoktuk, hanem a bemutató és a művelet neve.

A linkre kattintás, egyszerűen szólva, olyasmi, mint egy módszer meghívása `ProductPresenter::renderShow()`. És ha a szignatúrájában vannak paraméterek, akkor argumentumokkal is meg tudjuk hívni:

```latte
<a n:href="Product:show $product->id, $product->slug">detail</a>
```

Lehetőség van nevesített paraméterek átadására is. A következő hivatkozás a `lang` paramétert adja át a `en` értékkel:

```latte
<a n:href="Product:show $product->id, lang: en">detail</a>
```

Ha a `ProductPresenter::renderShow()` metódus aláírásában nem szerepel a `$lang`, akkor a paraméter értékét a `$lang = $this->getParameter('lang')` segítségével vagy a [tulajdonságból |presenters#Request Parameters] tudja lekérdezni.

Ha a paraméterek egy tömbben vannak tárolva, akkor a `...` operátorral (vagy a Latte 2.x-ben a `(expand)` operátorral) bővíthetők:

```latte
{var $args = [$product->id, lang => en]}
<a n:href="Product:show ...$args">detail</a>
```

Az úgynevezett [tartós paraméterek |presenters#persistent parameters] is automatikusan átadásra kerülnek a hivatkozásokban.

A `n:href` attribútum nagyon hasznos a HTML címkékhez. `<a>`. Ha a linket máshol, például a szövegben akarjuk kiírni, akkor a `{link}` attribútumot használjuk:

```latte
URL is: {link Home:default}
```


A kódban .[#toc-in-the-code]
============================

A `link()` metódus a bemutatóban egy link létrehozására szolgál:

```php
$url = $this->link('Product:show', $product->id);
```

A paraméterek tömbként is átadhatók, ahol megnevezett paraméterek is megadhatók:

```php
$url = $this->link('Product:show', [$product->id, 'lang' => 'cs']);
```

A linkek prezenter nélkül is létrehozhatók a [LinkGenerator |#LinkGenerator] és annak `link()` metódusa segítségével.


Linkek a bemutatóhoz .[#toc-links-to-presenter]
===============================================

Ha a link célpontja az előadó és a művelet, akkor a következő szintaxissal rendelkezik:

```
[//] [[[[:]module:]presenter:]action | this] [#fragment]
```

A formátumot az összes Latte tag és az összes olyan presenter módszer támogatja, amely linkekkel dolgozik, azaz `n:href`, `{link}`, `{plink}`, `link()`, `lazyLink()`, `isLinkCurrent()`, `redirect()`, `redirectPermanent()`, `forward()`, `canonicalize()` és a [LinkGenerator |#LinkGenerator]. Tehát még ha a példákban a `n:href` is szerepel, bármelyik függvény lehet.

Az alapforma tehát `Presenter:action`:

```latte
<a n:href="Home:default">home</a>
```

Ha az aktuális bemutató akciójára hivatkozunk, elhagyhatjuk a nevét:

```latte
<a n:href="default">home</a>
```

Ha a művelet a `default`, elhagyhatjuk, de a kettőspontnak meg kell maradnia:

```latte
<a n:href="Home:">home</a>
```

A linkek más [modulokra |modules] is mutathatnak. Itt a linkeket megkülönböztetjük az almodulokhoz viszonyított, illetve abszolút linkekre. Az elv analóg a lemezes elérési utakkal, csak a kötőjelek helyett kettőspontok vannak. Tegyük fel, hogy a tényleges bemutató a `Front` modul része, akkor azt írjuk:

```latte
<a n:href="Shop:Product:show">link to Front:Shop:Product:show</a>
<a n:href=":Admin:Product:show">link to Admin:Product:show</a>
```

Speciális eset a [saját magára való hivatkozás |#Links to Current Page]. Itt azt írjuk, hogy `this` a cél.

```latte
<a n:href="this">refresh</a>
```

A HTML oldal egy bizonyos részére a `#` hash szimbólum után egy úgynevezett fragmentummal tudunk hivatkozni:

```latte
<a n:href="Home:#main">link to Home:default and fragment #main</a>
```


Abszolút elérési utak .[#toc-absolute-paths]
============================================

A `link()` vagy `n:href` által generált linkek mindig abszolút elérési utak (azaz `/`-vel kezdődnek), de nem abszolút URL-ek protokollal és domainnel, mint például `https://domain`.

Abszolút URL létrehozásához adjon hozzá két kötőjelet az elejéhez (pl. `n:href="//Home:"`). Vagy a `$this->absoluteUrls = true` beállítással úgy is beállíthatja a prezentert, hogy csak abszolút linkeket generáljon.


Link az aktuális oldalra .[#toc-link-to-current-page]
=====================================================

A cél `this` létrehoz egy linket az aktuális oldalra:

```latte
<a n:href="this">refresh</a>
```

Ugyanakkor az összes paraméter, amelyet a `action<Action>()` vagy a `render<View>()` metódusban megadott paraméterek, ha a `action<Action>()` nincs definiálva, átadásra kerül. Tehát ha a `Product:show` és a `id:123` oldalakon vagyunk, akkor a `this` linkje is átadja ezt a paramétert.

Természetesen lehetőség van a paraméterek közvetlen megadására is:

```latte
<a n:href="this refresh: 1">refresh</a>
```

A `isLinkCurrent()` függvény meghatározza, hogy a link célpontja megegyezik-e az aktuális oldallal. Ez például egy sablonban használható a linkek megkülönböztetésére stb.

A paraméterek ugyanazok, mint a `link()` metódus esetében, de lehetőség van a `*` joker karakter használatára is egy konkrét művelet helyett, ami a bemutató bármely műveletét jelenti.

```latte
{if !isLinkCurrent('Admin:login')}
	<a n:href="Admin:login">Přihlaste se</a>
{/if}

<li n:class="isLinkCurrent('Product:*') ? active">
	<a n:href="Product:">...</a>
</li>
```

A rövidített formát a `n:href` kapcsolattal együtt lehet használni egyetlen elemben:

```latte
<a n:class="isLinkCurrent() ? active" n:href="Product:detail">...</a>
```

A `*` joker karakter csak a prezentáló műveletét helyettesíti, magát a prezentálót nem.

Annak megállapítására, hogy egy adott modulban vagy annak almoduljában vagyunk-e, a `isModuleCurrent(moduleName)` függvényt használhatjuk.

```latte
<li n:class="isModuleCurrent('MyEshop:Users') ? active">
	<a n:href="Product:">...</a>
</li>
```


Linkek a Signalhoz .[#toc-links-to-signal]
==========================================

A link célpontja nem csak a bemutató és az akció lehet, hanem a [jel |components#Signal] is (ők hívják a metódust `handle<Signal>()`). A szintaxis a következő:

```
[//] [sub-component:]signal! [#fragment]
```

A jelzést tehát felkiáltójel különbözteti meg:

```latte
<a n:href="click!">signal</a>
```

Az alkomponens (vagy al-alkomponens) jelére mutató linket is létrehozhat:

```latte
<a n:href="componentName:click!">signal</a>
```


Linkek a komponensben .[#toc-links-in-component]
================================================

Mivel a [komponensek |components] különálló, újrafelhasználható egységek, amelyeknek nem lehet kapcsolatuk a környező bemutatókkal, a hivatkozások egy kicsit másképp működnek. A `n:href` Latte attribútum és a `{link}` címke, valamint az olyan komponensmódszerek, mint a `link()` és mások, mindig a célt tekintik **jelzőnévnek**. Ezért nem szükséges felkiáltójelet használni:

```latte
<a n:href="click">signal, not an action</a>
```

Ha a komponenssablonban előadókra akarunk hivatkozni, akkor a `{plink}` címkét használjuk:

```latte
<a href={plink Home:default}>home</a>
```

vagy a kódban

```php
$this->getPresenter()->link('Home:default')
```


Álnevek .[#toc-aliases]{data-version:v3.2.2}
============================================

Néha hasznos, ha egy könnyen megjegyezhető álnevet rendelünk egy Presenter:action pároshoz. Például a `Front:Home:default` honlapot egyszerűen elnevezheti `home` -nek, vagy a `Admin:Dashboard:default` -t `admin`-nak.

Az aliasok a [konfigurációban |configuration] a `application › aliases` kulcs alatt kerülnek meghatározásra:

```neon
application:
    aliases:
        home: Front:Home:default
        admin: Admin:Dashboard:default
        sign: Front:Sign:in
```

A hivatkozásokban az at szimbólummal íródnak, például:

```latte
<a n:href="@admin">administration</a>
```

A linkekkel dolgozó összes módszer támogatja őket, például a `redirect()` és hasonlók.


Érvénytelen hivatkozások .[#toc-invalid-links]
==============================================

Előfordulhat, hogy érvénytelen linket hozunk létre - vagy azért, mert nem létező bemutatóra hivatkozik, vagy azért, mert több paramétert ad át, mint amennyit a célmódszer az aláírásában kap, vagy amikor nem lehet generált URL a célzott művelethez. Azt, hogy mit tegyünk az érvénytelen linkekkel, a `Presenter::$invalidLinkMode` statikus változó határozza meg. Ez a következő értékek (konstansok) egyikét veheti fel:

- `Presenter::InvalidLinkSilent` - néma üzemmód, URL-ként a `#` szimbólumot adja vissza.
- `Presenter::InvalidLinkWarning` - E_USER_WARNING kerül előállításra.
- `Presenter::InvalidLinkTextual` - vizuális figyelmeztetés, a hiba szövege megjelenik a hivatkozásban.
- `Presenter::InvalidLinkException` - az InvalidLinkException hibaüzenetet kap.

Az alapértelmezett beállítás termelési üzemmódban a `InvalidLinkWarning`, fejlesztési üzemmódban pedig a `InvalidLinkWarning | InvalidLinkTextual`. A `InvalidLinkWarning` nem öli meg a szkriptet a termelési környezetben, de a figyelmeztetés naplózásra kerül. A fejlesztői környezetben a [Tracy |tracy:] elfogja a figyelmeztetést és megjeleníti a hiba bluescreen-t. Ha a `InvalidLinkTextual` van beállítva, a prezenter és a komponensek URL-ként adják vissza a hibaüzenetet, amely a `#error:` csillaggal kezdődik. Ahhoz, hogy az ilyen linkeket láthatóvá tegyük, hozzáadhatunk egy CSS szabályt a stíluslapunkhoz:

```css
a[href^="#error:"] {
	background: red;
	color: white;
}
```

Ha nem akarjuk, hogy a fejlesztői környezetben figyelmeztetések jelenjenek meg, akkor a [konfigurációban |configuration] bekapcsolhatjuk a silent invalid link mode-ot.

```neon
application:
	silentLinks: true
```


LinkGenerator .[#toc-linkgenerator]
===================================

Hogyan hozhatunk létre linkeket a `link()` comfort módszerrel, de prezenter jelenléte nélkül? Ezért itt van a [api:Nette\Application\LinkGenerator].

LinkGenerator egy olyan szolgáltatás, amelyet átadhat a konstruktoron keresztül, majd linkeket hozhat létre a `link()` módszerével.

Van egy különbség a bemutatókhoz képest. A LinkGenerator minden linket abszolút URL-ként hoz létre. Továbbá nincs "aktuális bemutató", így nem lehet csak a `link('default')` művelet nevét vagy a [modulok |modules] relatív elérési útvonalait megadni.

Az érvénytelen linkek mindig dobnak `Nette\Application\UI\InvalidLinkException`.

URL hivatkozások létrehozása

A linkek létrehozása a Nette-ben olyan egyszerű, mint egy ujjal mutogatni. Csak mutasson rá, és a keretrendszer elvégzi az összes munkát Ön helyett. Megmutatjuk:

  • hogyan hozhatunk létre linkeket a sablonokban és máshol
  • hogyan lehet megkülönböztetni az aktuális oldalra mutató linket
  • mi a helyzet az érvénytelen linkekkel

kétirányú útválasztásnak köszönhetően soha nem kell a sablonokban vagy a kódban keményen beprogramoznia az alkalmazás URL-címeit, amelyek később megváltozhatnak, vagy bonyolult lehet az összeállításuk. Csak adja meg a bemutatót és az akciót a linkben, adjon át bármilyen paramétert, és a keretrendszer maga generálja az URL-t. Valójában ez nagyon hasonlít egy függvény meghívásához. Tetszeni fog.

A bemutató sablonban

Leggyakrabban a sablonokban hozunk létre linkeket, és ebben nagy segítségünkre van a n:href attribútum:

<a n:href="Product:show">detail</a>

Figyeljük meg, hogy a href HTML attribútum helyett az n:attribútumot n:href használjuk. Ennek értéke nem egy URL, ahogyan azt a href attribútummal megszoktuk, hanem a bemutató és a művelet neve.

A linkre kattintás, egyszerűen szólva, olyasmi, mint egy módszer meghívása ProductPresenter::renderShow(). És ha a szignatúrájában vannak paraméterek, akkor argumentumokkal is meg tudjuk hívni:

<a n:href="Product:show $product->id, $product->slug">detail</a>

Lehetőség van nevesített paraméterek átadására is. A következő hivatkozás a lang paramétert adja át a en értékkel:

<a n:href="Product:show $product->id, lang: en">detail</a>

Ha a ProductPresenter::renderShow() metódus aláírásában nem szerepel a $lang, akkor a paraméter értékét a $lang = $this->getParameter('lang') segítségével vagy a tulajdonságból tudja lekérdezni.

Ha a paraméterek egy tömbben vannak tárolva, akkor a ... operátorral (vagy a Latte 2.x-ben a (expand) operátorral) bővíthetők:

{var $args = [$product->id, lang => en]}
<a n:href="Product:show ...$args">detail</a>

Az úgynevezett tartós paraméterek is automatikusan átadásra kerülnek a hivatkozásokban.

A n:href attribútum nagyon hasznos a HTML címkékhez. <a>. Ha a linket máshol, például a szövegben akarjuk kiírni, akkor a {link} attribútumot használjuk:

URL is: {link Home:default}

A kódban

A link() metódus a bemutatóban egy link létrehozására szolgál:

$url = $this->link('Product:show', $product->id);

A paraméterek tömbként is átadhatók, ahol megnevezett paraméterek is megadhatók:

$url = $this->link('Product:show', [$product->id, 'lang' => 'cs']);

A linkek prezenter nélkül is létrehozhatók a LinkGenerator és annak link() metódusa segítségével.

Ha a link célpontja az előadó és a művelet, akkor a következő szintaxissal rendelkezik:

[//] [[[[:]module:]presenter:]action | this] [#fragment]

A formátumot az összes Latte tag és az összes olyan presenter módszer támogatja, amely linkekkel dolgozik, azaz n:href, {link}, {plink}, link(), lazyLink(), isLinkCurrent(), redirect(), redirectPermanent(), forward(), canonicalize() és a LinkGenerator. Tehát még ha a példákban a n:href is szerepel, bármelyik függvény lehet.

Az alapforma tehát Presenter:action:

<a n:href="Home:default">home</a>

Ha az aktuális bemutató akciójára hivatkozunk, elhagyhatjuk a nevét:

<a n:href="default">home</a>

Ha a művelet a default, elhagyhatjuk, de a kettőspontnak meg kell maradnia:

<a n:href="Home:">home</a>

A linkek más modulokra is mutathatnak. Itt a linkeket megkülönböztetjük az almodulokhoz viszonyított, illetve abszolút linkekre. Az elv analóg a lemezes elérési utakkal, csak a kötőjelek helyett kettőspontok vannak. Tegyük fel, hogy a tényleges bemutató a Front modul része, akkor azt írjuk:

<a n:href="Shop:Product:show">link to Front:Shop:Product:show</a>
<a n:href=":Admin:Product:show">link to Admin:Product:show</a>

Speciális eset a saját magára való hivatkozás. Itt azt írjuk, hogy this a cél.

<a n:href="this">refresh</a>

A HTML oldal egy bizonyos részére a # hash szimbólum után egy úgynevezett fragmentummal tudunk hivatkozni:

<a n:href="Home:#main">link to Home:default and fragment #main</a>

Abszolút elérési utak

A link() vagy n:href által generált linkek mindig abszolút elérési utak (azaz /-vel kezdődnek), de nem abszolút URL-ek protokollal és domainnel, mint például https://domain.

Abszolút URL létrehozásához adjon hozzá két kötőjelet az elejéhez (pl. n:href="//Home:"). Vagy a $this->absoluteUrls = true beállítással úgy is beállíthatja a prezentert, hogy csak abszolút linkeket generáljon.

A cél this létrehoz egy linket az aktuális oldalra:

<a n:href="this">refresh</a>

Ugyanakkor az összes paraméter, amelyet a action<Action>() vagy a render<View>() metódusban megadott paraméterek, ha a action<Action>() nincs definiálva, átadásra kerül. Tehát ha a Product:show és a id:123 oldalakon vagyunk, akkor a this linkje is átadja ezt a paramétert.

Természetesen lehetőség van a paraméterek közvetlen megadására is:

<a n:href="this refresh: 1">refresh</a>

A isLinkCurrent() függvény meghatározza, hogy a link célpontja megegyezik-e az aktuális oldallal. Ez például egy sablonban használható a linkek megkülönböztetésére stb.

A paraméterek ugyanazok, mint a link() metódus esetében, de lehetőség van a * joker karakter használatára is egy konkrét művelet helyett, ami a bemutató bármely műveletét jelenti.

{if !isLinkCurrent('Admin:login')}
	<a n:href="Admin:login">Přihlaste se</a>
{/if}

<li n:class="isLinkCurrent('Product:*') ? active">
	<a n:href="Product:">...</a>
</li>

A rövidített formát a n:href kapcsolattal együtt lehet használni egyetlen elemben:

<a n:class="isLinkCurrent() ? active" n:href="Product:detail">...</a>

A * joker karakter csak a prezentáló műveletét helyettesíti, magát a prezentálót nem.

Annak megállapítására, hogy egy adott modulban vagy annak almoduljában vagyunk-e, a isModuleCurrent(moduleName) függvényt használhatjuk.

<li n:class="isModuleCurrent('MyEshop:Users') ? active">
	<a n:href="Product:">...</a>
</li>

A link célpontja nem csak a bemutató és az akció lehet, hanem a jel is (ők hívják a metódust handle<Signal>()). A szintaxis a következő:

[//] [sub-component:]signal! [#fragment]

A jelzést tehát felkiáltójel különbözteti meg:

<a n:href="click!">signal</a>

Az alkomponens (vagy al-alkomponens) jelére mutató linket is létrehozhat:

<a n:href="componentName:click!">signal</a>

Mivel a komponensek különálló, újrafelhasználható egységek, amelyeknek nem lehet kapcsolatuk a környező bemutatókkal, a hivatkozások egy kicsit másképp működnek. A n:href Latte attribútum és a {link} címke, valamint az olyan komponensmódszerek, mint a link() és mások, mindig a célt tekintik jelzőnévnek. Ezért nem szükséges felkiáltójelet használni:

<a n:href="click">signal, not an action</a>

Ha a komponenssablonban előadókra akarunk hivatkozni, akkor a {plink} címkét használjuk:

<a href={plink Home:default}>home</a>

vagy a kódban

$this->getPresenter()->link('Home:default')

Álnevek

Néha hasznos, ha egy könnyen megjegyezhető álnevet rendelünk egy Presenter:action pároshoz. Például a Front:Home:default honlapot egyszerűen elnevezheti home -nek, vagy a Admin:Dashboard:default -t admin-nak.

Az aliasok a konfigurációban a application › aliases kulcs alatt kerülnek meghatározásra:

application:
    aliases:
        home: Front:Home:default
        admin: Admin:Dashboard:default
        sign: Front:Sign:in

A hivatkozásokban az at szimbólummal íródnak, például:

<a n:href="@admin">administration</a>

A linkekkel dolgozó összes módszer támogatja őket, például a redirect() és hasonlók.

Előfordulhat, hogy érvénytelen linket hozunk létre – vagy azért, mert nem létező bemutatóra hivatkozik, vagy azért, mert több paramétert ad át, mint amennyit a célmódszer az aláírásában kap, vagy amikor nem lehet generált URL a célzott művelethez. Azt, hogy mit tegyünk az érvénytelen linkekkel, a Presenter::$invalidLinkMode statikus változó határozza meg. Ez a következő értékek (konstansok) egyikét veheti fel:

  • Presenter::InvalidLinkSilent – néma üzemmód, URL-ként a # szimbólumot adja vissza.
  • Presenter::InvalidLinkWarning – E_USER_WARNING kerül előállításra.
  • Presenter::InvalidLinkTextual – vizuális figyelmeztetés, a hiba szövege megjelenik a hivatkozásban.
  • Presenter::InvalidLinkException – az InvalidLinkException hibaüzenetet kap.

Az alapértelmezett beállítás termelési üzemmódban a InvalidLinkWarning, fejlesztési üzemmódban pedig a InvalidLinkWarning | InvalidLinkTextual. A InvalidLinkWarning nem öli meg a szkriptet a termelési környezetben, de a figyelmeztetés naplózásra kerül. A fejlesztői környezetben a Tracy elfogja a figyelmeztetést és megjeleníti a hiba bluescreen-t. Ha a InvalidLinkTextual van beállítva, a prezenter és a komponensek URL-ként adják vissza a hibaüzenetet, amely a #error: csillaggal kezdődik. Ahhoz, hogy az ilyen linkeket láthatóvá tegyük, hozzáadhatunk egy CSS szabályt a stíluslapunkhoz:

a[href^="#error:"] {
	background: red;
	color: white;
}

Ha nem akarjuk, hogy a fejlesztői környezetben figyelmeztetések jelenjenek meg, akkor a konfigurációban bekapcsolhatjuk a silent invalid link mode-ot.

application:
	silentLinks: true

LinkGenerator

Hogyan hozhatunk létre linkeket a link() comfort módszerrel, de prezenter jelenléte nélkül? Ezért itt van a Nette\Application\LinkGenerator.

LinkGenerator egy olyan szolgáltatás, amelyet átadhat a konstruktoron keresztül, majd linkeket hozhat létre a link() módszerével.

Van egy különbség a bemutatókhoz képest. A LinkGenerator minden linket abszolút URL-ként hoz létre. Továbbá nincs „aktuális bemutató“, így nem lehet csak a link('default') művelet nevét vagy a modulok relatív elérési útvonalait megadni.

Az érvénytelen linkek mindig dobnak Nette\Application\UI\InvalidLinkException.