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.com
funktioniert 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/11
lautet, 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.
quelle
node.field_my_link.uri
eine externe URL wiehttp://www.example.com
?file_url(node.field_my_link.uri)
, und wennnode.field_my_link.uri
ist"http://www.example.com"
es funktioniert (es läßt die URL unverändert), aber wennnode.field_my_link.uri
ist"internal:/"
die Funktion zurück"/internal%3A/"
(statt"/"
) ..node.field_my_link.entity.uri.value
gibt einen Nullwert zurück. Irgendwelche anderen Ideen?Sie können in Ihrem Fall direkt auf das Render-Array-Element zugreifen:
quelle
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.quelle
{% 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.Ich musste das auf einem Linkfeld in einem Block machen. Das hat gut funktioniert:
quelle
{{ content.field_my_link[0]['#url'] }}
ohne Rendern ist ebenfalls in Ordnung , da in Zweigvorlagen Render-Arrays beim Drucken automatisch gerendert werden.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:
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:
Beispiel:
quelle
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:
quelle