Как получить действительный URL поля ссылки из шаблона ветки?


У меня есть поле ссылки с именем field_my_link (имя машины).

В шаблоне ветки я могу получить значение 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"/" и т. Д.


РЕДАКТИРОВАТЬ

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

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

Как я могу получить доступ к тому же значению в шаблоне ветки?

Я знаю, что могу сделать это в рамках предварительного процесса функция:

$variables['my_url'] = $url;

Затем получите доступ к URL-адресу в Twig, используя {{ my_url }}, но я бы избегал писать функцию предварительной обработки каждый раз, когда у меня есть поле ссылки.

Author: Andrea, 2016-04-26

10 answers

Ваш PHP из вашего последнего редактирования будет переведен в twig следующим образом:

{{ node.field_my_link.0.url }}

Это работает следующим образом, 0 возвращает первый элемент списка элементов поля, url получает объект url, и поскольку twig приведет этот объект в виде строки, это вызовет магический метод toString() и выведет URL-адрес в виде строкового значения.

Вам нужно использовать только url, потому что twig автоматически ищет метод getxyz(), если нет свойства с таким именем xyz.

 53
Author: 4k4, 2016-12-07 18:54:44

В вашем случае вы можете получить прямой доступ к элементу массива визуализации:

{{ node.field_my_link[0]['#url'] }}
 25
Author: Tim, 2016-10-22 06:02:55

Вы должны охватить оба случая: внешние и внутренние URL-адреса.

Сначала давайте проверим, является ли URL-адрес внешним и просто распечатаем его *.uri.

Иначе, если он внутренний, мы должны передать его имя маршрута и параметры через Drupal path($name, $parameters, $options) функция.

{% 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 %}
 19
Author: leymannx, 2017-10-22 07:29:55

Я должен был сделать это в поле ссылки в блоке. Это сработало хорошо:

{{ content.field_my_link[0]['#url']|render }}
 10
Author: cbovard, 2017-05-01 21:38:06

Я знаю, что это старый пост, но с последней версией 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' }}"
 8
Author: AnTSaSk, 2019-10-09 20:27:30

Вы также можете использовать что-то вроде следующего, все зависит от типа извлекаемого объекта и имени поля, в моем случае это был абзац с полем с именем field_link, и сработало следующее:

{{ paragraph.field_link.get(0).getUrl().toString() }}
 6
Author: Israel Morales, 2019-09-24 16:00:28

В абзаце, чтобы получить URL-адрес ссылки и имя ссылки -

<a href="{{ content.FIELD_LINK_NAME[0]['#url']|render }}">
   {{ content.FIELD_LINK_NAME[0]['#title']|render }}
</a>
 3
Author: Kashmiri, 2019-12-15 09:09:36

Я знаю это ужасно, но если ничего больше не сработает:

{{ link|replace({'internal:':''}) }}

Моя ситуация: доступ к полю ссылки с помощью переопределенного шаблона представлений: views-view-fields.html.twig

Я должен был получить переменную из:

row._entity.field_machine_name.value.0.uri

(Я отказался от попыток использовать переменную fields, по-видимому, вы можете получить свойство .content из этого, но не более того)

.... field_machine_name.значение - это просто плоский массив, в котором есть только ключ uri, А НЕ url, и фильтры, упомянутые в других ответах (toString(), рендеринг и т.д.), Здесь, похоже, просто не работают.

 1
Author: William Turrell, 2019-12-30 12:56:40

Вот еще один способ сделать это. В этом примере исключено использование поля Заголовка.

{% set link_url = content.field_link.0['#url'] %}
{% set link = link_url ? link_url : content.field_link.0['#title'] %}

{% if link %}
  {{ link.toString() }}
{% endif %}

Возможные результаты

# Input ---------------- Output -----------
# This is a node (23)    /relative/url
# <front>                /
# https://drupal.org     https://drupal.org
 0
Author: JFK, 2020-06-29 18:06:44

На самом деле есть гораздо более простое решение с использованием https://www.drupal.org/project/twig_field_value модуль

<a href="{{ content.FIELD_LINK_NAME|field_value|first['#url']|render }}">
  {{ content.FIELD_LINK_NAME|field_value|first['#title'] }}
</a>

Это будет работать как для внутренних, так и для внешних ссылок.

 0
Author: dekisha, 2021-02-08 09:45:01