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

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.

različica: 4.0