¿Cómo obtener la URL válida de un campo Enlace desde una plantilla Twig?

30

Tengo un campo de enlace llamado field_my_link(nombre de la máquina).

Dentro de una plantilla Twig puedo obtener el valor de URL del enlace con esto:

{{ node.field_my_link.uri }}

Si dentro de la URL del enlace hay una URL externa , por ejemplo http://example.com, funciona bien.

Pero, si dentro de la URL del enlace se almacena una URL interna , por ejemplo "/node/11", obtengo un valor como este:

"internal:/node/11"

con el internal:prefijo " ".

¿Cómo puedo obtener la URL válida ?

Por ejemplo, si la URL del enlace es " http://example.com" Quiero " http://example.com" (esto ya funciona), si la URL del enlace es " /node/11" Quiero la URL relativa " /node/11", si la URL del enlace es " <front>" Quiero la URL " /", etc. .


EDITAR

Puedo obtener el valor que quiero dentro de una función de preproceso de PHP, usando esto:

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

¿Cómo puedo acceder al mismo valor dentro de la plantilla Twig?

Sé que puedo hacer esto dentro de la función de preproceso:

$variables['my_url'] = $url;

Luego acceda a la URL dentro de Twig usando {{ my_url }}, pero evitaría escribir una función de preproceso cada vez que tenga un campo de enlace.

Andrea
fuente

Respuestas:

38

Su PHP de su última edición se traduciría en una ramita como esta:

{{ node.field_my_link.0.url }}

Esto funciona así, 0devuelve el primer elemento de la lista de elementos de campo, urlobtiene el objeto url y porque twig convertirá este objeto como una cadena, llamará al método mágico toString () y generará la url como un valor de cadena.

Solo necesita usar url, porque twig busca automáticamente el método getxyz()si no hay ninguna propiedad con ese nombre xyz.

4k4
fuente
Gracias. Ahora hago una prueba con esta función. ¿Sabes si puedo usar esta función también en los URI de enlaces? ¿Qué pasa si node.field_my_link.uries como una url externa http://www.example.com?
Andrea
1
Probé con file_url(node.field_my_link.uri), y si node.field_my_link.uries "http://www.example.com"que funciona (que deja la url sin cambios), pero si node.field_my_link.uries "internal:/"la función devuelve "/internal%3A/"(en lugar de "/") ..
Andrea
Acabo de ver su edición ... Lamentablemente no funciona, el código node.field_my_link.entity.uri.valuedevuelve un valor nulo ... ¿Alguna otra idea?
Andrea
@ Andrea, edité mi respuesta.
4k4
1
Si, funciona. La sintaxis da un poco de miedo, pero hace su trabajo.
Andrea
17

Puede acceder directamente al elemento de la matriz de representación, en su caso:

{{ node.field_my_link[0]['#url'] }}
Tim
fuente
Este funcionó para mi.
esQmo_
10

Debe cubrir ambos casos: URL externas e internas.

Primero verifiquemos si la URL es externa y simplemente imprima su *.uri.

De lo contrario, si es interno , tenemos que conectar su nombre de ruta y parámetros a través de la path($name, $parameters, $options)función de 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
fuente
2
Gracias, esto es exactamente lo que necesitaba: obtener la url de un campo de enlace como una cadena: {% set url = path(node.field_link.0.url.routeName, node.field_link.0.url.routeParameters) %}Entonces puedo crear un enlace personalizado: ` <a href="{{ url }}" class="mycustomclass">custom link text</a>No se necesita preproceso y no es necesario ir a través de content.field_link, así que no es necesario hacer nada en 'Administrar pantalla' para el campo de enlace solo para obtener la URL.
user33560
8

Tenía que hacer esto en un campo de enlace en un bloque. Esto funcionó bien:

{{ content.field_my_link[0]['#url']|render }}
cbovard
fuente
44
También está bien usarlo {{ content.field_my_link[0]['#url'] }}sin renderizar , ya que en la plantilla de ramita, la matriz de renderizado se renderiza automáticamente cuando se imprime.
eric.chenchao
5

Sé que es una publicación anterior, pero con la última versión de Drupal 8 (8.6) puede mostrar directamente la URL de ambas versiones (externa e interna):

node.field_link.0.url

Y si necesita saber si el enlace es externo o no (en mi caso fue para el objetivo), puede usar eso:

node.field_link.0.url.external

Ejemplo:

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

También puede usar algo como lo siguiente, todo depende del tipo de objeto que está extrayendo y el nombre del campo. En mi caso, era un párrafo con un campo llamado field_link y lo siguiente funcionó:

{{ paragraph.field_link.get(0).getUrl().toString() }}
Israel Morales
fuente