Jak uzyskać prawidłowy adres URL pola linku z szablonu Twig?

30

Mam pole Link o nazwie field_my_link(nazwa komputera).

W szablonie Twig mogę uzyskać adres URL linku za pomocą:

{{ node.field_my_link.uri }}

Jeśli w adresie URL linku znajduje się zewnętrzny adres URL, np http://example.com. Działa dobrze.

Ale jeśli w adresie URL linku znajduje się wewnętrzny adres URL, np. "/node/11"Otrzymuję taką wartość:

"internal:/node/11"

z internal:prefiksem „ ”.

Jak mogę uzyskać prawidłowy adres URL?

Na przykład, jeśli adres URL linku to „ http://example.com„ Chcę ” http://example.com” (to już działa), jeśli adres URL linku to „ /node/11„ Chcę względny adres URL ” /node/11”, jeśli adres URL linku to „ <front>„ Chcę adres URL ” /” itp. .


EDYTOWAĆ

Mogę uzyskać żądaną wartość w ramach funkcji wstępnego przetwarzania PHP, używając tego:

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

Jak mogę uzyskać dostęp do tej samej wartości w szablonie Twig?

Wiem, że mogę to zrobić w ramach funkcji wstępnego przetwarzania:

$variables['my_url'] = $url;

Następnie uzyskaj dostęp do adresu URL w Twig za pomocą {{ my_url }}, ale unikałbym pisania funkcji wstępnego przetwarzania za każdym razem, gdy mam pole linku.

Andrea
źródło

Odpowiedzi:

38

Twój PHP z najnowszej edycji przełożyłby się na taką gałązkę:

{{ node.field_my_link.0.url }}

Działa to w ten sposób, 0zwraca pierwszy element listy elementów pola, urlpobiera obiekt url, a ponieważ gałązka rzuci ten obiekt jako ciąg, wywoła magiczną metodę toString () i wyświetli url jako wartość ciągu.

Musisz tylko użyć url, ponieważ gałązka automatycznie szuka metody, getxyz()jeśli nie ma właściwości o tej nazwie xyz.

4k4
źródło
Dziękuję Ci. Teraz wykonuję test z tą funkcją. Czy wiesz, czy mogę korzystać z tej funkcji również na URI łączy? Co się stanie, jeśli node.field_my_link.urizewnętrzny adres URL jest podobny http://www.example.com?
Andrea
1
Starałem się file_url(node.field_my_link.uri), a jeśli node.field_my_link.urijest "http://www.example.com"to działa (opuszczeniem URL bez zmian), ale jeśli node.field_my_link.urijest "internal:/"to funkcja zwraca "/internal%3A/"(zamiast "/") ..
Andrea
Właśnie zobaczyłem twoją edycję .. Niestety nie działa, kod node.field_my_link.entity.uri.valuezwraca wartość zerową .. Jakieś inne pomysły?
Andrea
@Andrea, zredagowałem swoją odpowiedź.
4k4 30.04.16
1
Tak, to działa. Składnia jest nieco przerażająca, ale spełnia swoje zadanie.
Andrea
17

Możesz uzyskać dostęp do elementu tablicy renderowania bezpośrednio, w twoim przypadku:

{{ node.field_my_link[0]['#url'] }}
Tim
źródło
Ten działał dla mnie.
esQmo_
10

Musisz uwzględnić oba przypadki: zewnętrzne i wewnętrzne adresy URL.

Najpierw sprawdźmy, czy adres URL jest zewnętrzny i po prostu go wydrukuj *.uri.

W przeciwnym razie, jeśli jest wewnętrzny, musimy połączyć jego nazwę trasy i parametry za pomocą path($name, $parameters, $options)funkcji Drupala .

{% 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 %}
leymannx
źródło
2
Dziękuję, właśnie tego potrzebowałem: pobierz adres URL z pola linku jako ciąg: {% set url = path(node.field_link.0.url.routeName, node.field_link.0.url.routeParameters) %}Następnie mogę utworzyć niestandardowy link: ` <a href="{{ url }}" class="mycustomclass">custom link text</a>Nie jest wymagane żadne wstępne przetwarzanie i nie trzeba przechodzić przez content.field_link, więc nie trzeba nic robić w „Zarządzaj wyświetlaniem” pola linku, aby uzyskać adres URL.
user33560
8

Musiałem to zrobić na polu linku w bloku. To działało dobrze:

{{ content.field_my_link[0]['#url']|render }}
cbovard
źródło
4
Można także używać {{ content.field_my_link[0]['#url'] }}bez renderowania , ponieważ w szablonie gałązek tablice renderowania są automatycznie renderowane po wydrukowaniu.
eric.chenchao
5

Wiem, że to stary post, ale w ostatniej wersji Drupala 8 (8.6) możesz bezpośrednio wyświetlić adres URL dla obu wersji (zewnętrznej i wewnętrznej):

node.field_link.0.url

A jeśli chcesz wiedzieć, czy link jest zewnętrzny, czy nie (w moim przypadku był to cel), możesz użyć tego:

node.field_link.0.url.external

Przykład:

<a href="{{ node.field_link.0.url }}" title="Title" target="{{ node.field_link.0.url.external ? '_blank' : '_self' }}"
AnTSaSk
źródło
1

możesz także użyć czegoś takiego, jak poniżej, wszystko zależy od typu wydobywanego obiektu i nazwy pola. W moim przypadku był to akapit z polem o nazwie field_link i działało:

{{ paragraph.field_link.get(0).getUrl().toString() }}
Israel Morales
źródło