Bagaimana cara mendapatkan URL yang valid dari bidang Tautan dari dalam template Ranting?

30

Saya memiliki bidang Tautan bernama field_my_link(nama mesin).

Di dalam template Twig saya bisa mendapatkan nilai URL tautan dengan ini:

{{ node.field_my_link.uri }}

Jika di dalam URL Tautan ada URL eksternal , mis http://example.com. Berfungsi baik.

Tapi, jika di dalam URL Tautan ada disimpan URL internal , misalnya "/node/11", saya mendapatkan nilai seperti ini:

"internal:/node/11"

dengan internal:awalan " ".

Bagaimana saya bisa mendapatkan URL yang valid ?

Misalnya, jika URL tautan adalah " http://example.com" Saya ingin " http://example.com" (ini sudah berfungsi), jika URL tautannya adalah " /node/11" Saya ingin URL relatif " /node/11", jika URL tautannya adalah " <front>" Saya ingin URL " /", dll. .


EDIT

Saya bisa mendapatkan nilai yang saya inginkan dalam fungsi preprocess PHP, menggunakan ini:

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

Bagaimana saya bisa mengakses nilai yang sama dalam template Twig?

Saya tahu saya bisa melakukan ini dalam fungsi preprocess:

$variables['my_url'] = $url;

Kemudian akses url dalam Twig menggunakan {{ my_url }}, tetapi saya akan menghindari untuk menulis fungsi preprocess setiap kali saya memiliki bidang tautan.

Andrea
sumber

Jawaban:

38

PHP Anda dari hasil edit terakhir Anda akan diterjemahkan menjadi ranting seperti ini:

{{ node.field_my_link.0.url }}

Ini berfungsi seperti ini, 0mengembalikan item pertama dari daftar item bidang, urlmendapatkan objek url dan karena ranting akan melemparkan objek ini sebagai string, ini akan memanggil metode ajaib toString () dan akan menampilkan url sebagai nilai string.

Anda hanya perlu menggunakan url, karena ranting mencari metode secara otomatis getxyz()jika tidak ada properti dengan nama itu xyz.

4k4
sumber
Terima kasih. Sekarang saya membuat tes dengan fungsi ini. Apakah Anda tahu apakah saya dapat menggunakan fungsi ini juga pada URI tautan? Apa yang terjadi jika node.field_my_link.uriseperti url eksternal http://www.example.com?
Andrea
1
Aku mencoba dengan file_url(node.field_my_link.uri), dan jika node.field_my_link.uriini "http://www.example.com"bekerja (meninggalkan url tidak berubah), tetapi jika node.field_my_link.uriini "internal:/"kembali fungsi "/internal%3A/"(bukan "/") ..
Andrea
Saya baru saja melihat hasil edit Anda .. Sayangnya tidak berfungsi, kode node.field_my_link.entity.uri.valuemengembalikan nilai nol .. Ada ide lain?
Andrea
@ Andrea, saya mengedit jawaban saya.
4k4
1
Ya, itu berhasil. Sintaksnya agak menakutkan, tetapi ia melakukan tugasnya.
Andrea
17

Anda dapat mengakses elemen array render secara langsung, dalam kasus Anda:

{{ node.field_my_link[0]['#url'] }}
Tim
sumber
Yang ini berhasil untuk saya.
esQmo_
10

Anda harus membahas kedua kasus: URL eksternal dan internal.

Pertama mari kita periksa apakah URL itu eksternal dan cukup cetak *.uri.

Jika itu internal kita harus mentransfer nama rute dan parameternya melalui path($name, $parameters, $options)fungsi Drupal .

{% 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
sumber
2
Terima kasih, ini persis yang saya butuhkan: dapatkan url dari bidang tautan sebagai string: {% set url = path(node.field_link.0.url.routeName, node.field_link.0.url.routeParameters) %}Lalu saya dapat membuat tautan khusus: ` <a href="{{ url }}" class="mycustomclass">custom link text</a>Tidak perlu praproses dan tidak perlu melalui content.field_link, jadi tidak perlu melakukan apa pun di 'Kelola tampilan' untuk bidang tautan hanya untuk mendapatkan url.
user33560
8

Saya harus melakukan ini di Bidang Tautan di Blok. Ini bekerja dengan baik:

{{ content.field_my_link[0]['#url']|render }}
cbovard
sumber
4
Juga boleh digunakan {{ content.field_my_link[0]['#url'] }}tanpa render , seperti pada templat ranting, render array secara otomatis ditampilkan saat dicetak.
eric.chenchao
5

Saya tahu ini adalah pos lama tetapi dengan versi terakhir Drupal 8 (8.6) Anda dapat langsung menampilkan url untuk kedua versi (eksternal dan internal):

node.field_link.0.url

Dan jika Anda perlu tahu apakah tautannya eksternal atau tidak (untuk kasus saya itu untuk target), Anda dapat menggunakannya:

node.field_link.0.url.external

Contoh:

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

Anda juga dapat menggunakan sesuatu seperti berikut ini, semuanya tergantung pada jenis objek yang Anda ekstrak dan nama bidang, Dalam kasus saya ini adalah paragraf dengan bidang bernama field_link dan yang berikut berfungsi:

{{ paragraph.field_link.get(0).getUrl().toString() }}
Israel Morales
sumber