From 39bd5ac83106a7cf3b56ac85fc9a47ba003f10ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= <f.mably@gmail.com> Date: Thu, 27 Mar 2025 20:24:20 +0100 Subject: [PATCH] Issue #3515876 by mably: Make this module compatible with Image Crop Widget and others --- .../Field/FieldWidget/SvgImageWidget.php | 17 +++++--- svg_image.module | 41 +++++++++++++++++++ 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/src/Plugin/Field/FieldWidget/SvgImageWidget.php b/src/Plugin/Field/FieldWidget/SvgImageWidget.php index 4a8dbb7..21529da 100755 --- a/src/Plugin/Field/FieldWidget/SvgImageWidget.php +++ b/src/Plugin/Field/FieldWidget/SvgImageWidget.php @@ -50,11 +50,11 @@ class SvgImageWidget extends ImageWidget { } /** - * {@inheritdoc} + * Build preview for image widget. + * + * Used by svg_image_field_widget_single_element_form_alter hook. */ - public static function process($element, FormStateInterface $form_state, $form) { - $element = parent::process($element, $form_state, $form); - + public static function processElement($element, FormStateInterface $form_state, $form) { // Add the image preview. if (!empty($element['#files']) && $element['#preview_image_style']) { // Override image preview if SVG file. @@ -70,10 +70,17 @@ class SvgImageWidget extends ImageWidget { $element['preview'] = static::buildSvgPreview($file); } } - return $element; } + /** + * {@inheritdoc} + */ + public static function process($element, FormStateInterface $form_state, $form) { + $element = parent::process($element, $form_state, $form); + return static::processElement($element, $form_state, $form); + } + /** * Builds the SVG file preview. * diff --git a/svg_image.module b/svg_image.module index 838030e..e681358 100644 --- a/svg_image.module +++ b/svg_image.module @@ -5,6 +5,7 @@ * Contains main functions and hooks for svg_image module. */ +use Drupal\image\Plugin\Field\FieldWidget\ImageWidget; use Drupal\file\Entity\File; use Drupal\svg_image\Plugin\Field\FieldFormatter\SvgImageFormatter; use Drupal\svg_image\Plugin\Field\FieldFormatter\SvgImageUrlFormatter; @@ -132,3 +133,43 @@ function svg_image_get_image_file_dimensions(File $file) { function svg_image_is_file_svg(File $file) { return $file->getMimeType() === 'image/svg+xml'; } + +/** + * Implements hook_field_widget_single_element_form_alter(). + */ +function svg_image_field_widget_single_element_form_alter(&$element, &$form_state, $context) { + $widget = $context['widget']; + + // Ensure the widget is an ImageWidget but not an SvgImageWidget. + if (!$widget instanceof ImageWidget || $widget instanceof SvgImageWidget) { + return; + } + + $field_definition = $context['items']->getFieldDefinition(); + $field_settings = $field_definition->getSettings(); + + // Ensure the field allows SVG uploads. + if (!isset($field_settings['file_extensions']) || !str_contains($field_settings['file_extensions'], 'svg')) { + return; + } + + // Check if upload validators are set. + if (!isset($element['#upload_validators']['FileExtension']['extensions'])) { + return; + } + + // Add 'svg' to allowed extensions if it's missing. + $extensions = explode(' ', $element['#upload_validators']['FileExtension']['extensions']); + if (!in_array('svg', $extensions)) { + $extensions[] = 'svg'; + $element['#upload_validators']['FileExtension']['extensions'] = implode(' ', $extensions); + } + + // Remove default image validation. Otherwise, we get an error on upload: + // Won't be needed anymore if #3515345 gets merged. + unset($element['#upload_validators']['FileIsImage']); + + // Add the custom process function. + $class = '\Drupal\svg_image\Plugin\Field\FieldWidget\SvgImageWidget'; + $element['#process'][] = [$class, 'processElement']; +} -- GitLab