Wie erhalte ich die gültige URL eines Linkfelds in einer Twig-Vorlage?

30

Ich habe ein Linkfeld mit dem Namen field_my_link(Computername).

Innerhalb einer Twig-Vorlage kann ich den URL-Wert des Links folgendermaßen abrufen:

{{ node.field_my_link.uri }}

Wenn sich in der URL des Links eine externe URL befindet, http://example.comfunktioniert dies z . B. gut.

Wenn jedoch in der URL des Links eine interne URL gespeichert ist "/node/11", erhalte ich einen Wert wie diesen:

"internal:/node/11"

mit dem internal:Präfix " ".

Wie kann ich die gültige URL erhalten?

Wenn die URL des Links beispielsweise http://example.com"Ich möchte" lautet http://example.com(dies funktioniert bereits), wenn die URL des Links /node/11"Ich möchte die relative URL" /node/11lautet, wenn die URL des Links <front>"Ich möchte die URL" lautet /usw .


BEARBEITEN

Ich kann den gewünschten Wert in einer PHP-Vorverarbeitungsfunktion erhalten, indem ich Folgendes verwende:

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

Wie kann ich in der Twig-Vorlage auf denselben Wert zugreifen?

Ich weiß, dass ich dies in der Vorverarbeitungsfunktion tun kann:

$variables['my_url'] = $url;

Greifen Sie dann mit auf die URL in Twig zu {{ my_url }}, aber ich würde es vermeiden, jedes Mal eine Vorverarbeitungsfunktion zu schreiben, wenn ich ein Linkfeld habe.

Andrea
quelle

Antworten:

38

Ihr PHP aus Ihrer letzten Bearbeitung würde folgendermaßen in twig übersetzt:

{{ node.field_my_link.0.url }}

Dies funktioniert so, 0gibt das erste Element urlder Feldelementliste zurück, ruft das URL-Objekt ab und ruft die magische Methode toString () auf, da twig dieses Objekt als String umwandelt und die URL als String-Wert ausgibt.

Sie müssen nur verwenden url, da twig automatisch nach der Methode sucht, getxyz()wenn es keine Eigenschaft mit diesem Namen gibt xyz.

4k4
quelle
Vielen Dank. Jetzt mache ich einen Test mit dieser Funktion. Wissen Sie, ob ich diese Funktion auch für die URIs von Links verwenden kann? Was passiert, wenn node.field_my_link.urieine externe URL wie http://www.example.com?
Andrea
1
Ich habe versucht , mit file_url(node.field_my_link.uri), und wenn node.field_my_link.uriist "http://www.example.com"es funktioniert (es läßt die URL unverändert), aber wenn node.field_my_link.uriist "internal:/"die Funktion zurück "/internal%3A/"(statt "/") ..
Andrea
Ich habe gerade Ihre Bearbeitung gesehen. Leider funktioniert es nicht, der Code node.field_my_link.entity.uri.valuegibt einen Nullwert zurück. Irgendwelche anderen Ideen?
Andrea
@ Andrea, ich habe meine Antwort bearbeitet.
4.
1
Ja, es funktioniert. Die Syntax ist ein bisschen gruselig, aber es macht seinen Job.
Andrea
17

Sie können in Ihrem Fall direkt auf das Render-Array-Element zugreifen:

{{ node.field_my_link[0]['#url'] }}
Tim
quelle
Dieser arbeitete für meine.
esQmo_
10

Sie müssen beide Fälle abdecken: externe und interne URLs.

Überprüfen wir zunächst, ob die URL extern ist, und drucken Sie sie einfach aus *.uri.

Else , wenn es interne müssen wir seine Routennamen und Parameter durch Drupals verdrahten path($name, $parameters, $options)Funktion.

{% 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
quelle
2
Vielen Dank, das ist genau das, was ich brauchte: die URL von einem Link - Feld als String erhält: {% set url = path(node.field_link.0.url.routeName, node.field_link.0.url.routeParameters) %}Dann kann ich einen benutzerdefinierten Link erstellen: ` <a href="{{ url }}" class="mycustomclass">custom link text</a>Nein Vorprozess benötigt und keine Notwendigkeit, über content.field_link zu gehen, so dass keine Notwendigkeit , etwas zu tun in die 'Anzeige verwalten' für das Linkfeld, nur um die URL zu erhalten.
user33560
8

Ich musste das auf einem Linkfeld in einem Block machen. Das hat gut funktioniert:

{{ content.field_my_link[0]['#url']|render }}
cbovard
quelle
4
Die Verwendung {{ content.field_my_link[0]['#url'] }}ohne Rendern ist ebenfalls in Ordnung , da in Zweigvorlagen Render-Arrays beim Drucken automatisch gerendert werden.
eric.chenchao
5

Ich weiß, es ist ein alter Beitrag, aber mit der letzten Version von Drupal 8 (8.6) können Sie die URL für beide Versionen (extern und intern) direkt anzeigen:

node.field_link.0.url

Und wenn Sie wissen möchten, ob der Link extern ist oder nicht (in meinem Fall für das Ziel), können Sie Folgendes verwenden:

node.field_link.0.url.external

Beispiel:

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

Sie können auch so etwas wie das Folgende verwenden. Dies hängt alles von der Art des zu extrahierenden Objekts und dem Feldnamen ab. In meinem Fall war es ein Absatz mit einem Feld namens field_link und es hat Folgendes funktioniert:

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