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.com
cela 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.
la source
node.field_my_link.uri
une URL externe est commehttp://www.example.com
?file_url(node.field_my_link.uri)
, et sinode.field_my_link.uri
est"http://www.example.com"
cela fonctionne (il laisse l'URL inchangé), mais sinode.field_my_link.uri
est"internal:/"
la fonction retourne"/internal%3A/"
( au lieu de"/"
) ..node.field_my_link.entity.uri.value
renvoie une valeur nulle .. D'autres idées?Vous pouvez accéder directement à l'élément de tableau de rendu, dans votre cas:
la source
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 .la source
{% 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.J'ai dû le faire sur un champ de lien dans un bloc. Cela a bien fonctionné:
la source
{{ 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.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):
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:
Exemple:
la source
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é:
la source