Nette Documentation Preview

syntax
Ustvarjanje povezav URL
***********************

<div class=perex>

Ustvarjanje povezav v Nette je tako enostavno, kot da pokažete s prstom. Samo pokažite in ogrodje bo opravilo vse delo namesto vas. Prikazali bomo:

- kako ustvariti povezave v predlogah in drugje
- kako razlikovati povezavo do trenutne strani
- kako je z neveljavnimi povezavami

</div>


Zaradi [dvosmernega usmerjanja |routing] vam nikoli več ne bo treba v predlogah ali kodi trdo kodirati URL-jev aplikacij, ki se lahko pozneje spremenijo ali jih je zapleteno sestaviti. V povezavi samo določite predstavnika in dejanje, podajte morebitne parametre in ogrodje bo samo ustvarilo naslov URL. Pravzaprav je to zelo podobno klicanju funkcije. Všeč vam bo.


V predlogi za predstavitelja .[#toc-in-the-presenter-template]
==============================================================

Najpogosteje ustvarjamo povezave v predlogah in odličen pomočnik je atribut `n:href`:

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

Upoštevajte, da smo namesto atributa HTML `href` uporabili [n:atribut |latte:syntax#n:attributes] `n:href`. Njegova vrednost ni naslov URL, kot ste vajeni pri atributu `href`, temveč ime predstavnika in dejanja.

Klik na povezavo je, preprosto povedano, nekaj podobnega kot klic metode `ProductPresenter::renderShow()`. In če ima v svojem podpisu parametre, jo lahko pokličemo z argumenti:

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

Lahko ji posredujemo tudi poimenovane parametre. Naslednja povezava posreduje parameter `lang` z vrednostjo `en`:

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

Če metoda `ProductPresenter::renderShow()` v svojem podpisu nima `$lang`, lahko vrednost parametra pridobi z uporabo `$lang = $this->getParameter('lang')` ali iz [lastnosti |presenters#Request Parameters].

Če so parametri shranjeni v polju, jih je mogoče razširiti z operatorjem `...` (ali `(expand)` v Latte 2.x):

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

V povezavah se samodejno posredujejo tudi tako imenovani [trajni parametri |presenters#persistent parameters].

Atribut `n:href` je zelo priročen za oznake HTML `<a>`. Če želimo povezavo izpisati drugje, na primer v besedilu, uporabimo `{link}`:

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


V kodi .[#toc-in-the-code]
==========================

Metoda `link()` se uporablja za ustvarjanje povezave v predstavitvenem programu:

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

Parametri se lahko posredujejo tudi kot polje, v katerem se lahko določijo tudi poimenovani parametri:

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

Povezave je mogoče ustvariti tudi brez predstavnika z uporabo [LinkGeneratorja |#LinkGenerator] in njegove metode `link()`.


Povezave do predstavnika .[#toc-links-to-presenter]
===================================================

Če je cilj povezave predvajalnik in akcija, ima povezava naslednjo sintakso:

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

To obliko podpirajo vse oznake Latte in vse metode presenterja, ki delajo s povezavami, tj. `n:href`, `{link}`, `{plink}`, `link()`, `lazyLink()`, `isLinkCurrent()`, `redirect()`, `redirectPermanent()`, `forward()`, `canonicalize()` in tudi [LinkGenerator |#LinkGenerator]. Torej tudi če je v primerih uporabljena `n:href`, je lahko uporabljena katera koli od teh funkcij.

Osnovna oblika je torej `Presenter:action`:

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

Če se povežemo z dejanjem trenutnega predstavnika, lahko izpustimo njegovo ime:

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

Če je dejanje `default`, ga lahko izpustimo, vendar mora dvopičje ostati:

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

Povezave lahko kažejo tudi na druge [module |modules]. Tu se povezave razlikujejo na relativne na podmodule ali absolutne. Načelo je podobno kot pri diskovnih poteh, le da so namesto poševnic dvopičja. Predpostavimo, da je dejanski predstavnik del modula `Front`, potem bomo zapisali:

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

Poseben primer je [povezovanje na samega sebe |#Links to Current Page]. V tem primeru bomo kot cilj zapisali `this`.

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

Na določen del strani HTML se lahko povežemo s tako imenovanim fragmentom za simbolom `#` hash:

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


Absolutne poti .[#toc-absolute-paths]
=====================================

Povezave, ki jih generirata `link()` ali `n:href`, so vedno absolutne poti (tj. začnejo se z `/`), ne pa tudi absolutni naslovi URL s protokolom in domeno, kot `https://domain`.

Če želite ustvariti absolutni naslov URL, na začetek dodajte dve poševnici (npr. `n:href="//Home:"`). Lahko pa tudi preklopite predstavnik, da ustvarja samo absolutne povezave, tako da nastavite `$this->absoluteUrls = true`.


Povezava na trenutno stran .[#toc-link-to-current-page]
=======================================================

Ciljna stran `this` bo ustvarila povezavo do trenutne strani:

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

Hkrati se vsi parametri, navedeni v podpisu `action<Action>()` ali . `render<View>()` metode, če je `action<Action>()` niso opredeljeni, se prenesejo. Če smo torej na straneh `Product:show` in `id:123`, bo povezava do strani `this` prenesla tudi ta parameter.

Seveda je mogoče parametre navesti tudi neposredno:

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

Funkcija `isLinkCurrent()` določi, ali je cilj povezave enak kot trenutna stran. To lahko na primer uporabimo v predlogi za razlikovanje povezav itd.

Parametri so enaki kot pri metodi `link()`, vendar je mogoče namesto določenega dejanja uporabiti tudi nadomestni znak `*`, kar pomeni katero koli dejanje predstavnika.

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

Skrajšana oblika se lahko uporablja v kombinaciji s `n:href` v enem samem elementu:

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

Zaščitni znak `*` nadomesti samo dejanje predavatelja, ne pa tudi samega predavatelja.

Če želimo ugotoviti, ali smo v določenem modulu ali njegovem podmodulu, lahko uporabimo funkcijo `isModuleCurrent(moduleName)`.

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


Povezave do signala .[#toc-links-to-signal]
===========================================

Cilj povezave nista lahko le predstavnik in dejanje, temveč tudi [signal |components#Signal] (kličeta metodo `handle<Signal>()`). Sintaksa je naslednja:

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

Signal se torej razlikuje z vzklikalnikom:

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

Ustvarite lahko tudi povezavo do signala podkomponente (ali podkomponente):

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


Povezave v komponenti .[#toc-links-in-component]
================================================

Ker so [komponente |components] ločene enote za večkratno uporabo, ki naj ne bi imele nobenih povezav z okoliškimi predstavniki, povezave delujejo nekoliko drugače. Latte atribut `n:href` in oznaka `{link}` ter metode komponente, kot so `link()` in druge, vedno upoštevajo cilj **kot ime signala**. Zato ni treba uporabljati vzklika:

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

Če se želimo v predlogi komponente povezati s predstavniki, uporabimo oznako `{plink}`:

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

ali v kodi

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


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

Včasih je koristno, da paru predavatelj:dejanje dodelite lahko zapomljiv vzdevek. Na primer, domačo stran `Front:Home:default` lahko poimenujete preprosto kot `home` ali `Admin:Dashboard:default` kot `admin`.

Vzdevki so v [konfiguraciji |configuration] opredeljeni pod ključem `application › aliases`:

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

V povezavah so zapisani s simbolom at, na primer:

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

Podprte so v vseh metodah, ki delajo s povezavami, na primer `redirect()` in podobno.


Neveljavne povezave .[#toc-invalid-links]
=========================================

Lahko se zgodi, da ustvarimo neveljavno povezavo - bodisi ker se sklicuje na neobstoječega predstavnika, bodisi ker posreduje več parametrov, kot jih prejme ciljna metoda v svojem podpisu, bodisi kadar ni mogoče ustvariti URL za ciljno dejanje. Kaj storiti z neveljavnimi povezavami, določa statična spremenljivka `Presenter::$invalidLinkMode`. Ima lahko eno od teh vrednosti (konstant):

- `Presenter::InvalidLinkSilent` - tihi način, vrne simbol `#` kot URL
- `Presenter::InvalidLinkWarning` - ustvari se E_USER_WARNING
- `Presenter::InvalidLinkTextual` - vizualno opozorilo, besedilo napake se prikaže v povezavi
- `Presenter::InvalidLinkException` - Izključitev InvalidLinkException se vrže

Privzeta nastavitev v produkcijskem načinu je `InvalidLinkWarning`, v razvojnem načinu pa `InvalidLinkWarning | InvalidLinkTextual`. `InvalidLinkWarning` v produkcijskem okolju ne uniči skripte, vendar se bo opozorilo zabeležilo. V razvojnem okolju bo program [Tracy |tracy:] prestregel opozorilo in prikazal modri zaslon za napake. Če je nastavljen `InvalidLinkTextual`, predstavnik in komponente vrnejo sporočilo o napaki kot naslov URL, ki se zvezdica z `#error:`. Če želimo, da so takšne povezave vidne, lahko v naš niz slogov dodamo pravilo CSS:

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

Če ne želimo, da se v razvojnem okolju ustvarjajo opozorila, lahko v [konfiguraciji |configuration] vklopimo način tihe neveljavne povezave.

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


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

Kako ustvariti povezave z metodo `link()` comfort, vendar brez prisotnosti predstavnika? Zato je tu [api:Nette\Application\LinkGenerator].

LinkGenerator je storitev, ki jo lahko imate posredovano skozi konstruktor in nato ustvarite povezave z njeno metodo `link()`.

V primerjavi s predstavniki obstaja razlika. LinkGenerator ustvari vse povezave kot absolutne naslove URL. Poleg tega ni "trenutnega predstavnika", zato ni mogoče določiti samo imena akcije `link('default')` ali relativnih poti do [modulov |modules].

Neveljavne povezave vedno vrže `Nette\Application\UI\InvalidLinkException`.

Ustvarjanje povezav URL

Ustvarjanje povezav v Nette je tako enostavno, kot da pokažete s prstom. Samo pokažite in ogrodje bo opravilo vse delo namesto vas. Prikazali bomo:

  • kako ustvariti povezave v predlogah in drugje
  • kako razlikovati povezavo do trenutne strani
  • kako je z neveljavnimi povezavami

Zaradi dvosmernega usmerjanja vam nikoli več ne bo treba v predlogah ali kodi trdo kodirati URL-jev aplikacij, ki se lahko pozneje spremenijo ali jih je zapleteno sestaviti. V povezavi samo določite predstavnika in dejanje, podajte morebitne parametre in ogrodje bo samo ustvarilo naslov URL. Pravzaprav je to zelo podobno klicanju funkcije. Všeč vam bo.

V predlogi za predstavitelja

Najpogosteje ustvarjamo povezave v predlogah in odličen pomočnik je atribut n:href:

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

Upoštevajte, da smo namesto atributa HTML href uporabili n:atribut n:href. Njegova vrednost ni naslov URL, kot ste vajeni pri atributu href, temveč ime predstavnika in dejanja.

Klik na povezavo je, preprosto povedano, nekaj podobnega kot klic metode ProductPresenter::renderShow(). In če ima v svojem podpisu parametre, jo lahko pokličemo z argumenti:

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

Lahko ji posredujemo tudi poimenovane parametre. Naslednja povezava posreduje parameter lang z vrednostjo en:

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

Če metoda ProductPresenter::renderShow() v svojem podpisu nima $lang, lahko vrednost parametra pridobi z uporabo $lang = $this->getParameter('lang') ali iz lastnosti.

Če so parametri shranjeni v polju, jih je mogoče razširiti z operatorjem ... (ali (expand) v Latte 2.x):

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

V povezavah se samodejno posredujejo tudi tako imenovani trajni parametri.

Atribut n:href je zelo priročen za oznake HTML <a>. Če želimo povezavo izpisati drugje, na primer v besedilu, uporabimo {link}:

URL is: {link Home:default}

V kodi

Metoda link() se uporablja za ustvarjanje povezave v predstavitvenem programu:

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

Parametri se lahko posredujejo tudi kot polje, v katerem se lahko določijo tudi poimenovani parametri:

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

Povezave je mogoče ustvariti tudi brez predstavnika z uporabo LinkGeneratorja in njegove metode link().

Če je cilj povezave predvajalnik in akcija, ima povezava naslednjo sintakso:

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

To obliko podpirajo vse oznake Latte in vse metode presenterja, ki delajo s povezavami, tj. n:href, {link}, {plink}, link(), lazyLink(), isLinkCurrent(), redirect(), redirectPermanent(), forward(), canonicalize() in tudi LinkGenerator. Torej tudi če je v primerih uporabljena n:href, je lahko uporabljena katera koli od teh funkcij.

Osnovna oblika je torej Presenter:action:

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

Če se povežemo z dejanjem trenutnega predstavnika, lahko izpustimo njegovo ime:

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

Če je dejanje default, ga lahko izpustimo, vendar mora dvopičje ostati:

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

Povezave lahko kažejo tudi na druge module. Tu se povezave razlikujejo na relativne na podmodule ali absolutne. Načelo je podobno kot pri diskovnih poteh, le da so namesto poševnic dvopičja. Predpostavimo, da je dejanski predstavnik del modula Front, potem bomo zapisali:

<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>

Poseben primer je povezovanje na samega sebe. V tem primeru bomo kot cilj zapisali this.

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

Na določen del strani HTML se lahko povežemo s tako imenovanim fragmentom za simbolom # hash:

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

Absolutne poti

Povezave, ki jih generirata link() ali n:href, so vedno absolutne poti (tj. začnejo se z /), ne pa tudi absolutni naslovi URL s protokolom in domeno, kot https://domain.

Če želite ustvariti absolutni naslov URL, na začetek dodajte dve poševnici (npr. n:href="//Home:"). Lahko pa tudi preklopite predstavnik, da ustvarja samo absolutne povezave, tako da nastavite $this->absoluteUrls = true.

Ciljna stran this bo ustvarila povezavo do trenutne strani:

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

Hkrati se vsi parametri, navedeni v podpisu action<Action>() ali . render<View>() metode, če je action<Action>() niso opredeljeni, se prenesejo. Če smo torej na straneh Product:show in id:123, bo povezava do strani this prenesla tudi ta parameter.

Seveda je mogoče parametre navesti tudi neposredno:

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

Funkcija isLinkCurrent() določi, ali je cilj povezave enak kot trenutna stran. To lahko na primer uporabimo v predlogi za razlikovanje povezav itd.

Parametri so enaki kot pri metodi link(), vendar je mogoče namesto določenega dejanja uporabiti tudi nadomestni znak *, kar pomeni katero koli dejanje predstavnika.

{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>

Skrajšana oblika se lahko uporablja v kombinaciji s n:href v enem samem elementu:

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

Zaščitni znak * nadomesti samo dejanje predavatelja, ne pa tudi samega predavatelja.

Če želimo ugotoviti, ali smo v določenem modulu ali njegovem podmodulu, lahko uporabimo funkcijo isModuleCurrent(moduleName).

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

Cilj povezave nista lahko le predstavnik in dejanje, temveč tudi signal (kličeta metodo handle<Signal>()). Sintaksa je naslednja:

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

Signal se torej razlikuje z vzklikalnikom:

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

Ustvarite lahko tudi povezavo do signala podkomponente (ali podkomponente):

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

Ker so komponente ločene enote za večkratno uporabo, ki naj ne bi imele nobenih povezav z okoliškimi predstavniki, povezave delujejo nekoliko drugače. Latte atribut n:href in oznaka {link} ter metode komponente, kot so link() in druge, vedno upoštevajo cilj kot ime signala. Zato ni treba uporabljati vzklika:

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

Če se želimo v predlogi komponente povezati s predstavniki, uporabimo oznako {plink}:

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

ali v kodi

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

Vzdevki

Včasih je koristno, da paru predavatelj:dejanje dodelite lahko zapomljiv vzdevek. Na primer, domačo stran Front:Home:default lahko poimenujete preprosto kot home ali Admin:Dashboard:default kot admin.

Vzdevki so v konfiguraciji opredeljeni pod ključem application › aliases:

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

V povezavah so zapisani s simbolom at, na primer:

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

Podprte so v vseh metodah, ki delajo s povezavami, na primer redirect() in podobno.

Lahko se zgodi, da ustvarimo neveljavno povezavo – bodisi ker se sklicuje na neobstoječega predstavnika, bodisi ker posreduje več parametrov, kot jih prejme ciljna metoda v svojem podpisu, bodisi kadar ni mogoče ustvariti URL za ciljno dejanje. Kaj storiti z neveljavnimi povezavami, določa statična spremenljivka Presenter::$invalidLinkMode. Ima lahko eno od teh vrednosti (konstant):

  • Presenter::InvalidLinkSilent – tihi način, vrne simbol # kot URL
  • Presenter::InvalidLinkWarning – ustvari se E_USER_WARNING
  • Presenter::InvalidLinkTextual – vizualno opozorilo, besedilo napake se prikaže v povezavi
  • Presenter::InvalidLinkException – Izključitev InvalidLinkException se vrže

Privzeta nastavitev v produkcijskem načinu je InvalidLinkWarning, v razvojnem načinu pa InvalidLinkWarning | InvalidLinkTextual. InvalidLinkWarning v produkcijskem okolju ne uniči skripte, vendar se bo opozorilo zabeležilo. V razvojnem okolju bo program Tracy prestregel opozorilo in prikazal modri zaslon za napake. Če je nastavljen InvalidLinkTextual, predstavnik in komponente vrnejo sporočilo o napaki kot naslov URL, ki se zvezdica z #error:. Če želimo, da so takšne povezave vidne, lahko v naš niz slogov dodamo pravilo CSS:

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

Če ne želimo, da se v razvojnem okolju ustvarjajo opozorila, lahko v konfiguraciji vklopimo način tihe neveljavne povezave.

application:
	silentLinks: true

LinkGenerator

Kako ustvariti povezave z metodo link() comfort, vendar brez prisotnosti predstavnika? Zato je tu Nette\Application\LinkGenerator.

LinkGenerator je storitev, ki jo lahko imate posredovano skozi konstruktor in nato ustvarite povezave z njeno metodo link().

V primerjavi s predstavniki obstaja razlika. LinkGenerator ustvari vse povezave kot absolutne naslove URL. Poleg tega ni „trenutnega predstavnika“, zato ni mogoče določiti samo imena akcije link('default') ali relativnih poti do modulov.

Neveljavne povezave vedno vrže Nette\Application\UI\InvalidLinkException.