Отримайте шлях до активних тем у шаблоні 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 ("тема", "yourtheme").

@ user21641 drupal_get_pathпризначений для D7 :)
Чапабу

1
Це теж для 8 @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 шаблони включена змінна base_path, можливо, вам потрібно буде зробити попередню обробку для інших шаблонів, ви можете легко перевірити, {{ dump() }}чи існують змінні

// File: THEMENAME.theme in your theme's root directory
function THEMENAME_preprocess(&$variables, $hook)
{
    $variables['base_path'] = base_path();
}

3
Дякуємо, що поділилися своїм рішенням. Короткий коментар: мені довелося явно додати $ змінних ['base_path'] = base_path (); до мого гачка теми THEME_preprocess_html, щоб зробити його доступним для файлу шаблону html.html.twig.
Маркос Буарке

1
Будьте обережні при використанні {{ directory }}змінної Twig в темі , що ви збираєтеся використовувати в якості базової теми і створити підтеми для: drupal.stackexchange.com/questions/277278
Джеймс Ентоні Уїлсон

1
Пропозиції шаблону гілочки модуль забезпечує {{ base_bath }}для кожного шаблону; в іншому випадку для деяких шаблонів вам доведеться зробити так, як це робив Маркос Буарке у вищенаведеному коментарі, або Matoeil в drupal.stackexchange.com/a/238535/4195
mlncn

9

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

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


Як використовувати зображення з /sites/default/files/MyFolder? У мене є зображення MyImage.jpg в MyFolder. Тепер, у шаблоні twig, якщо я написав <img src={{ url }} alt={{ text }}>Тут, змінна URL має шлях /MyFolder/MyImage.jpg, але вона не працює.
Jasodeep Chatterjee

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" />

3
Натомість цю відповідь слід позначити як правильну
Jignesh Rawal
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.