Nhận đường dẫn đến tài sản chủ đề trong mẫu Twig


22

Tôi có một câu hỏi về việc nhận đường dẫn đến hình ảnh trong mẫu Twig. Hình ảnh không được gán cho một lĩnh vực hoặc một cái gì đó. Chỉ là một hình ảnh tĩnh được lưu trữ trong "MYTHEME / image / icon / my-icon.png".

Trong Drupal 7, tôi nhận được đường dẫn trong node.template của mình với đoạn mã sau:

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

Làm thế nào nó hoạt động với trong Drupal 8? Tôi đã cố gắng để vượt qua một biến trong template_preprocess_node().

MYTHEME.theme:

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

Mẫu cành:

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

Nó không hoạt động. Không có lỗi PHP, nhưng đường dẫn được nói sai là http: //localhost/node/theme/template/image/icons/my-icon.png .


"đường dẫn sai" - điều đó không hữu ích lắm :) Ngoài ra, bạn nên thực hiện tiền xử lý trong tệp chủ đề của chủ đề, không phải trong hàm tmeplate_pre process_hook toàn cầu và bạn nên sử dụng drupal_get_path ('theme', 'yourtheme').

@ user21641 drupal_get_pathdành cho D7 :)
Chapabu

1
Nó cũng dành cho 8 người @Chapabu ...
Clive

Vâng thổi tôi xuống với một chiếc lông! Màu tôi đã sửa :)
Chapabu

Nó thực sự là dành cho D8. Tôi đã sử dụng nó thích này:$themePath = Url::fromUserInput('/' . drupal_get_path('theme', '[themename]')
Vodde

Câu trả lời:


51

bạn có thể sử dụng {{ base_path ~ directory }}để khắc phục vấn đề tuyệt đối, không cần thực hiện bất kỳ quá trình tiền xử lý nào, cả hai biến này đều được bao gồm bởi lõi.

Ví dụ

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

Tái bút người ~trợ giúp trong twigenate.

Chỉnh sửa: ít nhất là trong trang * .html.twig mẫu bao gồm biến base_path, có thể bạn sẽ cần phải xử lý trước cho các mẫu khác, bạn có thể dễ dàng kiểm tra {{ dump() }}nếu có các biến

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

3
Cảm ơn đã chia sẻ giải pháp của bạn. Một nhận xét nhanh: Tôi đã phải thêm $ biến ['base_path'] = base_path (); vào hook theme của THEME_pre process_html của tôi để làm cho nó có sẵn cho tệp mẫu html.html.twig.
Marcos Buarque

1
Hãy cẩn thận về việc sử dụng {{ directory }}biến Twig trong một chủ đề mà bạn định sử dụng làm chủ đề cơ bản và tạo các chủ đề phụ cho: drupal.stackexchange.com/questions/277278
JamesWilson

1
Các cành lá mẫu gợi ý mô-đun cung cấp {{ base_bath }}cho tất cả các mẫu; mặt khác, đối với một số mẫu bạn sẽ phải làm như Marcos Buarque đã làm trong nhận xét trên hoặc Matoeil đã làm trong drupal.stackexchange.com/a/238535/4195
mlncn

9

Theo mặc định, có một {{ directory }}biến mà bạn có thể sử dụng trỏ đến thư mục chủ đề của mình. Vấn đề là, nó không tuyệt đối, giống như bạn đã thêm. Tôi nghĩ đó là một lỗi trong lõi bởi vì nó nên bao gồm đường dẫn cơ sở, nhưng việc thay đổi đó tất nhiên sẽ phá vỡ các trang web hiện có sử dụng nó.

Vì vậy, bạn cần thêm một / ở phía trước của nó; điều này sẽ phá vỡ nếu Drupal được cài đặt trong thư mục con. Bạn có thể mã hóa cứng trong mẫu của mình hoặc tiếp tục sử dụng base_path()như bạn đã làm trong 7.x trong một biến tùy chỉnh.


Làm thế nào để sử dụng hình ảnh từ /sites/default/files/MyFolder? Tôi có một hình ảnh MyImage.jpg trong MyFolder. Bây giờ, trong mẫu twig nếu tôi đã viết ở <img src={{ url }} alt={{ text }}>đây, biến url có đường dẫn /MyFolder/MyImage.jpg nhưng, nó không hoạt động.
Jasodeep Chatterjee

2
Như Berdir đã viết: người ta có thể chỉ cần sử dụng <img src="/{{ directory }}/path/to/image"/>để có được một con đường tuyệt đối.
daniels

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

làm việc cho tôi khi

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

đã không

đối với mẫu nội dung, tôi phải sử dụng trong .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
Câu trả lời này nên được đánh dấu là chính xác thay vào đó
Jignesh Rawal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.