Drupal → Сохранять в базе ширину/высоту svg картинок для полей типа Image (Как изменить значение поля перед сохранением)

12.09.2023

Для загрузки и вывода SVG изображений есть модуль Svg Image. Однако он не умеет сохранять в базе ширину/высоту загруженной картинки, как это делает стандартный модуль Image.

Фиксим:

// MODULENAME.module

use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\FieldableEntityInterface;
use Drupal\file\FileInterface;

/**
 * Implements hook_entity_presave().
 */
function MODULENAME_entity_presave(EntityInterface $entity): void {
  if ($entity instanceof FieldableEntityInterface) {
    foreach ($entity->getFieldDefinitions() as $field_name => $field_definition) {
      if ($field_definition->getType() == 'image') {
        foreach ($entity->get($field_name) as $image_field_item) {
          /** @var FileInterface $image_file_entity */
          $image_file_entity = $image_field_item->entity;
          if (
            $image_file_entity &&
            svg_image_is_file_svg($image_file_entity) &&
            !$image_field_item->width &&
            $image_file_dimensions = svg_image_get_image_file_dimensions($image_file_entity)
          ) {
            $image_field_item
              ->set('width', $image_file_dimensions['width'])
              ->set('height', $image_file_dimensions['height']);
          }
        }
      }
    }
  }
}

Ну и выводим соответствующие атрибуты у svg картинок:

/**
 * Preprocess function for image-formatter.html.twig.
 */
function MODULENAME_preprocess_image_formatter(array &$vars): void {
  // Add width/height attribute to svg images
  if (isset($vars['image']['#attributes'])) {
    foreach (['width', 'height'] as $attribute_name) {
      if (
        array_key_exists($attribute_name, $vars['image']['#attributes']) &&
        $vars['image']['#attributes'][$attribute_name] === NULL
      ) {
        unset($vars['image']['#attributes'][$attribute_name]);
      }
    }
  }
}
Написанное актуально для
Drupal 8+
Похожие записи

Добавить комментарий