Come ottenere l'URL valido di un campo Link all'interno di un modello Twig?


30

Ho un campo Link chiamato field_my_link(nome macchina).

All'interno di un modello Twig posso ottenere il valore dell'URL del link con questo:

{{ node.field_my_link.uri }}

Se all'interno dell'URL del collegamento è presente un URL esterno , ad esempio http://example.com, funziona bene.

Ma, se all'interno dell'URL del collegamento è memorizzato un URL interno , ad esempio "/node/11", ottengo un valore come questo:

"internal:/node/11"

con il internal:prefisso " ".

Come posso ottenere l' URL valido ?

Ad esempio, se l'URL del collegamento è " http://example.com" Voglio " http://example.com" (funziona già), se l'URL del collegamento è " /node/11" Voglio l'URL relativo " /node/11", se l'URL del collegamento è " <front>" Voglio l'URL " /", ecc. .


MODIFICARE

Posso ottenere il valore desiderato all'interno di una funzione di preelaborazione PHP, usando questo:

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

Come posso accedere allo stesso valore all'interno del modello Twig?

So di poterlo fare all'interno della funzione di preelaborazione:

$variables['my_url'] = $url;

Quindi accedere all'URL all'interno di Twig usando {{ my_url }}, ma eviterei di scrivere una funzione di pre-elaborazione ogni volta che ho un campo di collegamento.

Risposte:


38

Il tuo PHP dall'ultima modifica si tradurrebbe in un ramoscello in questo modo:

{{ node.field_my_link.0.url }}

Funziona in questo modo, 0restituisce il primo elemento dell'elenco degli elementi del campo, urlottiene l'oggetto url e poiché ramoscello lancerà questo oggetto come stringa, questo chiamerà il metodo magico a String () e genererà l'URL come valore stringa.

Devi solo usarlo url, perché il ramoscello cerca automaticamente il metodo getxyz()se non ci sono proprietà con quel nome xyz.


Grazie. Ora faccio un test con questa funzione. Sai se posso usare questa funzione anche sugli URI dei link? Cosa succede se node.field_my_link.uriè simile a un URL esterno http://www.example.com?
Andrea,

1
Ho provato con file_url(node.field_my_link.uri), e se node.field_my_link.uriè "http://www.example.com"funziona (lascia l'url invariato), ma se node.field_my_link.uriè "internal:/"la funzione restituisce "/internal%3A/"(invece di "/") ..
Andrea

Ho appena visto la tua modifica .. Purtroppo non funziona, il codice node.field_my_link.entity.uri.valuerestituisce un valore nullo .. Altre idee?
Andrea,

@Andrea, ho modificato la mia risposta.
4k4,

1
Sì, funziona. La sintassi è un po 'spaventosa, ma fa il suo lavoro.
Andrea,

17

Puoi accedere direttamente all'elemento array di rendering, nel tuo caso:

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

Questo ha funzionato per il mio.
esQmo_

10

Devi coprire entrambi i casi: URL esterni e interni.

Per prima cosa controlliamo se l'URL è esterno e stampiamo semplicemente il suo *.uri.

Altrimenti, se è interno, dobbiamo collegare il nome e i parametri della sua rotta attraverso la path($name, $parameters, $options)funzione di 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
Grazie, questo è esattamente ciò di cui avevo bisogno: ottenere l'URL da un campo di collegamento come una stringa: {% set url = path(node.field_link.0.url.routeName, node.field_link.0.url.routeParameters) %}Quindi posso creare un collegamento personalizzato: ` <a href="{{ url }}" class="mycustomclass">custom link text</a>Non è necessario alcun processo preliminare e non è necessario passare tramite content.field_link, quindi non è necessario fare nulla in il 'Gestisci display' per il campo link solo per ottenere l'URL.
user33560

8

Ho dovuto farlo su un campo link in un blocco. Questo ha funzionato bene:

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

4
Va anche bene usare {{ content.field_my_link[0]['#url'] }}senza rendering , come nel modello di ramoscello, l'array di rendering viene automaticamente visualizzato quando viene stampato.
eric.chenchao,

5

So che è un vecchio post ma con l'ultima versione di Drupal 8 (8.6) puoi visualizzare direttamente l'URL sia per la versione (esterna che interna):

node.field_link.0.url

E se hai bisogno di sapere se il link è esterno o meno (nel mio caso era per il target), puoi usare quello:

node.field_link.0.url.external

Esempio:

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

1

puoi anche usare qualcosa di simile al seguente, tutto dipende dal tipo di oggetto che stai estraendo e dal nome del campo, Nel mio caso era un paragrafo con un campo chiamato field_link e il seguente ha funzionato:

{{ paragraph.field_link.get(0).getUrl().toString() }}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.