Como obter o URL válido de um campo Link de dentro de um modelo Twig?


30

Eu tenho um campo Link chamado field_my_link(nome da máquina).

Dentro de um modelo Twig, posso obter o valor da URL do link com este:

{{ node.field_my_link.uri }}

Se dentro do URL do link houver um URL externo , por exemplo, http://example.comele funcionará bem.

Mas, se dentro da URL do link houver uma URL interna armazenada , por exemplo "/node/11", recebo um valor como este:

"internal:/node/11"

com o internal:prefixo " ".

Como posso obter o URL válido ?

Por exemplo, se o URL do link for " http://example.com" Quero " http://example.com" (isso já funciona), se o URL do link for " /node/11" Quero o URL relativo " /node/11", se o URL do link for " <front>" Quero o URL " /", etc. .


EDITAR

Posso obter o valor que desejo dentro de uma função de pré-processo PHP, usando este:

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

Como posso acessar o mesmo valor no modelo Twig?

Eu sei que posso fazer isso dentro da função pré-processo:

$variables['my_url'] = $url;

Em seguida, acesse o URL dentro do Twig usando {{ my_url }}, mas evitaria escrever uma função de pré-processo toda vez que tiver um campo de link.

Respostas:


38

Seu PHP da sua edição mais recente se traduziria em galho assim:

{{ node.field_my_link.0.url }}

Isso funciona assim, 0retorna o primeiro item da lista de itens de campo, urlobtém o objeto url e, como o twig lançará esse objeto como uma string, isso chamará o método mágico toString () e produzirá o url como um valor de string.

Você só precisa usar url, porque o twig procura automaticamente o método getxyz()se não houver propriedade com esse nome xyz.


Obrigado. Agora eu faço um teste com esta função. Você sabe se posso usar essa função também nos URIs dos links? O que acontecerá se node.field_my_link.urifor como um URL externo http://www.example.com?
26516 Andrea Andrea

1
Eu tentei com file_url(node.field_my_link.uri), e se node.field_my_link.urié "http://www.example.com"ele funciona (ele deixa a url inalterado), mas se node.field_my_link.urié "internal:/"a função retorna "/internal%3A/"(em vez de "/") ..
Andrea

Acabei de ver sua edição .. Infelizmente não funciona, o código node.field_my_link.entity.uri.valueretorna um valor nulo. Alguma outra idéia?
Andrea

@ Andrea, eu editei minha resposta.
4k4

1
Sim, funciona. A sintaxe é um pouco assustadora, mas faz seu trabalho.
30516 Andrea Andrea

17

Você pode acessar o elemento da matriz de renderização diretamente, no seu caso:

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

Este funcionou para o meu.
esQmo_

10

Você precisa cobrir os dois casos: URLs externos e internos.

Primeiro vamos verificar se o URL é externo e simplesmente imprimi-lo *.uri.

Caso contrário, se for interno , precisamos conectar seu nome e parâmetros de rota através da path($name, $parameters, $options)função do 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
Obrigado, é exatamente isso que eu precisava: obtenha o URL de um campo de link como uma sequência: {% set url = path(node.field_link.0.url.routeName, node.field_link.0.url.routeParameters) %}Então eu posso criar um link personalizado: ` <a href="{{ url }}" class="mycustomclass">custom link text</a>Nenhum pré-processo é necessário e não é necessário acessar content.field_link, portanto, não é necessário fazer nada em o 'Gerenciar exibição' para o campo do link apenas para obter o URL.
User33560 01/01

8

Eu tive que fazer isso em um campo de link em um bloco. Isso funcionou bem:

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

4
Também é bom usar {{ content.field_my_link[0]['#url'] }}sem renderização , como no modelo de galho, a matriz de renderização é renderizada automaticamente quando impressa.
Eric.chenchao

5

Eu sei que é um post antigo, mas com a última versão do Drupal 8 (8.6), você pode exibir diretamente o URL da versão (externa e interna):

node.field_link.0.url

E se você precisar saber se o link é externo ou não (no meu caso, foi para o destino), você pode usar isso:

node.field_link.0.url.external

Exemplo:

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

1

você também pode usar algo como o seguinte, tudo depende do tipo de objeto que você está extraindo e do nome do campo. No meu caso, era um parágrafo com um campo chamado field_link e o seguinte funcionou:

{{ paragraph.field_link.get(0).getUrl().toString() }}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.