From f61b049483e3a8a7b6d75b1be31f41d322099a13 Mon Sep 17 00:00:00 2001 From: Alex Pott <alex.a.pott@googlemail.com> Date: Wed, 9 Apr 2014 05:45:58 -0400 Subject: [PATCH] Issue #2226241 by voidberg, claudiu.cristea: Saving image field or instance with an inexistent default_image crashes. --- core/modules/image/image.module | 25 ++++++------ .../Plugin/Field/FieldType/ImageItem.php | 1 + .../Tests/ImageFieldDefaultImagesTest.php | 39 +++++++++++++++++++ .../lib/Drupal/user/Tests/UserCreateTest.php | 2 - 4 files changed, 53 insertions(+), 14 deletions(-) diff --git a/core/modules/image/image.module b/core/modules/image/image.module index a57fe55d724b..dc2599806ff0 100644 --- a/core/modules/image/image.module +++ b/core/modules/image/image.module @@ -376,9 +376,11 @@ function image_entity_presave(EntityInterface $entity) { $entity_type_id = $entity->getEntityTypeId(); if ($entity_type_id == 'field_instance_config') { $field = $entity->getField(); + $default_settings = \Drupal::service('plugin.manager.field.field_type')->getDefaultInstanceSettings('image'); } elseif ($entity_type_id == 'field_config') { $field = $entity; + $default_settings = \Drupal::service('plugin.manager.field.field_type')->getDefaultSettings('image'); } // Exit, if not saving an image field or image field instance entity. if (!$field || $field->type != 'image') { @@ -389,20 +391,19 @@ function image_entity_presave(EntityInterface $entity) { if ($fid) { $original_fid = isset($entity->original) ? $entity->original->settings['default_image']['fid'] : NULL; if ($fid != $original_fid) { - $image = \Drupal::service('image.factory')->get(file_load($fid)->getFileUri()); - $entity->settings['default_image']['width'] = $image->getWidth(); - $entity->settings['default_image']['height'] = $image->getHeight(); + $file = file_load($fid); + if ($file) { + $image = \Drupal::service('image.factory')->get($file->getFileUri()); + $entity->settings['default_image']['width'] = $image->getWidth(); + $entity->settings['default_image']['height'] = $image->getHeight(); + } + else { + $entity->settings['default_image']['fid'] = NULL; + } } } - else { - $entity->settings['default_image'] = array( - 'fid' => NULL, - 'alt' => '', - 'title' => '', - 'width' => NULL, - 'height' => NULL, - ); - } + + $entity->settings['default_image'] += $default_settings['default_image']; } /** diff --git a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php index 7a936348aef9..3ea3d84f1aed 100644 --- a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php +++ b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php @@ -71,6 +71,7 @@ public static function defaultInstanceSettings() { 'default_image' => array( 'fid' => NULL, 'alt' => '', + 'title' => '', 'width' => NULL, 'height' => NULL, ), diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php index edf1919510db..c0fd5d7d9c86 100644 --- a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php +++ b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php @@ -291,4 +291,43 @@ public function testDefaultImages() { ); } + /** + * Tests image field and instance having an invalid default image. + */ + public function testInvalidDefaultImage() { + $field = array( + 'name' => drupal_strtolower($this->randomName()), + 'entity_type' => 'node', + 'type' => 'image', + 'settings' => array( + 'default_image' => array( + 'fid' => 100000, + ) + ), + ); + $instance = array( + 'field_name' => $field['name'], + 'label' => $this->randomName(), + 'entity_type' => 'node', + 'bundle' => 'page', + 'settings' => array( + 'default_image' => array( + 'fid' => 100000, + ) + ), + ); + $field_config = entity_create('field_config', $field); + $field_config->save(); + $settings = $field_config->getSettings(); + // The non-existent default image should not be saved. + $this->assertNull($settings['default_image']['fid']); + + $field_instance_config = entity_create('field_instance_config', $instance); + $field_instance_config->save(); + $settings = $field_instance_config->getSettings(); + // The non-existent default image should not be saved. + $this->assertNull($settings['default_image']['fid']); + + } + } diff --git a/core/modules/user/lib/Drupal/user/Tests/UserCreateTest.php b/core/modules/user/lib/Drupal/user/Tests/UserCreateTest.php index cc6d2adf1c83..7ba715db3a72 100644 --- a/core/modules/user/lib/Drupal/user/Tests/UserCreateTest.php +++ b/core/modules/user/lib/Drupal/user/Tests/UserCreateTest.php @@ -49,7 +49,6 @@ protected function testUserAdd() { 'indexes' => array('target_id' => array('target_id')), 'settings' => array( 'uri_scheme' => 'public', - 'default_image' => FALSE, ), ); entity_create('field_config', $field)->save(); @@ -69,7 +68,6 @@ protected function testUserAdd() { 'title_field' => 0, 'max_resolution' => '85x85', 'min_resolution' => '', - 'default_image' => 0, ), ); entity_create('field_instance_config', $instance)->save(); -- GitLab