J'ai un champ Lien nommé field_my_link
(nom de la machine).
Dans un modèle Twig, je peux obtenir la valeur URL du lien avec ceci:
{{ node.field_my_link.uri }}
Si à l'intérieur de l'URL du lien, il y a une URL externe , par ex. http://example.com
ça marche bien.
Mais, si à l'intérieur de l'URL du lien est stockée une URL interne , par ex. "/node/11"
, J'obtiens une valeur comme celle-ci:
"internal:/node/11"
avec le "internal:
" préfixe.
Comment puis-je obtenir l'URL valide ?
Par exemple, si l'URL du lien est "http://example.com
" Je voudrais "http://example.com
"(cela fonctionne déjà), si l'URL du lien est" /node/11
"Je veux l'URL relative" /node/11
", si l'URL du lien est" <front>
"Je veux l'URL" /
", etc.
MODIFIER
Je peux obtenir la valeur que je veux dans une fonction de pré-traitement PHP, en utilisant ceci:
$url = $variables['node']->get('field_my_link')->first()->getUrl();
Comment puis-je accéder à la même valeur dans le modèle Twig?
Je sais que je peux le faire dans la fonction de prétraitement:
$variables['my_url'] = $url;
Accédez ensuite à l'URL dans Twig using {{ my_url }}
, mais j'éviterais d'écrire une fonction de prétraitement chaque fois que j'ai un champ de lien.
Votre PHP de votre dernière modification se traduirait par twig comme ceci:
{{ node.field_my_link.0.url }}
Cela fonctionne comme ceci, 0
Renvoie le premier élément de la liste des éléments de champ, url
obtient l'objet url et parce que twig va transtyper cet objet en chaîne cela appellera la méthode magique toString () et affichera l'url sous forme de valeur de chaîne.
Vous avez seulement besoin d'utiliser url
, car twig recherche automatiquement la méthode getxyz()
s'il n'y a pas de propriété avec ce nom xyz
.
Vous pouvez accéder directement à l'élément de tableau de rendu, dans votre cas:
{{ node.field_my_link[0]['#url'] }}
Vous devez couvrir les deux cas: les URL externes et internes.
Vérifions d'abord si l'URL est externe et imprimons simplement son *.uri
.
Sinon, si c'est interne , nous devons câbler son nom de route et ses paramètres via la fonction path($name, $parameters, $options)
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 %}
J'ai dû le faire sur un champ de lien dans un bloc. Cela a bien fonctionné:
{{ content.field_my_link[0]['#url']|render }}
Je sais que c'est un ancien article mais avec la dernière version de Drupal 8 (8.6), vous pouvez afficher directement l'url pour les deux versions (externe et interne):
node.field_link.0.url
Et si vous avez besoin de savoir si le lien est externe ou non (pour mon cas c'était pour la cible), vous pouvez l'utiliser:
node.field_link.0.url.external
Exemple:
<a href="{{ node.field_link.0.url }}" title="Title" target="{{ node.field_link.0.url.external ? '_blank' : '_self' }}"
vous pouvez également utiliser quelque chose comme ce qui suit, tout dépend du type d'objet que vous extrayez et du nom du champ. Dans mon cas, c'était un paragraphe avec un champ nommé field_link et ce qui suit fonctionnait:
{{ paragraph.field_link.get(0).getUrl().toString() }}
Au paragraphe, pour obtenir l'URL du lien et le nom du lien -
<a href="{{ content.FIELD_LINK_NAME[0]['#url']|render }}">
{{ content.FIELD_LINK_NAME[0]['#title']|render }}
</a>
Je sais c'est horrible, mais si rien d'autre ne fonctionne:
{{ link|replace({'internal:':''}) }}
Ma situation: accès à un champ Lien via un modèle de vues redéfini: views-view-fields.html.twig
J'ai dû obtenir la variable de:
row._entity.field_machine_name.value.0.uri
(J'ai renoncé à utiliser la variable fields
, vous pouvez apparemment en retirer une propriété . Content , mais pas grand chose d'autre )
… .field_machine_name.value est juste un tableau plat, qui n'a qu'une clé uri
, PAS url
, et les filtres mentionnés dans d'autres réponses (toString (), rendu, etc.) ne semblent tout simplement pas fonctionner ici.