URL Bağlantıları Oluşturma
Nette'de bağlantı oluşturmak parmakla işaret etmek kadar kolaydır. Sadece işaret edin ve çerçeve sizin için tüm işi yapacaktır. Biz göstereceğiz:
- şablonlarda ve başka yerlerde nasıl bağlantı oluşturulur
- mevcut sayfaya bir bağlantı nasıl ayırt edilir
- geçersiz bağlantılar ne olacak
Çift yönlü yönlendirme sayesinde, daha sonra değişebilecek veya oluşturulması karmaşık olabilecek uygulama URL'lerini şablonlarda veya kodda sabit kodlamak zorunda kalmazsınız. Sadece bağlantıdaki sunucuyu ve eylemi belirtin, herhangi bir parametre geçirin ve çerçeve URL'yi kendisi oluşturacaktır. Aslında, bir fonksiyon çağırmaya çok benzer. Bunu seveceksiniz.
Sunucu Şablonunda
Çoğu zaman şablonlarda bağlantılar oluştururuz ve n:href
niteliği harika bir yardımcıdır:
<a n:href="Product:show">detail</a>
href
HTML özniteliği yerine n:href
n: özniteliğini kullandığımıza dikkat edin. Değeri,
href
özniteliğinde alıştığınız gibi bir URL değil, sunum yapan kişinin ve eylemin adıdır.
Bir bağlantıya tıklamak, basitçe söylemek gerekirse, bir metodu çağırmak gibidir
ProductPresenter::renderShow()
. Ve eğer imzasında parametreler varsa, onu argümanlarla çağırabiliriz:
<a n:href="Product:show $product->id, $product->slug">detail</a>
Adlandırılmış parametreleri geçmek de mümkündür. Aşağıdaki bağlantı lang
parametresini
en
değeriyle geçirir:
<a n:href="Product:show $product->id, lang: en">detail</a>
ProductPresenter::renderShow()
yönteminin imzasında $lang
yoksa, parametrenin değerini
$lang = $this->getParameter('lang')
kullanarak veya özellikten alabilir.
Parametreler bir dizide saklanıyorsa, ...
operatörü (veya Latte 2.x'te (expand)
operatörü) ile
genişletilebilirler:
{var $args = [$product->id, lang => en]}
<a n:href="Product:show ...$args">detail</a>
Kalıcı parametreler olarak adlandırılan parametreler de bağlantılarda otomatik olarak aktarılır.
Öznitelik n:href
HTML etiketleri için çok kullanışlıdır <a>
. Bağlantıyı başka bir
yere, örneğin metnin içine yazdırmak istiyorsak {link}
adresini kullanırız:
URL is: {link Home:default}
Kod'da
Sunucuda bir bağlantı oluşturmak için link()
yöntemi kullanılır:
$url = $this->link('Product:show', $product->id);
Parametreler, adlandırılmış parametrelerin de belirtilebildiği bir dizi olarak da aktarılabilir:
$url = $this->link('Product:show', [$product->id, 'lang' => 'cs']);
Linkler, LinkGenerator ve onun link()
yöntemi kullanılarak bir sunucu olmadan
da oluşturulabilir.
Sunucu Bağlantıları
Bağlantının hedefi sunum yapan ve eylem ise, bu sözdizimine sahiptir:
[//] [[[[:]module:]presenter:]action | this] [#fragment]
Bu format tüm Latte etiketleri ve bağlantılarla çalışan tüm sunum yöntemleri tarafından desteklenmektedir, yani
n:href
, {link}
, {plink}
, link()
, lazyLink()
,
isLinkCurrent()
, redirect()
, redirectPermanent()
, forward()
,
canonicalize()
ve ayrıca LinkGenerator. Yani örneklerde n:href
kullanılmış olsa bile, fonksiyonlardan herhangi biri olabilir.
Bu nedenle temel form Presenter:action
şeklindedir:
<a n:href="Home:default">home</a>
Geçerli sunucunun eylemine bağlantı verirsek, adını atlayabiliriz:
<a n:href="default">home</a>
Eylem default
ise, bunu atlayabiliriz, ancak iki nokta üst üste kalmalıdır:
<a n:href="Home:">home</a>
Bağlantılar diğer modüllere de işaret edebilir. Burada, bağlantılar alt modüllere göreli
veya mutlak olarak ayırt edilir. Prensip disk yollarına benzer, sadece eğik çizgiler yerine iki nokta üst üste vardır.
Gerçek sunucunun Front
modülünün bir parçası olduğunu varsayalım, o zaman yazacağız:
<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>
Özel bir durum, kendine bağlantı vermektir. Burada hedef olarak this
yazacağız.
<a n:href="this">refresh</a>
HTML sayfasının belirli bir bölümüne #
hash sembolünden sonra gelen fragment adı verilen bir parça
aracılığıyla bağlantı verebiliriz:
<a n:href="Home:#main">link to Home:default and fragment #main</a>
Mutlak Yollar
link()
veya n:href
tarafından oluşturulan bağlantılar her zaman mutlak yollardır (yani
/
ile başlarlar), ancak https://domain
gibi bir protokol ve etki alanı içeren mutlak URL'ler
değildir.
Mutlak bir URL oluşturmak için başına iki eğik çizgi ekleyin (örneğin, n:href="//Home:"
). Ya da
$this->absoluteUrls = true
adresini ayarlayarak sunucuyu yalnızca mutlak bağlantılar oluşturacak şekilde
değiştirebilirsiniz.
Güncel Sayfaya Bağlantı
Hedef this
geçerli sayfaya bir bağlantı oluşturacaktır:
<a n:href="this">refresh</a>
Aynı zamanda, imzasında belirtilen tüm parametreler action<Action>()
veya
render<View>()
yönteminde, eğer action<Action>()
tanımlanmamışsa, aktarılır. Yani
Product:show
ve id:123
sayfalarındaysak, this
bağlantısı da bu parametreyi
geçirecektir.
Elbette parametreleri doğrudan belirtmek de mümkündür:
<a n:href="this refresh: 1">refresh</a>
İşlev isLinkCurrent()
bağlantının hedefinin geçerli sayfayla aynı olup olmadığını belirler. Bu,
örneğin bir şablonda bağlantıları vb. ayırt etmek için kullanılabilir.
Parametreler link()
yöntemiyle aynıdır, ancak belirli bir eylem yerine *
joker karakterini
kullanmak da mümkündür, bu da sunum yapan kişinin herhangi bir eylemi anlamına gelir.
{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>
Kısaltılmış bir form, tek bir öğede n:href
ile birlikte kullanılabilir:
<a n:class="isLinkCurrent() ? active" n:href="Product:detail">...</a>
Joker karakter *
yalnızca sunum yapan kişinin eylemini değiştirir, sunum yapan kişinin kendisini
değiştirmez.
Belirli bir modülde mi yoksa onun alt modülünde mi olduğumuzu öğrenmek için isModuleCurrent(moduleName)
fonksiyonunu kullanabiliriz.
<li n:class="isModuleCurrent('MyEshop:Users') ? active">
<a n:href="Product:">...</a>
</li>
Sinyal Bağlantıları
Bağlantının hedefi yalnızca sunum yapan kişi ve eylem değil, aynı zamanda sinyal
de olabilir (metodu çağırırlar handle<Signal>()
). Sözdizimi aşağıdaki gibidir:
[//] [sub-component:]signal! [#fragment]
Bu nedenle sinyal ünlem işareti ile ayırt edilir:
<a n:href="click!">signal</a>
Ayrıca alt bileşenin (veya alt alt bileşenin) sinyaline bir bağlantı da oluşturabilirsiniz:
<a n:href="componentName:click!">signal</a>
Bileşendeki Bağlantılar
Bileşenler, çevrelerindeki sunucularla hiçbir ilişkisi olmaması gereken ayrı yeniden
kullanılabilir birimler olduğundan, bağlantılar biraz farklı çalışır. Latte niteliği n:href
ve etiketi
{link}
ve link()
ve diğerleri gibi bileşen yöntemleri her zaman hedefi sinyal adı olarak
kabul eder. Bu nedenle ünlem işareti kullanmak gerekli değildir:
<a n:href="click">signal, not an action</a>
Bileşen şablonunda sunum yapanlara bağlantı vermek istiyorsak {plink}
etiketini kullanırız:
<a href={plink Home:default}>home</a>
veya kodda
$this->getPresenter()->link('Home:default')
Takma Adlar
Bazen bir Presenter:action çiftine kolayca hatırlanabilir bir takma ad atamak yararlı olabilir. Örneğin,
Front:Home:default
ana sayfasını basitçe home
veya Admin:Dashboard:default
ana
sayfasını admin
olarak adlandırabilirsiniz.
Takma adlar yapılandırmada application › aliases
anahtarı altında
tanımlanır:
application:
aliases:
home: Front:Home:default
admin: Admin:Dashboard:default
sign: Front:Sign:in
Bağlantılarda, örneğin at sembolü kullanılarak yazılırlar:
<a n:href="@admin">administration</a>
redirect()
ve benzeri gibi bağlantılarla çalışan tüm yöntemlerde desteklenirler.
Geçersiz Bağlantılar
Geçersiz bir bağlantı oluşturabiliriz – ya mevcut olmayan bir sunucuya atıfta bulunduğu için ya da hedef yöntemin
imzasında aldığından daha fazla parametre geçtiği için ya da hedeflenen eylem için oluşturulmuş bir URL olamadığında.
Geçersiz bağlantılarla ne yapılacağı Presenter::$invalidLinkMode
statik değişkeni tarafından belirlenir. Bu
değerlerden (sabitler) birine sahip olabilir:
Presenter::InvalidLinkSilent
– sessiz mod, URL olarak#
sembolünü döndürürPresenter::InvalidLinkWarning
– E_USER_WARNING üretilecektirPresenter::InvalidLinkTextual
– görsel uyarı, hata metni bağlantıda görüntülenirPresenter::InvalidLinkException
– InvalidLinkException fırlatılacaktır
Üretim modunda varsayılan kurulum InvalidLinkWarning
ve geliştirme modunda
InvalidLinkWarning | InvalidLinkTextual
şeklindedir. InvalidLinkWarning
üretim ortamında betiği
öldürmez, ancak uyarı günlüğe kaydedilir. Geliştirme ortamında, Tracy uyarıyı
kesecek ve hata mavi ekranını görüntüleyecektir. Eğer InvalidLinkTextual
ayarlanmışsa, sunucu ve bileşenler
hata mesajını #error:
ile başlayan URL olarak döndürür. Bu tür bağlantıları görünür kılmak için stil
sayfamıza bir CSS kuralı ekleyebiliriz:
a[href^="#error:"] {
background: red;
color: white;
}
Geliştirme ortamında uyarıların üretilmesini istemiyorsak, yapılandırmada sessiz geçersiz bağlantı modunu açabiliriz.
application:
silentLinks: true
LinkGenerator
link()
comfort yöntemiyle, ancak bir sunum yapan kişi olmadan nasıl bağlantı oluşturulur? İşte bu yüzden
Nette\Application\LinkGenerator.
LinkGenerator, kurucudan geçirebileceğiniz ve ardından link()
yöntemini kullanarak bağlantılar
oluşturabileceğiniz bir hizmettir.
Sunuculara kıyasla bir fark vardır. LinkGenerator tüm bağlantıları mutlak URL'ler olarak oluşturur. Ayrıca, „geçerli
sunucu“ yoktur, bu nedenle yalnızca link('default')
eyleminin adını veya modüllere
göreli yolları belirtmek mümkün değildir.
Geçersiz bağlantılar her zaman Nette\Application\UI\InvalidLinkException
adresini atar.