Drupal 8 Программный вывод изображения со стилями
Иногда бывает необходимость вывести изображение прямо в коде, без рендеринга текущего материала. На самом деле это достаточно просто, возможно, даже проще, чем в Drupal 7.
Во-первых, вы должны вывести файл. В Drupal 8 всё основано на сущностях, в том числе и файлы. Вывод файлов происходит так же как и у нод. В следующем примере мы будем загружат файл по его ID.
$file = File::load(1);
Если ваш файл существует, вы можете начать с создания визуализации массива для изображения. В данном примере рендерим как обычный стиль изображения, например "thumbnail".
$variables = array(
'style_name' => 'thumbnail',
'uri' => $file->getFileUri(),
);
// The image.factory service will check if our image is valid.
$image = \Drupal::service('image.factory')->get($file->getFileUri());
if ($image->isValid()) {
$variables['width'] = $image->getWidth();
$variables['height'] = $image->getHeight();
}
else {
$variables['width'] = $variables['height'] = NULL;
}
$logo_render_array = [
'#theme' => 'image_style',
'#width' => $variables['width'],
'#height' => $variables['height'],
'#style_name' => $variables['style_name'],
'#uri' => $variables['uri'],
];
Несмотря на то, что приведённый выше пример прекрасно справляется с задачей, в Drupal 8 есть дополнительные плюшки для более тонкой настройки. Вместо кэширования всех результатов Drupal 8 предоставляет возможность кэширования только необходимого.
Мы добавим наш объект файла в кэш визуализации массива. Таким образом, когда файл обновляется, кэш рендеринга массива очищается.
// Добавляем объект файла к зависимостям кэша.
// Это очистит наш кэш, когда сущность обновится.
$renderer = \Drupal::service('renderer');
$renderer->addCacheableDependency($logo_render_array, $file);
Теперь ваш отрендереный массив готов к использованию в кастомных блоках, страницах, да и вообще везде, где Drupal 8 использует визуализации массива.
Здесь можно посмотреть полный пример (реализованно как плагин блока):
gist.github.com/jerbob92/8b432928ca60cc7fd3da
Здесь пример пагина загрузки по URI:
gist.github.com/jerbob92/c9617da94452a597c36e
Вот пример для визуализации файла с адаптивным изображением:
gist.github.com/jerbob92/dda50c579d2fcb31cecd