diff --git a/modules/image/image.field.inc b/modules/image/image.field.inc index a65407f..e4c198c 100644 --- a/modules/image/image.field.inc +++ b/modules/image/image.field.inc @@ -57,7 +57,11 @@ function image_field_settings_form($field, $instance) { '#type' => 'managed_file', '#description' => t('If no image is uploaded, this image will be shown on display.'), '#default_value' => $field['settings']['default_image'], - '#upload_location' => 'public://default_images/', + // We need to save the default image to the scheme specified by the user, + // and the image save happens in the value callback so define a custom + // value callback that knows about the URI scheme element. + '#value_callback' => 'image_field_settings_default_image_value_callback', + '#uri_scheme_element' => &$form['uri_scheme'], ); return $form; @@ -65,6 +69,17 @@ function image_field_settings_form($field, $instance) { } /** + * #value_callback to ensure a correct upload location in image field settings form. + * + * @see file_managed_file_value() + */ +function image_field_settings_default_image_value_callback(&$element, $input = FALSE, $form_state = NULL) { + // Sets the URI scheme as possibly set fresh by the user. + $element['#upload_location'] = $element['#uri_scheme_element']['#value'] . '://default_images/'; + return file_managed_file_value($element, $input, $form_state); +} + +/** * Implements hook_field_instance_settings_form(). */ function image_field_instance_settings_form($field, $instance) { diff --git a/modules/image/image.module b/modules/image/image.module index 8afed87..ef3bfc3 100644 --- a/modules/image/image.module +++ b/modules/image/image.module @@ -415,6 +415,47 @@ function image_image_style_delete($style) { } /** + * Implements hook_field_delete_field(). + */ +function image_field_delete_field($field) { + if ($field['type'] != 'image') { + return; + } + + // The value of a managed_file element can be an array if #extended == TRUE. + $fid = (is_array($field['settings']['default_image']) ? $field['settings']['default_image']['fid'] : $field['settings']['default_image']); + if ($fid && ($file = file_load($fid))) { + file_usage_delete($file, 'image', 'default_image', $field['id']); + } +} + +/** + * Implements hook_field_update_field(). + */ +function image_field_update_field($field, $prior_field, $has_data) { + if ($field['type'] != 'image') { + return; + } + + // The value of a managed_file element can be an array if #extended == TRUE. + $fid_new = (is_array($field['settings']['default_image']) ? $field['settings']['default_image']['fid'] : $field['settings']['default_image']); + $fid_old = (is_array($prior_field['settings']['default_image']) ? $prior_field['settings']['default_image']['fid'] : $prior_field['settings']['default_image']); + if ($fid_new != $fid_old) { + if ($fid_new && ($file_new = file_load($fid_new))) { + if ($file_new->status != FILE_STATUS_PERMANENT) { + $file_new->status = FILE_STATUS_PERMANENT; + file_save($file_new); + } + file_usage_add($file_new, 'image', 'default_image', $field['id']); + } + + if ($fid_old && ($file_old = file_load($fid_old))) { + file_usage_delete($file_old, 'image', 'default_image', $field['id']); + } + } +} + +/** * Clear cached versions of a specific file in all styles. * * @param $path diff --git a/modules/image/image.test b/modules/image/image.test index 483f9fa..37c7f6b 100644 --- a/modules/image/image.test +++ b/modules/image/image.test @@ -780,7 +780,7 @@ class ImageFieldDisplayTestCase extends ImageFieldTestCase { // that would be used on the image field. $this->assertNoPattern('