Twig şablonunda tema varlıklarına giden yolu bulun


22

Bir Twig şablonundaki bir resmin yolunu bulma konusunda bir sorum var. Görüntü bir alana veya başka bir şeye atanmamış. Sadece "MYTHEME / image / icon / my-icon.png" içinde saklanan statik bir resim.

Drupal 7'de node.template'imdeki yolu aşağıdaki kodla alıyorum:

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

Drupal 8'de nasıl çalışır? Bir değişkeni geçmeye çalıştım template_preprocess_node().

MYTHEME.theme:

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

Dal şablonu:

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

Çalışmıyor. PHP hatası yok ama yolun yanlış olduğu söyleniyor : http: //localhost/node/themes/template/image/icons/my-icon.png .


"yol yanlıştır" - bu pek kullanışlı değil :) Ayrıca, temanın tema dosyasında ön işlemi de yapmalısınız, global tmeplate_preprocess_hook işlevinde değil ve drupal_get_path ('tema', 'tema') kullanmalısınız.

@ user21641 drupal_get_path, D7 içindir :)
Chapabu

1
Bu da 8 için @ Chapabu ...
Clive

Öyleyse beni tüyümden aşağı indir! Renk beni düzeltildi :)
Chapabu

Gerçekten de D8 için. Bunu beğendim:$themePath = Url::fromUserInput('/' . drupal_get_path('theme', '[themename]')
Vodde

Yanıtlar:


51

{{ base_path ~ directory }}mutlak problemi çözecek olanı kullanabilirsiniz , herhangi bir ön işleme yapmaya gerek yoktur, bu değişkenlerin her ikisi de çekirdeğe dahil edilir.

Örneğin

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

PS. ~dal içinde yardımcı birleştirdiğiniz olduğunu.

Düzenleme: en azından sayfada * .html.twig şablonlar base_path değişkeni dahil, muhtemelen diğer şablonlar için ön işleme yapmanız gerekecek {{ dump() }}, değişkenlerin mevcut olup olmadığını kolayca kontrol edebilirsiniz.

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

3
Çözümünüzü paylaştığınız için teşekkür ederiz. Kısa bir yorum: açıkça $ değişkenleri eklemek zorunda kaldım ['base_path'] = base_path (); THEME_preprocess_html tema kancama html.html.twig şablon dosyası için kullanılabilir hale getirmek için.
Marcos Buarque

1
Kullanma konusunda dikkatli olun {{ directory }}: Bir baz tema olarak kullanmak ve alt-temalar oluşturmak niyetinde olduğunu bir temada Twig değişkeni drupal.stackexchange.com/questions/277278
James Wilson

1
Dal şablon önerileri modülün sağladığı {{ base_bath }}her şablona; Aksi halde, bazı şablonlar için yukarıdaki yorumda Marcos Buarque’ın yaptığı gibi yapmanız gerekecek ya da Matoeil drupal.stackexchange.com/a/238535/4195
mlncn

9

Varsayılan {{ directory }}olarak, tema dizinine işaret eden kullanabileceğiniz bir değişken vardır. Sorun şu ki, aynen eklediğiniz gibi, mutlak değil. Bence bu temel çekirdeği içermesi gerektiği için temelde bir hata, ama bunu değiştirmek elbette onu kullanan mevcut siteleri bozacak.

Bu yüzden önüne bir / eklemeniz gerekir; Drupal bir alt klasöre kurulursa bu durum bozulur. Bunu şablonunuzda sabit kodlayabilir veya base_path()özel bir değişkende 7.x'te olduğu gibi kullanmaya devam edebilirsiniz.


Görüntü nasıl kullanılır /sites/default/files/MyFolder? MyFolder'da bir resim olan MyImage.jpg var. Şimdi, eğer <img src={{ url }} alt={{ text }}>burada yazsam dal şablonunda url değişkeni /MyFolder/MyImage.jpg yoluna sahiptir, ancak çalışmıyor.
Jasodeep Chatterjee

2
Berdir'in yazdığı gibi: Biri <img src="/{{ directory }}/path/to/image"/>mutlak bir yol bulmak için kullanabilir .
daniels

7
<img src="/{{ directory }}/images/logo.png"/> 

ne zaman benim için çalıştı

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

yapmadı

içerik şablonu için .module'de kullanmak zorunda kaldım

   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'];

ve

  <img src="{{ module_path }}/images/error404.png" />
  <img src="//{{ http_host }}/{{ module_path }}/images/error403.png" />

3
Bu cevap doğru olarak işaretlenmelidir
Jignesh Rawal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.