Как получить действительный 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 }}
, но я бы избегал писать функцию предварительной обработки каждый раз, когда у меня есть поле ссылки.
10 answers
Ваш PHP из вашего последнего редактирования будет переведен в twig следующим образом:
{{ node.field_my_link.0.url }}
Это работает следующим образом, 0
возвращает первый элемент списка элементов поля, url
получает объект url, и поскольку twig приведет этот объект в виде строки, это вызовет магический метод toString() и выведет URL-адрес в виде строкового значения.
Вам нужно использовать только url
, потому что twig автоматически ищет метод getxyz()
, если нет свойства с таким именем xyz
.
В вашем случае вы можете получить прямой доступ к элементу массива визуализации:
{{ node.field_my_link[0]['#url'] }}
Вы должны охватить оба случая: внешние и внутренние 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 %}
Я должен был сделать это в поле ссылки в блоке. Это сработало хорошо:
{{ content.field_my_link[0]['#url']|render }}
Я знаю, что это старый пост, но с последней версией 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' }}"
Вы также можете использовать что-то вроде следующего, все зависит от типа извлекаемого объекта и имени поля, в моем случае это был абзац с полем с именем field_link, и сработало следующее:
{{ paragraph.field_link.get(0).getUrl().toString() }}
В абзаце, чтобы получить URL-адрес ссылки и имя ссылки -
<a href="{{ content.FIELD_LINK_NAME[0]['#url']|render }}">
{{ content.FIELD_LINK_NAME[0]['#title']|render }}
</a>
Я знаю это ужасно, но если ничего больше не сработает:
{{ link|replace({'internal:':''}) }}
Моя ситуация: доступ к полю ссылки с помощью переопределенного шаблона представлений: views-view-fields.html.twig
Я должен был получить переменную из:
row._entity.field_machine_name.value.0.uri
(Я отказался от попыток использовать переменную fields
, по-видимому, вы можете получить свойство .content из этого, но не более того)
.... field_machine_name.значение - это просто плоский массив, в котором есть только ключ uri
, А НЕ url
, и фильтры, упомянутые в других ответах (toString(), рендеринг и т.д.), Здесь, похоже, просто не работают.
Вот еще один способ сделать это. В этом примере исключено использование поля Заголовка.
{% 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
На самом деле есть гораздо более простое решение с использованием 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>
Это будет работать как для внутренних, так и для внешних ссылок.