Главная/Статьи/Drupal 8 Программный вывод изображения со стилями
Drupal

Drupal 8 Программный вывод изображения со стилями

Вывести изображение программно в Drupal 8 достаточно просто — возможно, даже проще, чем в Drupal 7. Рассмотрим полный процесс: от загрузки файла до построения render array с применением стилей изображений и кэш-зависимостями.

Шаг 1: Загрузка файла

Загружаем файл по его ID через систему сущностей:

$file = File::load(1);

Шаг 2: Подготовка переменных и валидация

Создаём массив переменных с именем стиля и URI файла. Затем используем сервис image.factory для проверки валидности изображения и получения его размеров:

$variables = array(
  'style_name' => 'thumbnail',
  'uri' => $file->getFileUri(),
);

// Сервис image.factory проверит валидность изображения
$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;
}

Шаг 3: Построение render array

Строим render array с использованием темы image_style:

$logo_render_array = [
  '#theme'      => 'image_style',
  '#width'      => $variables['width'],
  '#height'     => $variables['height'],
  '#style_name' => $variables['style_name'],
  '#uri'        => $variables['uri'],
];

Шаг 4: Кэш-зависимости

Drupal 8 предоставляет гранулярное управление кэшем. Добавляем объект файла как кэш-зависимость — это обеспечит сброс кэша при обновлении файла:

// Добавляем объект файла к зависимостям кэша.
// Это очистит наш кэш, когда сущность обновится.
$renderer = \\Drupal::service('renderer');
$renderer->addCacheableDependency($logo_render_array, $file);