Nette Documentation Preview

syntax
URL linkek létrehozása
**********************

<div class=perex>

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

</div>


Az [kétirányú routingnak |routing] 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:

```latte
<a n:href="Product:show">részletek</a>
```

Figyelje meg, hogy a HTML `href` attribútum helyett az [n:attribútumot |latte:syntax#n:attribútumok] `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:

```latte
<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:

```latte
<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 |presenters#Kérés paraméterei] tudhatja meg.

Ha a paraméterek tömbben vannak tárolva, kibonthatók a `...` operátorral (Latte 2.x-ben az `(expand)` operátorral):

```latte
{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 |presenters#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:

```latte
A cím: {link Home:default}
```


A kódban
========

Link létrehozásához a presenterben a `link()` metódus szolgál:

```php
$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:

```php
$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`:

```latte
<a n:href="Home:default">kezdőlap</a>
```

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

```latte
<a n:href="default">kezdőlap</a>
```

Ha a cél a `default` akció, kihagyhatjuk, de a kettőspontnak maradnia kell:

```latte
<a n:href="Home:">kezdőlap</a>
```

A linkek más [modulokba |directory-structure#Presenterek és sablonok] 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:

```latte
<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 az aktuális oldalra] link, amikor célként a `this`-t adjuk meg.

```latte
<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:

```latte
<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:

```latte
<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:

```latte
<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.

```latte
{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:

```latte
<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.

```latte
<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 |components#Signal] 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:

```latte
<a n:href="click!">signál</a>
```

Lehet linket létrehozni egy alkomponens (vagy al-alkomponens) signáljára is:

```latte
<a n:href="componentName:click!">signál</a>
```


Linkek a komponensben
=====================

Mivel a [komponensek|components] ö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:

```latte
<a n:href="click">signál, nem akció</a>
```

Ha a komponens sablonjában presenterekre szeretnénk hivatkozni, használjuk a `{plink}` taget:

```latte
<a href={plink Home:default}>kezdőlap</a>
```

vagy a kódban

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


Aliasok .{data-version:v3.2.2}
==============================

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|configuration] definiáljuk az `application › aliases` kulcs alatt:

```neon
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:

```latte
<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 vissza
- `Presenter::InvalidLinkWarning` - E_USER_WARNING figyelmeztetést dob, amely éles módban logolásra kerül, de nem szakítja meg a szkript futását
- `Presenter::InvalidLinkTextual` - vizuális figyelmeztetés, a hibát közvetlenül a linkbe írja
- `Presenter::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 |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:

```css
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|configuration].

```neon
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 [api: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.

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.

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 vissza
  • Presenter::InvalidLinkWarning – E_USER_WARNING figyelmeztetést dob, amely éles módban logolásra kerül, de nem szakítja meg a szkript futását
  • Presenter::InvalidLinkTextual – vizuális figyelmeztetés, a hibát közvetlenül a linkbe írja
  • Presenter::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.