Bir Link alanının geçerli URL'sini bir Twig şablonundan nasıl alabilirim?


30

field_my_link(Makine adı) adında bir Link alanım var .

Bir Twig şablonunda, bağlantının URL değerini şu şekilde alabilirim:

{{ node.field_my_link.uri }}

Link’in URL’si içinde harici bir URL varsa, örneğin http://example.comiyi çalışıyordur.

Ancak, eğer Link’in URL’si içinde dahili bir URL varsa, örn."/node/11" şöyle bir değer alıyorum:

"internal:/node/11"

ile "internal: " öneki ile.

Nasıl alabilirim Geçerli URL’yi ?

Örneğin, bağlantının URL’si " http://example.com" İstiyorum " http://example.com" (bu zaten çalışıyor), bağlantının URL’si " /node/11" göreceli URL’yi istiyorum " /node/11" ise, bağlantının <front>URL’si " /" URL’yi istiyorum " ", vb. .


DÜZENLE

Bunu kullanarak bir PHP ön işleme fonksiyonu içinde istediğim değeri alabilirim:

$url = $variables['node']->get('field_my_link')->first()->getUrl();

Twig şablonunda aynı değere nasıl erişebilirim?

Önişlem işlevinde bunu yapabileceğimi biliyorum:

$variables['my_url'] = $url;

Ardından, Twig’deki URL’ye URL’ye erişin {{ my_url }}, ancak her bağlantı alanımda ön işleme işlevi yazmaktan kaçınırdım.

Yanıtlar:


38

En son düzenlemenizdeki PHP'niz şu şekilde dallara çevrilir:

{{ node.field_my_link.0.url }}

Bu böyle çalışır. 0 , alan öğe listesinin ilk öğesini döndürür, urlurl nesnesini alır ve dal bu nesneyi bir dize olarak kullanır çünkü bu, sihirli yöntemi toString () olarak çağırır ve url'yi bir dize değeri olarak verir.

Yalnızca kullanmanız gerekir url, çünkü getxyz()bu isimde bir özellik yoksa, dallama yöntemi otomatik olarak arar xyz.


Teşekkür ederim. Şimdi bu fonksiyonla bir test yapıyorum. Bu işlevi bağlantıların URI'larında da kullanabilir miyim, biliyor musunuz? node.field_my_link.uriHarici bir URL benzeri olursa ne olur http://www.example.com?
Andrea

1
Birlikte çalıştığımız file_url(node.field_my_link.uri)ve eğer node.field_my_link.uriolduğunu "http://www.example.com"çalışır (bu değişmeden url bırakır), ancak eğer node.field_my_link.uribir "internal:/"fonksiyon döner "/internal%3A/"(yerine "/") ..
Andrea

Sadece düzenlemenizi gördüm .. Ne yazık ki işe yaramadı, kod node.field_my_link.entity.uri.valueboş bir değer döndürüyor .. Başka bir fikir?
Andrea,

@Andrea, cevabımı düzenledim.
4k4

1
Evet, işe yarıyor. Sözdizimi biraz korkutucu ama işini yapıyor.
Andrea,

17

Oluşturma dizisi öğesine doğrudan sizin durumunuzda erişebilirsiniz:

{{ node.field_my_link[0]['#url'] }}

Bu benim için çalıştı.
esQmo_

10

Her iki vakayı da kapsamalısınız: harici ve dahili URL'ler.

Önce URL'nin harici olup olmadığını kontrol edelim ve sadece*.uri .

Aksi takdirde, dahili ise Drupal path($name, $parameters, $options)fonksiyonuyla rota adını ve parametrelerini bağlamamız gerekir.

{% if node.field_link.0.url.external %}
  <a href="{{ node.field_link.uri }}">
    {{ node.field_link.title }}
  </a>
{% else %}
  <a href="{{ path(node.field_link.0.url.routeName, node.field_link.0.url.routeParameters) }}">
    {{ node.field_link.title }}
  </a>
{% endif %}

2
Teşekkürler, tam olarak ihtiyacım olan şey: link alanından bir dize olarak url'yi al: {% set url = path(node.field_link.0.url.routeName, node.field_link.0.url.routeParameters) %}Sonra özel bir link oluşturabilirim: ` <a href="{{ url }}" class="mycustomclass">custom link text</a>Ön işleme gerek yok ve content.field_link üzerinden herhangi bir işlem yapmanıza gerek yok Sadece url'yi almak için bağlantı alanı için display ekranı yönet ’.
kullanıcı33560

8

Bunu bir Bloktaki Bağlantı Alanında yapmak zorunda kaldım. Bu iyi çalıştı:

{{ content.field_my_link[0]['#url']|render }}

4
Bu kullanım için ince da {{ content.field_my_link[0]['#url'] }}olmayan hale dal şablon olarak basılır dizi otomatik olarak işlenir hale.
eric.chenchao

5

Eski bir gönderi olduğunu biliyorum, ancak Drupal 8'in (8.6) son sürümüyle her iki sürümün URL'sini doğrudan görüntüleyebilirsiniz (harici ve dahili):

node.field_link.0.url

Ve bağlantının harici olup olmadığını bilmeniz gerekiyorsa (benim için hedef içindi), bunu kullanabilirsiniz:

node.field_link.0.url.external

Örnek:

<a href="{{ node.field_link.0.url }}" title="Title" target="{{ node.field_link.0.url.external ? '_blank' : '_self' }}"

1

aşağıdaki gibi bir şey de kullanabilirsiniz, hepsi çıkardığınız nesnenin türüne ve alan adına bağlıdır.

{{ paragraph.field_link.get(0).getUrl().toString() }}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.