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?

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"

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

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.


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


2

W

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

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

{{ base_path ~ directory }}

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.


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('/') %}

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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.