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()
.
Povezave do predstavnika
Č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
.
Povezava na trenutno stran
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>
Povezave do signala
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>
Povezave v komponenti
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.
Neveljavne povezave
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 URLPresenter::InvalidLinkWarning
– ustvari se E_USER_WARNINGPresenter::InvalidLinkTextual
– vizualno opozorilo, besedilo napake se prikaže v povezaviPresenter::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
.