Dapatkan jalur ke aset tema di template Ranting

22

Saya punya pertanyaan tentang mendapatkan jalur ke gambar di templat Ranting. Gambar tidak ditugaskan ke bidang atau sesuatu. Hanya gambar statis yang disimpan dalam "MYTHEME / image / icon / my-icon.png".

Di Drupal 7 saya mendapatkan path di node.template saya dengan kode berikut:

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

Bagaimana cara kerjanya di Drupal 8? Saya mencoba untuk mengirimkan variabel template_preprocess_node().

Tema MYTHEME:

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

Templat ranting:

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

Itu tidak bekerja. Tidak ada kesalahan PHP, tetapi jalurnya dikatakan salah sebagai http: //localhost/node/themes/template/image/icons/my-icon.png .

Stephan Hofmann
sumber
"the path is wrong" - itu tidak terlalu membantu :) Anda juga harus melakukan preprocessing pada file tema theme, bukan pada fungsi tmeplate_preprocess_hook global dan Anda harus menggunakan drupal_get_path ('tema', 'tema Anda').
@ user21641 drupal_get_pathuntuk D7 :)
Chapabu
1
Ini untuk 8 juga @ Chapabu ...
Clive
Hancurkan aku dengan bulu! Warnai saya dikoreksi :)
Chapabu
Memang untuk D8 juga. Saya telah menggunakannya seperti ini:$themePath = Url::fromUserInput('/' . drupal_get_path('theme', '[themename]')
Vodde

Jawaban:

51

Anda dapat menggunakan {{ base_path ~ directory }}yang akan memperbaiki masalah absolut, tidak perlu melakukan preprocessing, kedua variabel ini dimasukkan oleh inti.

Sebagai contoh

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

PS. yang ~helper di ranting adalah concatenate.

Sunting: setidaknya di halaman * .html.twig templat variabel base_path disertakan, mungkin Anda perlu melakukan preprocessing untuk templat lain, Anda dapat dengan mudah memeriksa {{ dump() }}apakah ada variabel

// File: THEMENAME.theme in your theme's root directory
function THEMENAME_preprocess(&$variables, $hook)
{
    $variables['base_path'] = base_path();
}
pjcarly
sumber
3
Terima kasih telah membagikan solusi Anda. Satu komentar cepat: Saya harus menambahkan $ variabel secara eksplisit ['base_path'] = base_path (); ke kait tema THEME_preprocess_html saya agar tersedia untuk file template html.html.twig.
Marcos Buarque
1
Hati-hati menggunakan {{ directory }}variabel Twig dalam tema yang ingin Anda gunakan sebagai tema dasar dan membuat sub-tema untuk: drupal.stackexchange.com/questions/277278
JamesWilson
1
The saran ranting Template modul menyediakan {{ base_bath }}untuk setiap template yang; jika tidak, untuk beberapa templat Anda harus melakukan seperti yang dilakukan Marcos Buarque di komentar di atas, atau Matoeil melakukannya di drupal.stackexchange.com/a/238535/4195
mlncn
9

Secara default ada {{ directory }}variabel yang bisa Anda gunakan yang menunjuk ke direktori tema Anda. Masalahnya adalah, itu tidak mutlak, seperti yang Anda tambahkan. Saya pikir itu bug pada intinya karena harus menyertakan path dasar, tetapi mengubah itu tentu saja akan merusak situs yang ada yang menggunakannya.

Jadi, Anda perlu menambahkan a / di depannya; ini akan rusak jika Drupal diinstal dalam subfolder. Anda dapat membuat hardcode yang ada di template Anda atau tetap menggunakan base_path()seperti yang Anda lakukan di 7.x dalam variabel khusus.

Berdir
sumber
Bagaimana cara menggunakan gambar dari /sites/default/files/MyFolder? Saya memiliki gambar MyImage.jpg di MyFolder. Sekarang, dalam template ranting jika saya menulis di <img src={{ url }} alt={{ text }}>sini variabel url memiliki path /MyFolder/MyImage.jpg tetapi, itu tidak berfungsi.
Jasodeep Chatterjee
2
Seperti yang ditulis Berdir: orang hanya bisa menggunakan <img src="/{{ directory }}/path/to/image"/>untuk mendapatkan jalur absolut.
daniels
7
<img src="/{{ directory }}/images/logo.png"/> 

bekerja untuk saya ketika

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

tidak

untuk templat konten, saya harus menggunakan .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'];

dan

  <img src="{{ module_path }}/images/error404.png" />
  <img src="//{{ http_host }}/{{ module_path }}/images/error403.png" />
Matoeil
sumber
3
Jawaban ini seharusnya ditandai sebagai benar
Jignesh Rawal