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:hrefn: ö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.

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.

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>

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

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ür
  • Presenter::InvalidLinkWarning – E_USER_WARNING üretilecektir
  • Presenter::InvalidLinkTextual – görsel uyarı, hata metni bağlantıda görüntülenir
  • Presenter::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.

versiyon: 4.0