Як отримати дійсну URL-адресу поля Посилання з шаблону Twig?


30

У мене є ім'я поля Посилання field_my_link(ім'я машини).

У шаблоні Twig я можу отримати значення URL-адреси посилання за допомогою цього:

{{ node.field_my_link.uri }}

Якщо всередині URL-адреси посилання є зовнішня URL-адреса, наприклад, http://example.comце добре працює.

Але якщо всередині URL-адреси посилання зберігається внутрішня URL-адреса, наприклад "/node/11", я отримую таке значення:

"internal:/node/11"

з internal:префіксом " ".

Як я можу отримати дійсну URL-адресу?

Наприклад, якщо URL-адреса посилання " http://example.com" Я хочу " http://example.com" (це вже працює), якщо URL-адреса посилання " /node/11" Я хочу відносну URL-адресу " /node/11", якщо URL-адреса посилання " <front>" Я хочу URL-адресу " /" і т.д. .


EDIT

Я можу отримати потрібне значення у функції попередньої обробки PHP, використовуючи це:

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

Як я можу отримати доступ до одного і того ж значення в шаблоні Twig?

Я знаю, що можу це зробити в рамках функції попередньої обробки:

$variables['my_url'] = $url;

Потім {{ my_url }}перейдіть до URL-адреси в Twig за допомогою , але я б уникав писати функцію попередньої обробки щоразу, коли у мене є поле посилання.

Відповіді:


38

Ваш PHP з останньої редакції перекладається на гілочку так:

{{ node.field_my_link.0.url }}

Це працює так, 0повертає перший елемент списку елементів поля, urlотримує об’єкт url і тому, що гілочка передасть цей об’єкт як рядок, це викличе магічний метод toString () і виведе URL-адресу як значення рядка.

Вам потрібно використовувати лише те url, що гілочка автоматично шукає метод, getxyz()якщо немає властивості з цим іменем xyz.


Дякую. Тепер я роблю тест з цією функцією. Чи знаєте ви, чи можу я використовувати цю функцію також у URI-адресах посилань? Що станеться, якщо node.field_my_link.uriподібна зовнішня URL-адреса http://www.example.com?
Андреа

1
Я спробував з file_url(node.field_my_link.uri), і якщо node.field_my_link.uriце "http://www.example.com"працює (він залишає URL без змін), але якщо node.field_my_link.uriце "internal:/"функція повертає "/internal%3A/""/") ..
Andrea

Я щойно побачив вашу редакцію. На жаль, вона не працює, код node.field_my_link.entity.uri.valueповертає нульове значення. Будь-які інші ідеї?
Андреа

@Andrea, я змінив свою відповідь.
4к4,

1
Так, це працює. Синтаксис трохи страшно, але він робить свою роботу.
Андреа

17

Ви можете отримати доступ до елемента масиву візуалізації безпосередньо у вашому випадку:

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

Цей працював на мою.
esQmo_

10

Ви повинні охопити обидва випадки: зовнішні та внутрішні URL-адреси.

Спершу перевіримо, чи URL-адреса зовнішня, і просто надрукуємо її *.uri.

В іншому випадку, якщо він внутрішній, ми повинні вказати його назву маршруту та параметри через path($name, $parameters, $options)функцію 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 %}

2
Дякую, це саме те, що мені було потрібно: отримати URL-адресу з поля посилань у вигляді рядка: {% set url = path(node.field_link.0.url.routeName, node.field_link.0.url.routeParameters) %}Тоді я можу створити власну посилання: ` <a href="{{ url }}" class="mycustomclass">custom link text</a>Не потрібна попередня обробка та не потрібно переходити через content.field_link, тому не потрібно нічого робити в "Керувати дисплеєм" для поля посилань лише для отримання URL-адреси.
user33560

8

Мені довелося це зробити на Посилальному полі в блоці. Це добре спрацювало:

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

4
Також чудово використовувати {{ content.field_my_link[0]['#url'] }}без візуалізації , як у шаблоні гілочок, масив візуалізації автоматично відображається під час друку.
eric.chenchao

5

Я знаю, що це стара публікація, але з останньою версією Drupal 8 (8.6) ви можете безпосередньо відображати URL для обох версій (зовнішньої та внутрішньої):

node.field_link.0.url

І якщо вам потрібно знати, посилання зовнішнє чи ні (в моєму випадку воно було цільовим), ви можете використовувати це:

node.field_link.0.url.external

Приклад:

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

1

Ви також можете використовувати щось на кшталт наступного, все залежить від типу об'єкта, який ви виймаєте, та назви поля. У моєму випадку це був абзац із полем з назвою field_link і працювало наступне:

{{ paragraph.field_link.get(0).getUrl().toString() }}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.