diff --git core/modules/image/config/image.style.large.yml core/modules/image/config/image.style.large.yml index e4f2e1f..53cd8a3 100644 --- core/modules/image/config/image.style.large.yml +++ core/modules/image/config/image.style.large.yml @@ -2,6 +2,7 @@ name: large effects: image_scale_480_480_1: name: image_scale + label: Large (480x480) data: width: '480' height: '480' diff --git core/modules/image/config/image.style.medium.yml core/modules/image/config/image.style.medium.yml index 17196b4..f1344ef 100644 --- core/modules/image/config/image.style.medium.yml +++ core/modules/image/config/image.style.medium.yml @@ -2,6 +2,7 @@ name: medium effects: image_scale_220_220_1: name: image_scale + label: Medium (220x220) data: width: '220' height: '220' diff --git core/modules/image/config/image.style.thumbnail.yml core/modules/image/config/image.style.thumbnail.yml index 2e6b9c4..941bef6 100644 --- core/modules/image/config/image.style.thumbnail.yml +++ core/modules/image/config/image.style.thumbnail.yml @@ -2,6 +2,7 @@ name: thumbnail effects: image_scale_100_100_1: name: image_scale + label: Thumbnail (100x100) data: width: '100' height: '100' diff --git core/modules/image/image.admin.inc core/modules/image/image.admin.inc index f31d98f..ccc1c97 100644 --- core/modules/image/image.admin.inc +++ core/modules/image/image.admin.inc @@ -32,10 +32,9 @@ function image_style_list() { * An image style array. * @ingroup forms * @see image_style_form_submit() - * @see image_style_name_validate() */ function image_style_form($form, &$form_state, $style) { - $title = t('Edit %name style', array('%name' => $style['name'])); + $title = t('Edit style %name', array('%name' => $style['label'])); drupal_set_title($title, PASS_THROUGH); $form_state['image_style'] = $style; @@ -49,13 +48,24 @@ function image_style_form($form, &$form_state, $style) { '#markup' => theme('image_style_preview', array('style' => $style)), ); - $form['name'] = array( + $form['label'] = array( '#type' => 'textfield', - '#size' => '64', - '#title' => t('Image style name'), + '#title' => t('Image style display name'), + '#default_value' => $style['label'], + '#description' => t('Enter the display name for this style. This name is used in listings of image styles.'), + '#required' => TRUE, + ); + + $form['name'] = array( + '#type' => 'machine_name', '#default_value' => $style['name'], + '#machine_name' => array( + 'exists' => 'image_style_load', + 'source' => array('label'), + // Allow hyphen ("-") in machine names. + 'replace_pattern' => '[^a-z0-9_\-]+', + ), '#description' => t('The name is used in URLs for generated images. Use only lowercase alphanumeric characters, underscores (_), and hyphens (-).'), - '#element_validate' => array('image_style_name_validate'), '#required' => TRUE, ); @@ -199,6 +209,7 @@ function image_style_form_submit($form, &$form_state) { $old_style = $style; $style['name'] = $form_state['values']['name']; } + $style['label'] = $form_state['values']['label']; image_style_save($style); if (isset($old_style)) { image_style_delete($old_style, $style['name']); @@ -215,16 +226,25 @@ function image_style_form_submit($form, &$form_state) { * * @ingroup forms * @see image_style_add_form_submit() - * @see image_style_name_validate() */ function image_style_add_form($form, &$form_state) { - $form['name'] = array( + $form['label'] = array( '#type' => 'textfield', - '#size' => '64', - '#title' => t('Style name'), + '#title' => t('Image style display name'), + '#default_value' => '', + '#description' => t('Enter the display name for this style. This name is used in listings of image styles.'), + '#required' => TRUE, + ); + $form['name'] = array( + '#type' => 'machine_name', + '#machine_name' => array( + 'exists' => 'image_style_load', + 'source' => array('label'), + // Allow hyphen ("-") in machine names. + 'replace_pattern' => '[^a-z0-9_\-]+', + ), '#default_value' => '', '#description' => t('The name is used in URLs for generated images. Use only lowercase alphanumeric characters, underscores (_), and hyphens (-).'), - '#element_validate' => array('image_style_name_validate'), '#required' => TRUE, ); @@ -240,29 +260,16 @@ function image_style_add_form($form, &$form_state) { * Submit handler for adding a new image style. */ function image_style_add_form_submit($form, &$form_state) { - $style = array('name' => $form_state['values']['name']); + $style = array( + 'name' => $form_state['values']['name'], + 'label' => $form_state['values']['label'], + ); $style = image_style_save($style); - drupal_set_message(t('Style %name was created.', array('%name' => $style['name']))); + drupal_set_message(t('Style %name was created.', array('%name' => $style['label']))); $form_state['redirect'] = 'admin/config/media/image-styles/edit/' . $style['name']; } /** - * Element validate function to ensure unique, URL safe style names. - */ -function image_style_name_validate($element, $form_state) { - // Check for duplicates. - $styles = image_styles(); - if (isset($styles[$element['#value']]) && (!isset($form_state['image_style']['name']) || $styles[$element['#value']]['name'] != $form_state['image_style']['name'])) { - form_set_error($element['#name'], t('The image style name %name is already in use.', array('%name' => $element['#value']))); - } - - // Check for illegal characters in image style names. - if (preg_match('/[^0-9a-z_\-]/', $element['#value'])) { - form_set_error($element['#name'], t('Please only use lowercase alphanumeric characters, underscores (_), and hyphens (-) for style names.')); - } -} - -/** * Form builder; Form for deleting an image style. * * @param $style @@ -284,7 +291,7 @@ function image_style_delete_form($form, $form_state, $style) { return confirm_form( $form, - t('Optionally select a style before deleting %style', array('%style' => $style['name'])), + t('Optionally select a style before deleting %style', array('%style' => $style['label'])), 'admin/config/media/image-styles', t('If this style is in use on the site, you may select another style to replace it. All images that have been generated for this style will be permanently deleted.'), t('Delete'), t('Cancel') @@ -298,7 +305,7 @@ function image_style_delete_form_submit($form, &$form_state) { $style = $form_state['image_style']; image_style_delete($style, $form_state['values']['replacement']); - drupal_set_message(t('Style %name was deleted.', array('%name' => $style['name']))); + drupal_set_message(t('Style %name was deleted.', array('%name' => $style['label']))); $form_state['redirect'] = 'admin/config/media/image-styles'; } @@ -395,7 +402,7 @@ function image_effect_delete_form($form, &$form_state, $style, $effect) { $form_state['image_style'] = $style; $form_state['image_effect'] = $effect; - $question = t('Are you sure you want to delete the @effect effect from the %style style?', array('%style' => $style['name'], '@effect' => $effect['label'])); + $question = t('Are you sure you want to delete the @effect effect from the %style style?', array('%style' => $style['label'], '@effect' => $effect['label'])); return confirm_form($form, $question, 'admin/config/media/image-styles/edit/' . $style['name'], '', t('Delete')); } @@ -587,7 +594,7 @@ function theme_image_style_list($variables) { foreach ($styles as $style) { $row = array(); - $row[] = l($style['name'], 'admin/config/media/image-styles/edit/' . $style['name']); + $row[] = l($style['label'], 'admin/config/media/image-styles/edit/' . $style['name']); $row[] = l(t('edit'), 'admin/config/media/image-styles/edit/' . $style['name'], $link_attributes); $row[] = l(t('delete'), 'admin/config/media/image-styles/delete/' . $style['name'], $link_attributes); $rows[] = $row; @@ -723,7 +730,7 @@ function theme_image_style_preview($variables) { // Build the preview of the image style. $preview_url = file_create_url($preview_file) . '?cache_bypass=' . REQUEST_TIME; $output .= '
'; - $output .= check_plain($style['name']) . ' (' . l(t('view actual size'), file_create_url($preview_file) . '?' . time()) . ')'; + $output .= check_plain($style['label']) . ' (' . l(t('view actual size'), file_create_url($preview_file) . '?' . time()) . ')'; $output .= '
'; $output .= '' . theme('image', array('uri' => $preview_url, 'alt' => t('Sample modified image'), 'title' => '', 'attributes' => $preview_attributes)) . ''; $output .= '
' . $preview_image['height'] . 'px
'; diff --git core/modules/image/image.module core/modules/image/image.module index 3edf83c..dd65f2b 100644 --- core/modules/image/image.module +++ core/modules/image/image.module @@ -550,6 +550,11 @@ function image_style_load($name) { if (!isset($style['name'])) { return FALSE; } + // @todo Remove BC when CMI upgrade path lands. + // Backward compatibility with styles without labels. + if (empty($style['label'])) { + $style['label'] = $style['name']; + } if (!empty($style['effects'])) { foreach ($style['effects'] as $ieid => $effect) { @@ -574,7 +579,9 @@ function image_style_load($name) { */ function image_style_save($style) { $config = config('image.style.' . $style['name']); - $config->set('name', $style['name']); + $config + ->set('name', $style['name']) + ->set('label', $style['label']); if (isset($style['effects'])) { $config->set('effects', $style['effects']); } @@ -650,10 +657,10 @@ function image_style_options($include_empty = TRUE) { if ($include_empty && !empty($styles)) { $options[''] = t(''); } - // Use the array concatenation operator '+' here instead of array_merge(), - // because the latter loses the datatype of the array keys, turning - // associative string keys into numeric ones without warning. - $options = $options + drupal_map_assoc(array_keys($styles)); + foreach ($styles as $name => $style) { + $options[$name] = $style['label']; + } + if (empty($options)) { $options[''] = t('No defined styles'); } diff --git core/modules/image/image.test core/modules/image/image.test index f9a4ec1..dcd1b58 100644 --- core/modules/image/image.test +++ core/modules/image/image.test @@ -138,7 +138,7 @@ class ImageStylesPathAndUrlUnitTest extends WebTestBase { parent::setUp(array('image', 'image_module_test')); $this->style_name = 'style_foo'; - image_style_save(array('name' => $this->style_name)); + image_style_save(array('name' => $this->style_name, 'label' => $this->randomName())); } /** @@ -380,11 +380,13 @@ class ImageAdminStylesUnitTest extends ImageFieldTestCase { */ function testNumericStyleName() { $style_name = rand(); + $style_label = $this->randomName(); $edit = array( 'name' => $style_name, + 'label' => $style_label, ); $this->drupalPost('admin/config/media/image-styles/add', $edit, t('Create new style')); - $this->assertRaw(t('Style %name was created.', array('%name' => $style_name)), t('Image style successfully created.')); + $this->assertRaw(t('Style %name was created.', array('%name' => $style_label)), t('Image style successfully created.')); $options = image_style_options(); $this->assertTrue(array_key_exists($style_name, $options), t('Array key %key exists.', array('%key' => $style_name))); } @@ -395,6 +397,7 @@ class ImageAdminStylesUnitTest extends ImageFieldTestCase { function testStyle() { // Setup a style to be created and effects to add to it. $style_name = strtolower($this->randomName(10)); + $style_label = $this->randomName(); $style_path = 'admin/config/media/image-styles/edit/' . $style_name; $effect_edits = array( 'image_resize' => array( @@ -429,9 +432,10 @@ class ImageAdminStylesUnitTest extends ImageFieldTestCase { $edit = array( 'name' => $style_name, + 'label' => $style_label, ); $this->drupalPost('admin/config/media/image-styles/add', $edit, t('Create new style')); - $this->assertRaw(t('Style %name was created.', array('%name' => $style_name)), t('Image style successfully created.')); + $this->assertRaw(t('Style %name was created.', array('%name' => $style_label)), t('Image style successfully created.')); // Add effect form. @@ -474,9 +478,11 @@ class ImageAdminStylesUnitTest extends ImageFieldTestCase { // Test the style overview form. // Change the name of the style and adjust the weights of effects. $style_name = strtolower($this->randomName(10)); + $style_label = $this->randomName(); $weight = count($effect_edits); $edit = array( 'name' => $style_name, + 'label' => $style_label, ); foreach ($style['effects'] as $ieid => $effect) { $edit['effects[' . $ieid . '][weight]'] = $weight; @@ -485,7 +491,7 @@ class ImageAdminStylesUnitTest extends ImageFieldTestCase { // Create an image to make sure it gets flushed after saving. $image_path = $this->createSampleImage($style); - $this->assertEqual($this->getImageCount($style), 1, t('Image style %style image %file successfully generated.', array('%style' => $style['name'], '%file' => $image_path))); + $this->assertEqual($this->getImageCount($style), 1, t('Image style %style image %file successfully generated.', array('%style' => $style['label'], '%file' => $image_path))); $this->drupalPost($style_path, $edit, t('Update style')); @@ -494,12 +500,12 @@ class ImageAdminStylesUnitTest extends ImageFieldTestCase { // Check that the URL was updated. $this->drupalGet($style_path); - $this->assertResponse(200, t('Image style %original renamed to %new', array('%original' => $style['name'], '%new' => $style_name))); + $this->assertResponse(200, t('Image style %original renamed to %new', array('%original' => $style['label'], '%new' => $style_label))); // Check that the image was flushed after updating the style. // This is especially important when renaming the style. Make sure that // the old image directory has been deleted. - $this->assertEqual($this->getImageCount($style), 0, t('Image style %style was flushed after renaming the style and updating the order of effects.', array('%style' => $style['name']))); + $this->assertEqual($this->getImageCount($style), 0, t('Image style %style was flushed after renaming the style and updating the order of effects.', array('%style' => $style['label']))); // Load the style by the new name with the new weights. drupal_static_reset('image_styles'); @@ -520,7 +526,7 @@ class ImageAdminStylesUnitTest extends ImageFieldTestCase { // Create an image to make sure it gets flushed after deleting an effect. $image_path = $this->createSampleImage($style); - $this->assertEqual($this->getImageCount($style), 1, t('Image style %style image %file successfully generated.', array('%style' => $style['name'], '%file' => $image_path))); + $this->assertEqual($this->getImageCount($style), 1, t('Image style %style image %file successfully generated.', array('%style' => $style['label'], '%file' => $image_path))); // Test effect deletion form. $effect = array_pop($style['effects']); @@ -547,7 +553,8 @@ class ImageAdminStylesUnitTest extends ImageFieldTestCase { function testStyleReplacement() { // Create a new style. $style_name = strtolower($this->randomName(10)); - image_style_save(array('name' => $style_name)); + $style_label = $this->randomName(); + image_style_save(array('name' => $style_name, 'label' => $style_label)); $style_path = 'admin/config/media/image-styles/edit/' . $style_name; // Create an image field that uses the new style. @@ -569,8 +576,10 @@ class ImageAdminStylesUnitTest extends ImageFieldTestCase { // Rename the style and make sure the image field is updated. $new_style_name = strtolower($this->randomName(10)); + $new_style_label = $this->randomName(); $edit = array( 'name' => $new_style_name, + 'label' => $new_style_label, ); $this->drupalPost('admin/config/media/image-styles/edit/' . $style_name, $edit, t('Update style')); $this->assertText(t('Changes to the style have been saved.'), t('Style %name was renamed to %new_name.', array('%name' => $style_name, '%new_name' => $new_style_name))); @@ -582,7 +591,7 @@ class ImageAdminStylesUnitTest extends ImageFieldTestCase { 'replacement' => 'thumbnail', ); $this->drupalPost('admin/config/media/image-styles/delete/' . $new_style_name, $edit, t('Delete')); - $message = t('Style %name was deleted.', array('%name' => $new_style_name)); + $message = t('Style %name was deleted.', array('%name' => $new_style_label)); $this->assertRaw($message, $message); $this->drupalGet('node/' . $nid); @@ -929,7 +938,7 @@ class ImageDimensionsUnitTest extends WebTestBase { $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME); // Create a style. - $style = image_style_save(array('name' => 'test')); + $style = image_style_save(array('name' => 'test', 'label' => 'Test')); $generated_uri = 'public://styles/test/public/'. drupal_basename($original_uri); $url = image_style_url('test', $original_uri); @@ -1141,8 +1150,6 @@ class ImageDimensionsScaleTestCase extends UnitTestBase { */ function testImageDimensionsScale() { // Define input / output datasets to test different branch conditions. - $test = array(); - // Test branch conditions: // - No height. // - Upscale, don't need to upscale.