Мне просто нужно было это сделать. Правильный подход заключается в том, чтобы сохранить URL-адрес изображения стилизованного изображения в переменной (с помощью функции предварительной обработки), и тогда эта переменная будет доступна в вашем файле ветки.
Я написал функцию, которая получит любой файл field_image и вернет оригинальное имя файла, или, если вы укажете имя стиля, он вернет URL стилизованного изображения.
Внутри моего .theme
файла:
function MYTHEME_preprocess_node(&$vars) {
//get thumbnail images from field_image
$vars['field_image_url'] = _var_image_url($vars, 'field_image', 'thumbnail');
}
//pull image field URL (original or styled)
function _var_image_url($vars, $field, $style_name = '') {
if (!empty($vars['elements'][$field]['#object'])) {
$fields = $vars['elements'][$field]['#object']->getFields();
$image = $fields[$field]->getValue();
if (!empty($image[0]['target_id'])) {
$file = \Drupal\file\Entity\File::load($image[0]['target_id']);
$uri = $file->getFileUri();
if(!empty($style_name)) {
$url = \Drupal\image\Entity\ImageStyle::load($style_name)->buildUrl($uri);
return $url; //the styled URL
} else {
return file_create_url($uri); //original
}
}
}
return false;
}
Теперь в моем файле ветки (node.html.twig, так как я использовал функцию preprocess_node):
<div class="banner" style="background-image:url({{ field_image_url }}"></div>
Эта функция _var_image_url()
должна вызываться из THEME_preprocess_node()
функции, потому что она ожидает определенной установки в первом $vars
аргументе. Если вы попытаетесь позвонить с него preprocess_page
, вам нужно будет изменить его.