Commit 2c0b028d authored by webchick's avatar webchick

Issue #1028092 by jbrown, chi, eojthebrave , dixon_, justinrandell,...

Issue #1028092 by jbrown, chi, eojthebrave , dixon_, justinrandell, Sweetchuck: Fixed critical: Default image is not set to permanent and saved to the wrong schema.
parent 7257058a
......@@ -51,16 +51,18 @@ function image_field_settings_form($field, $instance) {
'#description' => t('Select where the final files should be stored. Private file storage has significantly more overhead than public files, but allows restricted access to files within this field.'),
);
// When the user sets the scheme on the UI, even for the first time, it's
// updating a field because fields are created on the "Manage fields"
// page. So image_field_update_field() can handle this change.
$form['default_image'] = array(
'#title' => t('Default image'),
'#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/',
'#upload_location' => $settings['uri_scheme'] . '://default_images/',
);
return $form;
}
/**
......
......@@ -412,6 +412,58 @@ function image_image_style_delete($style) {
image_image_style_save($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']);
$file_new = $fid_new ? file_load($fid_new) : FALSE;
if ($fid_new != $fid_old) {
// Is there a new file?
if ($file_new) {
$file_new->status = FILE_STATUS_PERMANENT;
file_save($file_new);
file_usage_add($file_new, 'image', 'default_image', $field['id']);
}
// Is there an old file?
if ($fid_old && ($file_old = file_load($fid_old))) {
file_usage_delete($file_old, 'image', 'default_image', $field['id']);
}
}
// If the upload destination changed, then move the file.
if ($file_new && (file_uri_scheme($file_new->uri) != $field['settings']['uri_scheme'])) {
$directory = $field['settings']['uri_scheme'] . '://default_images/';
file_prepare_directory($directory, FILE_CREATE_DIRECTORY);
file_move($file_new, $directory . $file_new->filename);
}
}
/**
* Clear cached versions of a specific file in all styles.
*
......
......@@ -796,7 +796,7 @@ class ImageFieldDisplayTestCase extends ImageFieldTestCase {
// that would be used on the image field.
$this->assertNoPattern('<div class="(.*?)field-name-' . strtr($field_name, '_', '-') . '(.*?)">', t('No image displayed when no image is attached and no default image specified.'));
// Add a default image to the imagefield instance.
// Add a default image to the public imagefield instance.
$images = $this->drupalGetTestFiles('image');
$edit = array(
'files[field_settings_default_image]' => drupal_realpath($images[0]->uri),
......@@ -806,6 +806,7 @@ class ImageFieldDisplayTestCase extends ImageFieldTestCase {
field_info_cache_clear();
$field = field_info_field($field_name);
$image = file_load($field['settings']['default_image']);
$this->assertTrue($image->status == FILE_STATUS_PERMANENT, t('The default image status is permanent.'));
$default_output = theme('image', array('path' => $image->uri));
$this->drupalGet('node/' . $node->nid);
$this->assertRaw($default_output, t('Default image displayed when no user supplied image is present.'));
......@@ -831,6 +832,25 @@ class ImageFieldDisplayTestCase extends ImageFieldTestCase {
field_info_cache_clear();
$field = field_info_field($field_name);
$this->assertFalse($field['settings']['default_image'], t('Default image removed from field.'));
// Create an image field that uses the private:// scheme and test that the
// default image works as expected.
$private_field_name = strtolower($this->randomName());
$this->createImageField($private_field_name, 'article', array('uri_scheme' => 'private'));
// Add a default image to the new field.
$edit = array(
'files[field_settings_default_image]' => drupal_realpath($images[1]->uri),
);
$this->drupalPost('admin/structure/types/manage/article/fields/' . $private_field_name, $edit, t('Save settings'));
$private_field = field_info_field($private_field_name);
$image = file_load($private_field['settings']['default_image']);
$this->assertEqual('private', file_uri_scheme($image->uri), t('Default image uses private:// scheme.'));
$this->assertTrue($image->status == FILE_STATUS_PERMANENT, t('The default image status is permanent.'));
// Create a new node with no image attached and ensure that default private
// image is displayed.
$node = $this->drupalCreateNode(array('type' => 'article'));
$default_output = theme('image', array('path' => $image->uri));
$this->drupalGet('node/' . $node->nid);
$this->assertRaw($default_output, t('Default private image displayed when no user supplied image is present.'));
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment