Получить путь к ресурсам темы в шаблоне Twig

22

У меня вопрос о получении пути к изображению в шаблоне Twig. Изображение не привязано к полю или чему-либо. Просто статичное изображение, которое хранится в "MYTHEME / image / icon / my-icon.png".

В Drupal 7 я получаю путь в моем node.template со следующим кодом:

<img src="<?php print base_path() . path_to_theme(); ?>/image/icons">/my-icon.png

Как это работает в Drupal 8? Я пытался передать переменную в template_preprocess_node().

MYTHEME.theme:

$variables['images_path'] = \Drupal::theme()->getActiveTheme()->getPath() . '/image/';

Шаблон веточки:

<img src="{{ images_path  ~ 'icons/' ~ 'my-icon.png' }}">

Не работает Нет ошибки PHP, но неверно указывается путь http: //localhost/node/themes/template/image/icons/my-icon.png .

Стефан Хофманн
источник
«путь неверный» - это не очень полезно :) Также вы должны выполнить предварительную обработку в файле темы темы, а не в глобальной функции tmeplate_preprocess_hook, и вы должны использовать drupal_get_path ('theme', 'yourtheme').
@ user21641 drupal_get_pathдля D7 :)
Chapabu
1
Это тоже для 8 @Chapabu ...
Клайв
Ну снеси меня пером! Цвет меня исправил :)
Chapabu
Это действительно для D8. Я использовал это нравится это:$themePath = Url::fromUserInput('/' . drupal_get_path('theme', '[themename]')
Vodde

Ответы:

51

Вы можете использовать, {{ base_path ~ directory }}что решит абсолютную проблему, нет необходимости выполнять какую-либо предварительную обработку, обе эти переменные включены ядром.

Например

<img src="{{ base_path ~ directory }}/images/logo.png" alt="My Logo" />

PS. ~помощник в прута является конкатенация.

Редактировать: по крайней мере, на странице * .html.twig templates включена переменная base_path, возможно, вам потребуется выполнить предварительную обработку для других шаблонов, вы можете легко проверить наличие {{ dump() }}переменных

// File: THEMENAME.theme in your theme's root directory
function THEMENAME_preprocess(&$variables, $hook)
{
    $variables['base_path'] = base_path();
}
pjcarly
источник
3
Спасибо, что поделились своим решением. Один быстрый комментарий: мне пришлось явно добавить $ variable ['base_path'] = base_path (); на мой хук темы THEME_preprocess_html, чтобы сделать его доступным для файла шаблона html.html.twig.
Маркос
1
Будьте осторожны при использовании {{ directory }}переменной Twig в теме , что вы собираетесь использовать в качестве базовой темы и создать подтемы для: drupal.stackexchange.com/questions/277278
Джеймс Энтони Уилсон
1
Модуль предложений шаблона ветки предоставляет {{ base_bath }}каждому шаблону; в противном случае для некоторых шаблонов вам нужно будет сделать то же, что и Маркос Буарке в приведенном выше комментарии, или Матеил в drupal.stackexchange.com/a/238535/4195
млн.
9

По умолчанию существует {{ directory }}переменная, которую вы можете использовать, которая указывает на каталог вашей темы. Проблема в том, что она не абсолютна, как та, которую вы добавили. Я думаю, что это ошибка в ядре, потому что она должна включать базовый путь, но изменение, которое, конечно, сломает существующие сайты, которые его используют.

Поэтому вам нужно добавить / перед ним; это сломалось бы, если Drupal установлен в подпапке. Вы можете либо жестко закодировать это в своем шаблоне, либо продолжать использовать, base_path()как вы делали в 7.x, в пользовательской переменной.

Berdir
источник
Как использовать изображение из /sites/default/files/MyFolder? У меня есть изображение MyImage.jpg в MyFolder. Теперь, в шаблоне ветки, если я написал <img src={{ url }} alt={{ text }}>здесь, переменная url имеет путь /MyFolder/MyImage.jpg, но она не работает.
Джасодип Чаттерджи
2
Как писал Бердир: можно просто использовать, <img src="/{{ directory }}/path/to/image"/>чтобы получить абсолютный путь.
Даниэльс
7
<img src="/{{ directory }}/images/logo.png"/> 

работал на меня, когда

<img src="{{ base_path ~ directory }}/images/logo.png" alt="My Logo" />

не

для шаблона содержимого я должен был использовать в .module

   function hook_preprocess(&$variables, $hook) {

  $module_handler = Drupal::service('module_handler');
  $path = $module_handler->getModule('myModuleName')->getPath();

  if(isset($variables['region']) && $variables['region'] == 'content'){
    $variables['module_path'] = $path;
    $variables['http_host'] = $_SERVER['HTTP_HOST'];

а также

  <img src="{{ module_path }}/images/error404.png" />
  <img src="//{{ http_host }}/{{ module_path }}/images/error403.png" />
Matoeil
источник
3
Этот ответ должен быть помечен как правильный
Jignesh Rawal