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

30

J'ai un champ Lien nommé field_my_link(nom de la machine).

Dans un modèle Twig, je peux obtenir la valeur de l'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 exemple, http://example.comcela fonctionne bien.

Mais, si à l'intérieur de l'URL du lien est stockée une URL interne , par exemple "/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 veux " 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;

Ensuite, accédez à l'URL dans Twig en utilisant {{ my_url }}, mais j'éviterais d'écrire une fonction de prétraitement chaque fois que j'ai un champ de lien.

Andrea
la source

Réponses:

38

Votre PHP de votre dernière modification se traduirait par une brindille comme ceci:

{{ node.field_my_link.0.url }}

Cela fonctionne comme ceci, 0retourne le premier élément de la liste des éléments de champ, urlobtient l'objet url et parce que twig transtypera cet objet en chaîne, cela appellera la méthode magique toString () et affichera l'url en tant que valeur de chaîne.

Vous devez seulement l'utiliser url, car twig recherche automatiquement la méthode getxyz()s'il n'y a pas de propriété avec ce nom xyz.

4k4
la source
Merci. Maintenant, je fais un test avec cette fonction. Savez-vous si je peux utiliser cette fonction également sur les URI des liens? Que se passe-t-il si node.field_my_link.uriune URL externe est comme http://www.example.com?
Andrea
1
J'ai essayé avec file_url(node.field_my_link.uri), et si node.field_my_link.uriest "http://www.example.com"cela fonctionne (il laisse l'URL inchangé), mais si node.field_my_link.uriest "internal:/"la fonction retourne "/internal%3A/"( au lieu de "/") ..
Andrea
Je viens de voir votre modification .. Malheureusement, cela ne fonctionne pas, le code node.field_my_link.entity.uri.valuerenvoie une valeur nulle .. D'autres idées?
Andrea
@Andrea, j'ai modifié ma réponse.
4k4
1
Ouais, ça marche. La syntaxe est un peu effrayante, mais elle fait son travail.
Andrea
17

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

{{ node.field_my_link[0]['#url'] }}
Tim
la source
Celui-ci a fonctionné pour moi.
esQmo_
10

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, s'il est interne, nous devons câbler son nom de route et ses paramètres via la path($name, $parameters, $options)fonction 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 %}
leymannx
la source
2
Merci, c'est exactement ce dont j'avais besoin: obtenir l'url d'un champ de lien sous forme de chaîne: {% set url = path(node.field_link.0.url.routeName, node.field_link.0.url.routeParameters) %}Ensuite, je peux créer un lien personnalisé: ` <a href="{{ url }}" class="mycustomclass">custom link text</a>Aucun prétraitement nécessaire et pas besoin de passer par content.field_link, donc pas besoin de faire quoi que ce soit dans le "Gérer l'affichage" pour le champ de lien juste pour obtenir l'url.
user33560
8

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

{{ content.field_my_link[0]['#url']|render }}
cbovard
la source
4
Il est également bon de l'utiliser {{ content.field_my_link[0]['#url'] }}sans rendu , car dans le modèle de brindille, le tableau de rendu est rendu automatiquement lors de l'impression.
eric.chenchao
5

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 des 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' }}"
AnTSaSk
la source
1

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 le suivant a fonctionné:

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