Jak uzyskać ścieżkę bazową?

16

Chcę użyć ścieżki podstawowej w pliku szablonu Drupal 8. Próbowałem następujące, ale nie otrzymuję prawidłowego wyniku.

{{ app.request.baseUrl  }}

{{base_path}}

Potrzebuję absolutnej ścieżki do węzła {{ app.request.baseUrl }}/{{ url }}.

Jednym z rozwiązań, które znalazłem, jest umieszczenie tego kodu w haczyku przetwarzania wstępnego i przekazanie go do motywu.

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

Szukam lepszego rozwiązania. Czego powinienem użyć zamiast tego, którego używam?

Yusef
źródło

Odpowiedzi:

27

Możesz użyć url()do wygenerowania podstawowego adresu URL do dowolnej trasy w Drupal. Możesz podać <front>trasę, która będzie Twoim podstawowym adresem URL.

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

Ale renderuj go jako pierwszy, jeśli łączysz go:

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

Na przykład:

{{ 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
źródło
1
a jeśli chcę uzyskać bezwzględną ścieżkę do węzła?
Yusef
2
W kontekście węzła path()można zastosować funkcję do pobierania trasy węzła:{{ path('entity.node.canonical', {'node': node.id}) }}
Shawn Conn
12

Prawie nigdy nie musisz jawnie budować ścieżek z części w Drupal 8. Wybrałbym coś takiego:

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
źródło
pologize mnie, aby edytować twoją odpowiedź, ale url jest teraz obiektem, powinniśmy przekonwertować go na ciąg.
Yusef
2
Nie, nie musisz tego robić, szablon może obsłużyć obiekt URL. Miło jest, aby inne moduły zatrzymały obiekt, aby każdy mógł go zmienić na dowolnym etapie, zanim zostanie ostatecznie renderowany na gałązkę.
4k4
@ 4k4, ale próbowałem bez toStringpokazu, ale zauważyłem Kint (url) i zobaczyłem, że to obiekt.
Yusef
Zgadzam się z @ 4k4, że nie powinien być konwertowany na ciąg znaków i pozostawiony jako obiekt, aby nie wpływały na inne metody / funkcje go wykorzystujące.
Vishal Kumar Sahu
10

W page.html.twigtobie będzie działał{{ base_path }} zmienną. Dlaczego nie jest dostępny w każdym szablonie, nie mam pojęcia. Tak jak powinienem, a wszystko inne wygląda na niechlujne, moim preferowanym rozwiązaniem jest robienie dokładnie tak, jak Drupal w funkcji strony przedprocesowej dla dowolnego miejsca, w którym jest to potrzebne.

Aby {{ base_path }}udostępnić blokowanie szablonów w kompozycji o nazwie przykład, dodaj ten kod do example.themepliku:

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

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

Jak zauważono w zaakceptowanej odpowiedzi udzielonej przez MPD, jeśli uzyskasz adres URL węzła lub innego podmiotu, istnieją metody, aby zrobić to wszystko za Ciebie.

Istnieją jednak powody, aby uzyskać ścieżkę_podstawową, na przykład podczas wyświetlania obrazów, które znajdują się w folderze motywu. {{ directory }}zapewnia ścieżkę do folderu motywu, ale pozostawia ścieżkę podstawową (zwykle tylko /, ale w celu zachowania prawidłowego funkcjonowania Drupala z podkatalogu domeny, który nie powinien być zakodowany na stałe). W przypadku page.html.twigdowolnego szablonu, który ma powyższą procedurę wstępną, będzie to działać w tym celu:

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

I oczywiście odpowiedź Shawna Conna działa dobrze, jeśli możesz stłumić swoje pragnienie pięknych szablonów, ale nie mogłem.

mlncn
źródło
3

I zgodnie z dokumentacją strony w 8.2.x , dwie zmienne globalne dodane w celu zwrócenia pierwszej strony i podstawowych adresów URL ścieżki:

front_page: URL pierwszej strony. Użyj tego zamiast base_path podczas linkowania do strony głównej. Dotyczy to domeny językowej lub prefiksu.

ścieżka_podstawowa: podstawowa ścieżka adresu URL instalacji Drupal. Zwykle będzie to „/”, chyba że zainstalowałeś Drupala w podkatalogu.

Możesz więc uzyskać adres URL strony czcionek front_pagei podstawowy adres URL za pomocąbase_url

Uwaga

pobranie adresu URL strony głównej {{ url('<front>') }}ma problem, gdy chcesz połączyć go z inną ścieżką, na przykład

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

powrót

Array/landing-page?invitecode= 

oznacza to domyślnie, że nie jest tekstem i zwraca gałkę zdolną do renderowania

Yusef
źródło
2

W

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

i w pliku szablonu możesz zadzwonić za pośrednictwem

{{ base_path ~ directory }}
Julia
źródło
2

Jak dotąd ten wątek nie przynosi żadnego właściwego rozwiązania. Możemy połączyć to za pomocą render_val ()

Oto sposób, w jaki go użyłem, aby uzyskać bezwzględną ścieżkę obrazu bytu:

{% 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)  %}

1. otrzymujemy podstawowy adres URL strony. Następnie musimy usunąć dodatkowe /. Następnie łączymy naszą ścieżkę bazową z naszą ścieżką względną obrazu.

Denis Kolmerschlag
źródło
2

Wszystkie powyższe nie powiodły się, ponieważ mam skonfigurowane ścieżki językowe, więc wygląda mój adres URL strony głównej https://example.com/en.

W końcu użyłem tego kodu, aby uzyskać rzeczywisty podstawowy adres URL mojej witryny:

{% set base_url = url('<front>')|render|split('/', -1)|join('/') %}
weseze
źródło
1
{{ path('<front>') }}

Wiem, że już zaznaczyłeś to jako poprawne, ale można go użyć jako elementu gałązki w pliku szablonu bez dodatkowej pracy. Znalazłem to w bloku - system-branding-block.html.twig z motywu Classy. Możesz więc użyć go w następujący sposób:

<a href="{{ path('<front>') }}" title="{{ 'Home'|t }}" rel="home">{{ site_name }}</a>
owenpm3
źródło