Як отримати базовий шлях?


16

Я хочу використовувати базовий шлях у файлі шаблонів Drupal 8. Я спробував наступне, але не отримав правильного результату.

{{ app.request.baseUrl  }}

{{base_path}}

Що мені потрібно - це абсолютний шлях до вузла {{ app.request.baseUrl }}/{{ url }}.

Я знайшов одне рішення - помістити цей код у гачок попередньої обробки та передати його темі.

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

Я шукаю кращого рішення. Що я можу використовувати замість тієї, якою я користуюся?

Відповіді:


27

Ви можете використовувати url()для генерації базового URL-адреса до будь-якого маршруту в Drupal. Ви можете надати <front>маршрут, який фактично буде вашою базовою URL-адресою.

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

Але виправте це спочатку, якщо ви об'єднаєте його:

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

Наприклад:

{{ 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
і якщо я хочу отримати абсолютний шлях до вузла?
Юсеф

2
У контексті вузла path()функцію можна застосувати для отримання маршруту вузла:{{ path('entity.node.canonical', {'node': node.id}) }}
Шон Конн,

12

Вам майже ніколи не потрібно чітко створювати шляхи з частин в Drupal 8. Я б ішов із таким чином:

function FOO_preprocess_node(&$variables) {
  /** @var \Drupal\node\NodeInterface $node */
  $node = $variables['node'];
  $variables['url'] = $node->toUrl('canonical', [
    'absolute' => TRUE,
    'language' => $node->language(),
  ])->toString();
}

вибачте мене, щоб відредагувати вашу відповідь, але URL-адреса тепер є об'єктом, ми повинні перетворити її на рядок.
Юсеф

2
Ні, вам не потрібно цього робити, шаблон може обробляти URL-об’єкт. Приємно, щоб інші модулі зберігали об'єкт, щоб кожен міг його змінити на будь-якому етапі, перш ніж він буде виведений нарешті в гілочку.
4k4

@ 4k4, але я спробував, не toStringпомічаючи шоу, тоді я спробував kint (url) і побачив, що це об'єкт.
Юзеф

Я погоджуюся з @ 4k4, що він не повинен бути перетворений в рядок і залишений як об'єкт, щоб інші методи / функції, що споживають його, не впливали.
Вішал Кумар Саху

10

У page.html.twigвас буде робоча {{ base_path }}змінна. Чому він доступний не в кожному шаблоні, я поняття не маю. Як я думаю, це має бути, і все інше виглядає безладним, моє найкраще рішення - це робити саме так, як робить Drupal у функції попередньої обробки сторінки для будь-якого місця, яке мені потрібно.

Щоб зробити {{ base_path }}доступним для блокування шаблонів у темі, названій на прикладі, додайте цей код у example.themeфайл:

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

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

Як зазначається у прийнятій відповіді, наданій MPD, якщо ви отримуєте URL-адресу вузла чи іншої сутності, існують способи зробити це все за вас.

Однак існують причини отримання базового шляху, наприклад, під час відображення зображень, які перебувають у вашій темі папки. {{ directory }}надає шлях до папки з темами, але він залишає основний шлях (як правило, лише a /, але щоб зберегти належне функціонування Drupal з підкаталогу домену, який не повинен бути жорстко закодований). Для page.html.twigабо у будь-якому шаблоні, що містить вищепереробник, це буде працювати для цієї мети:

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

І звичайно, відповідь Шона Конна працює чудово, якщо ви можете придушити своє бажання досить шаблонів, але я не зміг.


3

Відповідно до Документації сторінок на 8.2.x , для повернення першої сторінки та URL-адрес базового шляху додано дві глобальні змінні:

front_page: URL-адреса титульної сторінки. Використовуйте це замість base_path при посиланні на головну сторінку. Сюди входить мовний домен або префікс.

base_path: шлях базової URL-адреси установки Drupal. Зазвичай буде "/", якщо ви не встановили Drupal в підкаталозі.

Так ви можете отримати сторінку шрифту Url front_pageі базувати URL дляbase_url

Примітка

отримання URL-адреси титульної сторінки {{ url('<front>') }}має проблему, коли ви хочете визначити її з іншим шляхом, наприклад

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

повернення

Array/landing-page?invitecode= 

це значення за замовчуванням не є текстовим і повертає матрицю, здатну візуалізувати


2

В

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

& у файлі шаблону u можна зателефонувати через

{{ base_path ~ directory }}

2

Поки ця тема не приносить належного рішення. Ми можемо об'єднати це за допомогою render_val ()

Ось спосіб, яким я користувався, щоб отримати абсолютний шлях зображення образу:

{% 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-го ми отримуємо базову URL-адресу сайту. Тоді нам потрібно видалити зайвий /. Тоді ми поєднуємо наш базовий шлях із відносним контуром зображення.


2

Все вищезазначене для мене не вдалося, оскільки у мене налаштовані мовні шляхи, тому виглядає моя URL-адреса на головній сторінці https://example.com/en .

Я використовував цей код, щоб отримати фактичну базову URL-адресу для свого сайту:

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

1
{{ path('<front>') }}

Я знаю, ви вже вказали це як правильне, але це можна використовувати як елемент гілочки у файлі шаблону без зайвих робіт. Я знайшов це в блоці - system-branding-block.html.twig з теми Classy. Отже, ви можете використовувати його так:

<a href="{{ path('<front>') }}" title="{{ 'Home'|t }}" rel="home">{{ site_name }}</a>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.