Comment obtenir le chemin de base?

16

Je veux utiliser le chemin de base dans un fichier de modèle Drupal 8. J'ai essayé ce qui suit, mais je n'obtiens pas le résultat correct.

{{ app.request.baseUrl  }}

{{base_path}}

Ce dont j'ai besoin, c'est du chemin absolu vers le nœud {{ app.request.baseUrl }}/{{ url }}.

Une solution que j'ai trouvée consiste à mettre ce code dans un crochet de prétraitement et à le passer au thème.

 $host = \Drupal::request()->getHost(); 
$response = \Drupal::httpClient()

Je cherche une meilleure solution. Que dois-je utiliser au lieu de celui que j'utilise?

Yusef
la source

Réponses:

28

Vous pouvez utiliser url()pour générer une URL de base vers n'importe quel itinéraire dans Drupal. Vous pouvez fournir l' <front>itinéraire qui, en fait, sera votre URL de base.

{{ url('<front>') }}

Mais, rendez- le d'abord si vous le concaténez:

{{ url('<front>')|render ~ file_url('public://image.jpg') }}

Par exemple:

{{ url('<front>') ~ file_url('public://image.jpg') }}
# Outputs: "Array/sites/all/default/files/image.jpg"

{{ url('<front>')|render ~ file_url('public://image.jpg') }}
# Outputs: "http://example.com/sites/all/default/files/image.jpg"
Shawn Conn
la source
1
et si je veux obtenir le chemin absolu du nœud?
Yusef
2
Dans un contexte de nœud, la path()fonction peut être appliquée pour récupérer la route du nœud:{{ path('entity.node.canonical', {'node': node.id}) }}
Shawn Conn
12

Vous n'avez presque jamais besoin de créer explicitement des chemins à partir de parties dans Drupal 8. J'irais avec quelque chose comme ceci:

function FOO_preprocess_node(&$variables) {
  /** @var \Drupal\node\NodeInterface $node */
  $node = $variables['node'];
  $variables['url'] = $node->toUrl('canonical', [
    'absolute' => TRUE,
    'language' => $node->language(),
  ])->toString();
}
mpdonadio
la source
Excusez-moi de modifier votre réponse, mais l'URL est maintenant un objet, nous devons le convertir en chaîne.
Yusef
2
Non, vous n'avez pas besoin de le faire, le modèle peut gérer l'objet url. Il est agréable pour les autres modules de conserver l'objet, afin que n'importe qui puisse le changer à tout moment, avant qu'il ne soit finalement rendu en brindille.
4k4
@ 4k4 mais j'ai essayé sans toStringmais notant show, puis j'ai essayé kint (url) et j'ai vu que c'était objet.
Yusef
Je suis d'accord avec @ 4k4 qu'il ne doit pas être converti en chaîne et laissé comme objet afin que les autres méthodes / fonctions qui le consomment ne soient pas affectées.
Vishal Kumar Sahu
10

En page.html.twigvous aurez une {{ base_path }}variable de travail . Pourquoi il n'est pas disponible dans tous les modèles, je n'en ai aucune idée. Comme je pense que cela devrait être et tout le reste semble désordonné, ma solution préférée est de faire exactement comme Drupal le fait dans la fonction de page de prétraitement pour tout endroit où j'en ai besoin.

Pour mettre à {{ base_path }}disposition des modèles de bloc dans un thème nommé exemple, ajoutez ce code au example.themefichier:

/**
 * Implements hook_preprocess_block().
 */
function example_preprocess_block(&$variables) {

  $variables['base_path'] = base_path();
}

Comme indiqué dans la réponse acceptée fournie par MPD, si vous obtenez l'URL d'un nœud ou d'une autre entité, il existe des méthodes pour tout faire pour vous.

Cependant, il existe des raisons pour obtenir le chemin_base, par exemple lors de l'affichage d'images qui vivent dans votre dossier de thème. {{ directory }}fournit le chemin vers le dossier du thème, mais il laisse le chemin de base (généralement juste un / mais afin de préserver le bon fonctionnement de Drupal à partir d'un sous-répertoire d'un domaine qui ne devrait pas être codé en dur). Sur page.html.twigou dans tout modèle doté du préprocesseur ci-dessus, cela fonctionnera à cet effet:

<img src="{{ base_path ~ directory }}/images/nsf1.svg"
     alt="National Science Foundation logo" height="80" width="80" />

Et bien sûr, la réponse de Shawn Conn fonctionne bien si vous pouvez supprimer votre désir de jolis modèles, mais je ne le pourrais pas.

mlncn
la source
3

Et selon la documentation de la page sur 8.2.x , deux variables globales ont été ajoutées pour renvoyer la page d'accueil et les URL de chemin de base:

front_page: URL de la page d'accueil. Utilisez-le à la place de base_path lorsque vous créez un lien vers la page d'accueil. Cela inclut le domaine linguistique ou le préfixe.

base_path: Le chemin de l'URL de base de l'installation Drupal. Sera généralement "/" sauf si vous avez installé Drupal dans un sous-répertoire.

Ainsi, vous pouvez obtenir l'URL de la page de police avec front_pageet l'URL de base avecbase_url

Remarque

obtenir l'URL de la première page avec {{ url('<front>') }}un problème lorsque vous souhaitez la concaténer avec un autre chemin, par exemple

{%  set base_url = url('<front>')  %}
{% set url = [ base_url,'/landing-page?invitecode=' ,invite_code] | join  %}
{{ url }}

revenir

Array/landing-page?invitecode= 

cela signifie par défaut n'est pas du texte et renvoie un tableau capable de rendu à la brindille

Yusef
la source
2

Dans

function hook_preprocess(&$variables) {
  $variables['base_path'] = base_path();
}

& dans le fichier modèle, vous pouvez appeler via

{{ base_path ~ directory }}
Julia
la source
2

Jusqu'à présent, ce fil n'apporte aucune solution appropriée. Nous pouvons le concaténer en utilisant render_val ()

Voici comment je l'ai utilisé pour obtenir le chemin absolu d'une image d'entité:

{% set base_url = render_var(url('<front>'))  %}
{% set url = base_url|trim('/', 'right')~file_url(content.field_media[0]['#media'].get('field_image').entity.uri.value)  %}

Nous obtenons d'abord l'URL de base du site. Ensuite, nous devons supprimer un extra /. Ensuite, nous concaténons notre chemin de base avec notre chemin relatif d'image.

Denis Kolmerschlag
la source
2

Tout ce qui précède a échoué pour moi, car j'ai configuré les chemins de langue, donc mon URL de première page ressemble https://example.com/en .

J'ai fini par utiliser ce code pour obtenir l'URL de base réelle de mon site:

{% set base_url = url('<front>')|render|split('/', -1)|join('/') %}
weseze
la source
1
{{ path('<front>') }}

Je sais que vous avez déjà marqué cela comme correct, mais cela peut être utilisé comme élément de brindille dans un fichier de modèle sans aucun travail supplémentaire. J'ai trouvé cela dans le bloc - system-branding-block.html.twig du thème Classy. Vous pouvez donc l'utiliser comme ceci:

<a href="{{ path('<front>') }}" title="{{ 'Home'|t }}" rel="home">{{ site_name }}</a>
owenpm3
la source