Как мне получить базовый путь?

16

Я хочу использовать базовый путь в файле шаблона Drupal 8. Я попробовал следующее, но я не получил правильный результат.

{{ app.request.baseUrl  }}

{{base_path}}

Что мне нужно, это абсолютный путь к узлу {{ app.request.baseUrl }}/{{ url }}.

Одно из решений, которое я нашел, - поместить этот код в обработчик препроцесса и передать его теме.

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

Я ищу лучшее решение. Что я должен использовать вместо того, который я использую?

Юсеф
источник

Ответы:

28

Вы можете использовать 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();
}
mpdonadio
источник
извините меня, чтобы отредактировать ваш ответ, но URL теперь является объектом, мы должны преобразовать его в строку.
Юсеф
2
Нет, вам не нужно этого делать, шаблон может обрабатывать объект url. Это хорошо для других модулей, чтобы сохранить объект, так что любой может изменить его на любом этапе, прежде чем он будет окончательно визуализирован в ветке.
4к4
@ 4k4, но я попытался, не toStringотметив шоу, затем я попробовал kint (url) и увидел, что это объект.
Юсеф
Я согласен с @ 4k4, что он не должен быть преобразован в строку и оставлен как объект, чтобы другие методы / функции, использующие его, не затрагивались.
Вишал Кумар Саху
10

У page.html.twigвас будет рабочая {{ base_path }}переменная. Почему это не доступно в каждом шаблоне, я понятия не имею. Как мне кажется, и все остальное выглядит неопрятно, я предпочитаю делать то же, что и Drupal, в функции страницы предварительной обработки для любого места, где оно мне нужно.

Чтобы сделать {{ base_path }}доступными блокировку шаблонов в теме с именем example, добавьте этот код в example.themeфайл:

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

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

Как отмечено в принятом ответе, предоставленном MPD, если вы получаете URL узла или другого объекта, есть способы сделать все это за вас.

Однако есть причины для получения base_path, например, при отображении изображений, которые находятся в папке вашей темы. {{ directory }}предоставляет путь к папке темы, но он не учитывает базовый путь (обычно это просто /, но для того, чтобы сохранить правильное функционирование Drupal из подкаталога домена, который не должен быть жестко закодирован). На page.html.twigлюбом шаблоне, в котором есть вышеуказанный препроцессор, это будет работать для этой цели:

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

И, конечно, ответ Шона Конна работает хорошо, если вы можете подавить свое желание красивых шаблонов, но я не смог.

mlncn
источник
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();
}

& в файле шаблона вы можете позвонить через

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

Сначала мы получаем базовый URL сайта. Тогда нам нужно удалить лишнюю /. Затем мы объединяем наш базовый путь с нашим относительным путем изображения.

Денис Колмершлаг
источник
2

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

В итоге я использовал этот код, чтобы получить фактический базовый URL для моего сайта:

{% set base_url = url('<front>')|render|split('/', -1)|join('/') %}
weseze
источник
1
{{ path('<front>') }}

Я знаю, что вы уже отметили это как правильное, но это можно использовать как элемент ветки в файле шаблона без дополнительной работы. Я нашел это в блоке - system-branding-block.html.twig из темы Classy. Так что вы можете использовать это так:

<a href="{{ path('<front>') }}" title="{{ 'Home'|t }}" rel="home">{{ site_name }}</a>
owenpm3
источник