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.
źródło
node.field_my_link.uri
zewnętrzny adres URL jest podobnyhttp://www.example.com
?file_url(node.field_my_link.uri)
, a jeślinode.field_my_link.uri
jest"http://www.example.com"
to działa (opuszczeniem URL bez zmian), ale jeślinode.field_my_link.uri
jest"internal:/"
to funkcja zwraca"/internal%3A/"
(zamiast"/"
) ..node.field_my_link.entity.uri.value
zwraca wartość zerową .. Jakieś inne pomysły?Możesz uzyskać dostęp do elementu tablicy renderowania bezpośrednio, w twoim przypadku:
źródło
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 .źródło
{% 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.Musiałem to zrobić na polu linku w bloku. To działało dobrze:
źródło
{{ content.field_my_link[0]['#url'] }}
bez renderowania , ponieważ w szablonie gałązek tablice renderowania są automatycznie renderowane po wydrukowaniu.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):
A jeśli chcesz wiedzieć, czy link jest zewnętrzny, czy nie (w moim przypadku był to cel), możesz użyć tego:
Przykład:
źródło
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:
źródło