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.

Andrea
fonte

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.

4k4
fonte
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'] }}
Tim
fonte
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 %}
leymannx
fonte
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 }}
cbovard
fonte
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' }}"
AnTSaSk
fonte
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() }}
Israel Morales
fonte