From 619c35992e6356f0886854d1edaba2d5c97c20dc Mon Sep 17 00:00:00 2001 From: Dries Buytaert Date: Mon, 9 Aug 2010 19:55:57 +0000 Subject: [PATCH] - Patch #812688 by andypost, Damien Tournoud: organize image formatters around settings. --- modules/image/image.field.inc | 97 ++++++++++++++++++++---------- modules/image/image.module | 9 +-- modules/image/image.test | 11 ++-- profiles/standard/standard.install | 6 +- 4 files changed, 80 insertions(+), 43 deletions(-) diff --git a/modules/image/image.field.inc b/modules/image/image.field.inc index 9e276af761d..59e042f4b93 100644 --- a/modules/image/image.field.inc +++ b/modules/image/image.field.inc @@ -428,33 +428,74 @@ function image_field_formatter_info() { 'image' => array( 'label' => t('Image'), 'field types' => array('image'), - ), - 'image_link_content' => array( - 'label' => t('Image linked to content'), - 'field types' => array('image'), - ), - 'image_link_file' => array( - 'label' => t('Image linked to file'), - 'field types' => array('image'), + 'settings' => array('image_style' => '', 'image_link' => ''), ), ); - foreach (image_styles() as $style) { - $formatters['image__' . $style['name']] = array( - 'label' => t('Image "@style"', array('@style' => $style['name'])), - 'field types' => array('image'), - ); - $formatters['image_link_content__' . $style['name']] = array( - 'label' => t('Image "@style" linked to content', array('@style' => $style['name'])), - 'field types' => array('image'), - ); - $formatters['image_link_file__' . $style['name']] = array( - 'label' => t('Image "@style" linked to file', array('@style' => $style['name'])), - 'field types' => array('image'), - ); + return $formatters; +} + +/** + * Implements hook_field_formatter_settings_form(). + */ +function image_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) { + $display = $instance['display'][$view_mode]; + $settings = $display['settings']; + + $image_styles = array('' => t('None (original image)')) + image_style_options(FALSE); + $form['image_style'] = array( + '#title' => t('Image style'), + '#type' => 'select', + '#default_value' => $settings['image_style'], + '#options' => $image_styles, + ); + + $link_types = array( + '' => t(''), + 'content' => t('Content'), + 'file' => t('File'), + ); + $form['image_link'] = array( + '#title' => t('Link image to'), + '#type' => 'select', + '#default_value' => $settings['image_link'], + '#options' => $link_types, + ); + + return $form; +} + +/** + * Implements hook_field_formatter_settings_summary(). + */ +function image_field_formatter_settings_summary($field, $instance, $view_mode) { + $display = $instance['display'][$view_mode]; + $settings = $display['settings']; + + $summary = array(); + + $image_styles = image_style_options(FALSE); + // Unset possible 'No defined styles' option. + unset($image_styles['']); + // Styles could be lost because of enabled/disabled modules that defines + // their styles in code. + if (isset($image_styles[$settings['image_style']])) { + $summary[] = t('Image style: @style', array('@style' => $image_styles[$settings['image_style']])); + } + else { + $summary[] = t('Original image'); } - return $formatters; + $link_types = array( + 'content' => t('Linked to content'), + 'file' => t('Linked to file'), + ); + // Display this setting only if image is linked. + if (isset($link_types[$settings['image_link']])) { + $summary[] = $link_types[$settings['image_link']]; + } + + return implode('
', $summary); } /** @@ -463,17 +504,11 @@ function image_field_formatter_info() { function image_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) { $element = array(); - // Check if the formatter involves a particular image style. - $matches = array(); - if (preg_match('/__([a-z0-9_-]+)/', $display['type'], $matches)) { - $image_style = $matches[1]; - } - // Check if the formatter involves a link. - if (strpos($display['type'], 'image_link_content') === 0) { + if ($display['settings']['image_link'] == 'content') { $uri = entity_uri($entity_type, $entity); } - elseif (strpos($display['type'], 'image_link_file') === 0) { + elseif ($display['settings']['image_link'] == 'file') { $link_file = TRUE; } @@ -487,7 +522,7 @@ function image_field_formatter_view($entity_type, $entity, $field, $instance, $l $element[$delta] = array( '#theme' => 'image_formatter', '#item' => $item, - '#image_style' => isset($image_style) ? $image_style : '', + '#image_style' => $display['settings']['image_style'], '#path' => isset($uri) ? $uri : '', ); } diff --git a/modules/image/image.module b/modules/image/image.module index 05e19bde929..8c40fbaa9fb 100644 --- a/modules/image/image.module +++ b/modules/image/image.module @@ -365,14 +365,11 @@ function image_image_style_save($style) { $instance_changed = FALSE; foreach ($instance['display'] as $view_mode => $display) { // Check if the formatter involves an image style. - $matches = array(); - if (preg_match('/__([a-z0-9_]+)/', $display['type'], $matches)) { + if ($display['type'] == 'image' && $display['settings']['image_style'] == $style['old_name']) { // Update display information for any instance using the image // style that was just deleted. - if ($style['old_name'] == $matches[1]) { - $instance['display'][$view_mode]['type'] = str_replace($style['old_name'], $style['name'], $display['type']); - $instance_changed = TRUE; - } + $instance['display'][$view_mode]['settings']['image_style'] = $style['name']; + $instance_changed = TRUE; } } if ($instance['widget']['settings']['preview_image_style'] == $style['old_name']) { diff --git a/modules/image/image.test b/modules/image/image.test index 9f0604d1d66..ec00a720915 100644 --- a/modules/image/image.test +++ b/modules/image/image.test @@ -592,7 +592,8 @@ class ImageAdminStylesUnitTest extends ImageFieldTestCase { // Create an image field that uses the new style. $field_name = strtolower($this->randomName(10)); $instance = $this->createImageField($field_name, 'article'); - $instance['display']['default']['type'] = 'image__' . $style_name; + $instance['display']['default']['type'] = 'image'; + $instance['display']['default']['settings']['image_style'] = $style_name; field_update_instance($instance); // Create a new node with an image attached. @@ -662,21 +663,23 @@ class ImageFieldDisplayTestCase extends ImageFieldTestCase { // Test the image linked to file formatter. $instance = field_info_instance('node', $field_name, 'article'); - $instance['display']['default']['type'] = 'image_link_file'; + $instance['display']['default']['type'] = 'image'; + $instance['display']['default']['settings']['image_link'] = 'file'; field_update_instance($instance); $default_output = l(theme('image', $image_info), file_create_url($image_uri), array('html' => TRUE)); $this->drupalGet('node/' . $nid); $this->assertRaw($default_output, t('Image linked to file formatter displaying correctly on full node view.')); // Test the image linked to content formatter. - $instance['display']['default']['type'] = 'image_link_content'; + $instance['display']['default']['settings']['image_link'] = 'content'; field_update_instance($instance); $default_output = l(theme('image', $image_info), 'node/' . $nid, array('html' => TRUE, 'attributes' => array('class' => 'active'))); $this->drupalGet('node/' . $nid); $this->assertRaw($default_output, t('Image linked to content formatter displaying correctly on full node view.')); // Test the image style 'thumbnail' formatter. - $instance['display']['default']['type'] = 'image__thumbnail'; + $instance['display']['default']['settings']['image_link'] = ''; + $instance['display']['default']['settings']['image_style'] = 'thumbnail'; field_update_instance($instance); // Ensure the derrivative image is generated so we do not have to deal with // image style callback paths. diff --git a/profiles/standard/standard.install b/profiles/standard/standard.install index 8e1a985d2dc..2881602b068 100644 --- a/profiles/standard/standard.install +++ b/profiles/standard/standard.install @@ -384,12 +384,14 @@ function standard_install() { 'display' => array( 'default' => array( 'label' => 'hidden', - 'type' => 'image__large', + 'type' => 'image', + 'settings' => array('image_style' => 'large', 'image_link' => ''), 'weight' => -1, ), 'teaser' => array( 'label' => 'hidden', - 'type' => 'image_link_content__medium', + 'type' => 'image', + 'settings' => array('image_style' => 'medium', 'image_link' => 'content'), 'weight' => -1, ), ),