web-dev-qa-db-fra.com

Comment obtenir le chemin de base?

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}}

J'ai besoin 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 à la place de celui que j'utilise?

17
Yusef

Et selon Page Documentation on 8.2.x , deux variables globales ajoutées pour renvoyer la page d'accueil et les URL du 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 ou le préfixe de la langue.

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).

Donc vous pouvez obtenir l'URL de la page de police avec front_page Et l'URL de base avec base_url

Remarque

obtenir l'URL de première page avec {{ url('<front>') }} a un problème lorsque vous voulez le concaténer avec un autre chemin, comme 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

3
Yusef

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

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

Mais, rend 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"
28
Shawn Conn

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();
}
12
mpdonadio

Dans page.html.twig vous voulez avoir un travail {{ base_path }} variable. 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 fait dans la fonction de page de prétraitement pour tout endroit où j'en ai besoin.

Faire {{ base_path }} disponible pour bloquer les modèles dans un thème nommé exemple, ajoutez ce code au example.theme fichier:

/**
 * 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 de côté 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.twig ou dans tout modèle disposant 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.

10
mlncn

Dans

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

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

{{ base_path ~ directory }}
2
Julia

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.

2
Denis Kolmerschlag

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('/') %}
2
weseze
{{ path('<front>') }}

Je sais que vous avez déjà marqué cela comme correct, mais cela peut être utilisé comme élément twig dans un fichier modèle sans aucun travail supplémentaire. Je l'ai trouvé 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>
1
owenpm3