it-swarm.com.de

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

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

Innerhalb einer Twig Vorlage) kann ich den URL-Wert des Links damit abrufen:

{{ node.field_my_link.uri }}

Wenn sich in der URL des Links eine externe URL befindet, z. http://example.com Es funktioniert gut.

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

"internal:/node/11"

mit dem Präfix "internal:".

Wie kann ich die gültige URL erhalten?

Wenn die URL des Links beispielsweise "http://example.com" Lautet, möchte ich "http://example.com" (Dies funktioniert bereits), wenn die URL des Links "/node/11" Lautet, möchte ich die relative URL "/node/11", Wenn die URL des Links "<front>" Ist, möchte ich die URL "/" Usw.


EDIT

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

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

Wie kann ich innerhalb der Vorlage Twig) auf denselben Wert zugreifen?

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

$variables['my_url'] = $url;

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

34
Andrea

Ihr PHP aus Ihrer letzten Bearbeitung würde sich in twig wie folgt übersetzen:

{{ node.field_my_link.0.url }}

Dies funktioniert folgendermaßen: 0 Gibt das erste Element der Feldelementliste zurück, url ruft das URL-Objekt ab und weil twig wird dieses Objekt als Zeichenfolge umwandeln Dadurch wird die magische Methode toString () aufgerufen und die URL als Zeichenfolgenwert ausgegeben.

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

42
4k4

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

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

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

Lassen Sie uns zuerst prüfen, ob die URL extern ist, und einfach ihren *.uri Drucken.

Andernfalls müssen wir, wenn es intern ist, den Routennamen und die Parameter über Drupals path($name, $parameters, $options) -Funktion verkabeln.

{% 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 %}
13
leymannx

Ich musste dies auf einem Linkfeld in einem Block tun. Das hat gut funktioniert:

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

Ich weiß, dass es ein alter Beitrag ist, 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üssen, 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' }}"
6
AnTSaSk

sie können auch Folgendes verwenden: Alles hängt 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 Folgendes hat funktioniert:

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

Im Absatz, um die Link-URL und den Link-Namen zu erhalten -

<a href="{{ content.FIELD_LINK_NAME[0]['#url']|render }}">
   {{ content.FIELD_LINK_NAME[0]['#title']|render }}
</a>
1
Wasim Khan

Ich weiß , dass es schrecklich ist, aber wenn nichts anderes funktioniert:

{{ link|replace({'internal:':''}) }}

Meine Situation: Zugriff auf ein Linkfeld über eine überschriebene Ansichtsvorlage: views-view-fields.html.twig

Ich musste die Variable bekommen von:

row._entity.field_machine_name.value.0.uri

(Ich habe es aufgegeben, die Variable fields zu verwenden. Sie können anscheinend eine . Content - Eigenschaft daraus erhalten, aber sonst nicht viel )

… .field_machine_name.value ist nur ein flaches Array, das nur einen uri Schlüssel hat, NICHT url und Die in anderen Antworten genannten Filter (toString (), Rendern usw.) scheinen hier einfach nicht zu funktionieren.

0
William Turrell