Uzyskaj ścieżkę do zasobów motywu w szablonie Twig

22

Mam pytanie dotyczące uzyskania ścieżki do obrazu w szablonie Twig. Obraz nie jest przypisany do pola ani czegoś takiego. Tylko statyczny obraz, który jest przechowywany w „MYTHEME / image / icon / my-icon.png”.

W Drupal 7 dostaję ścieżkę do mojego node.template z następującym kodem:

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

Jak to działa w Drupal 8? Próbowałem przekazać zmienną template_preprocess_node().

MYTHEME.theme:

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

Szablon gałązki:

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

To nie działa Nie ma błędu PHP, ale błędnie mówi się, że ścieżka to http: //localhost/node/themes/template/image/icons/my-icon.png .

Stephan Hofmann
źródło
„ścieżka jest niepoprawna” - to nie jest bardzo pomocne :) Powinieneś również wykonać wstępne przetwarzanie w pliku motywu kompozycji, a nie w globalnej funkcji tmeplate_preprocess_hook i powinieneś użyć drupal_get_path ('theme', 'yourtheme').
@ user21641 drupal_get_pathjest dla D7 :)
Chapabu
1
To też za 8 @Chapabu ...
Clive
Dmuchnij mnie piórkiem! Kolor mnie poprawiony :)
Chapabu,
Dotyczy to również D8. Użyłem tego tak:$themePath = Url::fromUserInput('/' . drupal_get_path('theme', '[themename]')
Vodde,

Odpowiedzi:

51

możesz użyć tego, {{ base_path ~ directory }}co rozwiąże problem absolutny, bez potrzeby wstępnego przetwarzania, obie te zmienne są uwzględnione według rdzenia.

Na przykład

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

PS. ~pomocnik w gałązce jest concatenate.

Edycja: przynajmniej na stronie * .html.twig szablony dołączona jest zmienna base_path, być może będziesz musiał wykonać wstępne przetwarzanie dla innych szablonów, możesz łatwo sprawdzić, {{ dump() }}czy zmienne są obecne

// File: THEMENAME.theme in your theme's root directory
function THEMENAME_preprocess(&$variables, $hook)
{
    $variables['base_path'] = base_path();
}
pjcarly
źródło
3
Dziękujemy za udostępnienie rozwiązania. Jeden szybki komentarz: Musiałem jawnie dodać zmienne $ ['base_path'] = base_path (); do mojego zaczepu motywu THEME_preprocess_html, aby udostępnić go w pliku szablonu html.html.twig.
Marcos Buarque
1
Zachowaj ostrożność podczas używania {{ directory }}zmiennej Twig w motywie, którego zamierzasz użyć jako motywu podstawowego, i twórz podtematy dla: drupal.stackexchange.com/questions/277278
JamesWilson
1
Sugestie szablon gałązka moduł dostarcza {{ base_bath }}do każdego szablonu; w przeciwnym razie w przypadku niektórych szablonów będziesz musiał zrobić tak, jak Marcos Buarque w powyższym komentarzu lub Matoeil w drupal.stackexchange.com/a/238535/4195
mlncn
9

Domyślnie istnieje {{ directory }}zmienna, której można użyć, która wskazuje na katalog motywów. Problem w tym, że nie jest absolutny, tak jak ten, który dodałeś. Myślę, że jest to podstawowy błąd, ponieważ powinien zawierać ścieżkę podstawową, ale zmiana tego oczywiście zniszczyłaby istniejące witryny, które z niej korzystają.

Więc musisz dodać / przed nim; spowodowałoby to uszkodzenie, gdyby Drupal został zainstalowany w podfolderze. Możesz albo zakodować to na stałe w swoim szablonie, albo nadal używać base_path()tak jak w 7.x w zmiennej niestandardowej.

Berdir
źródło
Jak korzystać z obrazu /sites/default/files/MyFolder? Mam obraz MyImage.jpg w MyFolder. Teraz w szablonie gałązki, jeśli napisałem <img src={{ url }} alt={{ text }}>tutaj, zmienna url ma ścieżkę /MyFolder/MyImage.jpg, ale nie działa.
Jasodeep Chatterjee
2
Jak napisał Berdir: można po prostu użyć <img src="/{{ directory }}/path/to/image"/>absolutnej ścieżki.
Daniels
7
<img src="/{{ directory }}/images/logo.png"/> 

pracował dla mnie kiedy

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

nie

dla szablonu treści musiałem użyć w .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'];

i

  <img src="{{ module_path }}/images/error404.png" />
  <img src="//{{ http_host }}/{{ module_path }}/images/error403.png" />
Matoeil
źródło
3
Zamiast tego odpowiedź należy oznaczyć jako poprawną
Jignesh Rawal,