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

30

У меня есть поле Link с именем 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-адрес " /" и т. Д. ,


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

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

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

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

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

$variables['my_url'] = $url;

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

Andrea
источник

Ответы:

39

Ваш PHP из вашего последнего редактирования будет выглядеть так:

{{ node.field_my_link.0.url }}

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

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

4k4
источник
Спасибо. Сейчас я делаю тест с этой функцией. Знаете ли вы, можно ли использовать эту функцию также в 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возвращает нулевое значение. Есть еще идеи?
Андреа
@ Андреа, я отредактировал свой ответ.
4k4
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 %}
leymannx
источник
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 }}
cbovard
источник
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' }}"
AnTSaSk
источник
1

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

{{ paragraph.field_link.get(0).getUrl().toString() }}
Израиль Моралес
источник