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