diff --git a/src/Plugin/Field/FieldWidget/SvgImageWidget.php b/src/Plugin/Field/FieldWidget/SvgImageWidget.php index 4a8dbb7b38d6bf6597427ed5778492678139d02f..21529da82e2e12cd85516f508e4eac6491a30eec 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 838030e94438e597e6f0f3ff1e0f8fb60bb6393a..e6813588534ced2d90e98f9e79413de118094171 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']; +}