diff --git a/core/modules/image/image.admin.inc b/core/modules/image/image.admin.inc index d0ef114..32c656e 100644 --- a/core/modules/image/image.admin.inc +++ b/core/modules/image/image.admin.inc @@ -376,6 +376,12 @@ function image_effect_form_submit($form, &$form_state) { 'data' => $form_state['values']['data'], 'weight' => $form_state['values']['weight'], ); + + // Are we editing an exiting style? + if (!empty($form_state['image_effect']['ieid'])) { + $effect['ieid'] = $form_state['image_effect']['ieid']; + } + image_effect_save($form_state['image_style']['name'], $effect); drupal_set_message(t('The image effect was successfully applied.')); $form_state['redirect'] = 'admin/config/media/image-styles/edit/' . $form_state['image_style']['name']; diff --git a/core/modules/image/image.module b/core/modules/image/image.module index 397ac95..af80f96 100644 --- a/core/modules/image/image.module +++ b/core/modules/image/image.module @@ -1124,7 +1124,13 @@ function image_effect_save($style_name, $effect) { // @todo The machine name must not use any special non-alphanumeric // characters, and may also not contain dots/periods, as that is the // config system's nested key syntax. - $effect['ieid'] = preg_replace('@[^a-zA-Z0-9_-]@', '', $effect['ieid']); + $new_ieid = preg_replace('@[^a-zA-Z0-9_-]@', '', $effect['ieid']); + // Make sure the ieid is unique + $effects = $config->get('effects'); + if (array_key_exists($new_ieid, $effects)) { + $new_ieid .= user_password(); + } + $effect['ieid'] = $new_ieid; } $config->set('effects.' . $effect['ieid'], $effect); $config->save(); diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageAdminStylesTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageAdminStylesTest.php index d683720..57ff8fe 100644 --- a/core/modules/image/lib/Drupal/image/Tests/ImageAdminStylesTest.php +++ b/core/modules/image/lib/Drupal/image/Tests/ImageAdminStylesTest.php @@ -258,4 +258,34 @@ class ImageAdminStylesTest extends ImageFieldTestBase { $this->drupalGet('node/' . $nid); $this->assertRaw(image_style_url('thumbnail', $node->{$field_name}[LANGUAGE_NOT_SPECIFIED][0]['uri']), t('Image displayed using style replacement style.')); } + + /** + * Verify that editing an image effect does not cause it to duplicate. + */ + function testEditEffect() { + $this->drupalGet('admin/config/media/image-styles/add'); + $this->drupalPost(NULL, array('name' => 'test_style_effect_edit'), t('Create new style')); + $this->drupalPost(NULL, array('new' => 'image_scale_and_crop'), t('Add')); + $this->drupalPost(NULL, array('data[width]' => '300', 'data[height]' => '200'), t('Add effect')); + $this->assertText(t('Scale and crop 300x200')); + // There should normally be only the one edit link on this page initially. + $this->clickLink(t('edit')); + $this->drupalPost(NULL, array('data[width]' => '360', 'data[height]' => '240'), t('Update effect')); + $this->assertText(t('Scale and crop 360x240')); + // Check the previous effect is not also retained on this style after editing. + $this->assertNoText(t('Scale and crop 300x200')); + // Add scale effect, edit effect, add new effect that matches original scale + // effect, check that both effects still exist + $this->drupalGet('admin/config/media/image-styles/add'); + $this->drupalPost(NULL, array('name' => 'test_style_scale_edit_scale'), t('Create new style')); + $this->drupalPost(NULL, array('new' => 'image_scale'), t('Add')); + $this->drupalPost(NULL, array('data[width]' => '12', 'data[height]' => '19'), t('Add effect')); + $this->clickLink(t('edit')); + $this->drupalPost(NULL, array('data[width]' => '24', 'data[height]' => '19'), t('Update effect')); + $this->drupalPost(NULL, array('new' => 'image_scale'), t('Add')); + $this->drupalPost(NULL, array('data[width]' => '12', 'data[height]' => '19'), t('Add effect')); + $this->assertText(t('Scale 24x19')); + $this->assertText(t('Scale 12x19')); + + } }