web-dev-qa-db-fra.com

Comment obtenir l'URL valide d'un champ Lien à partir d'un modèle Twig?

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.

34
Andrea

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.

42
4k4

Vous pouvez accéder directement à l'élément de tableau de rendu, dans votre cas:

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

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

J'ai dû le faire sur un champ de lien dans un bloc. Cela a bien fonctionné:

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

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' }}"
6
AnTSaSk

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() }}
3
Israel Morales

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>
1
Wasim Khan

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.

0
William Turrell