如何从Twig模板中获取链接字段的有效URL?


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是“ 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;

然后使用来访问Twig中的url {{ my_url }},但我避免每次有链接字段时都编写一个预处理函数。

Answers:


38

您最近一次编辑的PHP将变成如下所示的树枝:

{{ node.field_my_link.0.url }}

这样工作,0返回字段项列表的第一项,url获取url对象,并且由于twig将此对象转换为字符串,因此将调用魔术方法toString()并将url输出为字符串值。

您只需要使用url,因为getxyz()如果没有具有该名称的属性,则twig会自动查找该方法xyz


谢谢。现在,我使用此功能进行测试。您知道我是否也可以在链接的URI上使用此功能吗?如果node.field_my_link.uri外部网址是什么样的,会发生什么http://www.example.com
安德里亚(Andrea)

1
我试着用file_url(node.field_my_link.uri)了,如果node.field_my_link.uri"http://www.example.com"它的工作原理(离开网址不变),但如果node.field_my_link.uri"internal:/"在函数返回"/internal%3A/"(代替"/")..
安德烈

我刚刚看到了您的修改。可悲的是,它不起作用,代码node.field_my_link.entity.uri.value返回了空值。还有其他想法吗?
安德里亚(Andrea)

@Andrea,我编辑了答案。
4k4,11

1
是的,它有效。语法有点吓人,但它确实起作用。
安德里亚(Andrea)

17

在这种情况下,您可以直接访问render array元素:

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

这个为我工作。
esQmo_

10

您必须同时涵盖两种情况:外部和内部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 %}

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,因此无需执行任何操作链接字段的“管理显示”仅用于获取网址。
user33560'3

8

我必须在块中的链接字段上执行此操作。这很好用:

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

4
{{ content.field_my_link[0]['#url'] }}不使用render也可以使用,如在树枝模板中一样,在打印时自动渲染render数组。
eric.chenchao

5

我知道这是一篇旧文章,但是使用Drupal 8的最新版本(8.6),您可以直接显示两个版本(外部和内部)的网址:

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() }}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.