diff options
author | Angie Byron <webchick@24967.no-reply.drupal.org> | 2010-10-23 15:55:04 +0000 |
---|---|---|
committer | Angie Byron <webchick@24967.no-reply.drupal.org> | 2010-10-23 15:55:04 +0000 |
commit | 156dec00af69e26b42335a6b0f66483ce522996f (patch) | |
tree | 7b111f2fe28c5d941aa67ce9b43343e5414c4e90 /modules/field_ui/field_ui.admin.inc | |
parent | 00e207a26999c3785f27dd22d1c19e868a6edea2 (diff) | |
download | brdo-156dec00af69e26b42335a6b0f66483ce522996f.tar.gz brdo-156dec00af69e26b42335a6b0f66483ce522996f.tar.bz2 |
Trying #886152 again: Fixed All fields are hidden after the administrator newly configures a view mode to not use 'default' display.
Diffstat (limited to 'modules/field_ui/field_ui.admin.inc')
-rw-r--r-- | modules/field_ui/field_ui.admin.inc | 86 |
1 files changed, 74 insertions, 12 deletions
diff --git a/modules/field_ui/field_ui.admin.inc b/modules/field_ui/field_ui.admin.inc index 27ff1e03a..c88a51251 100644 --- a/modules/field_ui/field_ui.admin.inc +++ b/modules/field_ui/field_ui.admin.inc @@ -1267,19 +1267,23 @@ function field_ui_display_overview_form_submit($form, &$form_state) { // Save data for 'regular' fields. foreach ($form['#fields'] as $field_name) { - $instance = field_info_instance($entity_type, $field_name, $bundle); + // Retrieve the stored instance settings to merge with the incoming values. + $instance = field_read_instance($entity_type, $field_name, $bundle); $values = $form_values['fields'][$field_name]; // Get formatter settings. They lie either directly in submitted form // values (if the whole form was submitted while some formatter // settings were being edited), or have been persisted in // $form_state. - $settings = $instance['display'][$view_mode]['settings']; + $settings = array(); if (isset($values['settings_edit_form']['settings'])) { $settings = $values['settings_edit_form']['settings']; } elseif (isset($form_state['formatter_settings'][$field_name])) { $settings = $form_state['formatter_settings'][$field_name]; } + elseif (isset($instance['display'][$view_mode]['settings'])) { + $settings = $instance['display'][$view_mode]['settings']; + } // Only save settings actually used by the selected formatter. $default_settings = field_info_formatter_settings($values['type']); @@ -1311,10 +1315,14 @@ function field_ui_display_overview_form_submit($form, &$form_state) { foreach ($form_values['view_modes_custom'] as $view_mode_name => $value) { // Display a message for each view mode newly configured to use custom // settings. - if (!empty($value) && empty($bundle_settings['view_modes'][$view_mode_name]['custom_settings'])) { + $view_mode_settings = field_view_mode_settings($entity_type, $bundle); + if (!empty($value) && empty($view_mode_settings[$view_mode_name]['custom_settings'])) { $view_mode_label = $entity_info['view modes'][$view_mode_name]['label']; $path = _field_ui_bundle_admin_path($entity_type, $bundle) . "/display/$view_mode_name"; drupal_set_message(t('The %view_mode mode now uses custom display settings. You might want to <a href="@url">configure them</a>.', array('%view_mode' => $view_mode_label, '@url' => url($path)))); + // Initialize the newly customized view mode with the display settings + // from the default view mode. + _field_ui_add_default_view_mode_settings($entity_type, $bundle, $view_mode_name, $bundle_settings); } $bundle_settings['view_modes'][$view_mode_name]['custom_settings'] = !empty($value); } @@ -1327,6 +1335,50 @@ function field_ui_display_overview_form_submit($form, &$form_state) { } /** + * Helper function for field_ui_display_overview_form_submit(). + * + * When an administrator decides to use custom display settings for a view mode, + * that view mode needs to be initialized with the display settings for the + * 'default' view mode, which it was previously using. This helper function + * adds the new custom display settings to this bundle's instances, and saves + * them. It also modifies the passed-in $settings array, which the caller can + * then save using field_bundle_settings(). + * + * @see field_bundle_settings() + * + * @param $entity_type + * The bundle's entity type. + * @param $bundle + * The bundle whose view mode is being customized. + * @param $view_mode + * The view mode that the administrator has set to use custom settings. + * @param $settings + * An associative array of bundle settings, as expected by + * field_bundle_settings(). + */ +function _field_ui_add_default_view_mode_settings($entity_type, $bundle, $view_mode, &$settings) { + // Update display settings for field instances. + $instances = field_read_instances(array('entity_type' => $entity_type, 'bundle' => $bundle)); + foreach ($instances as $instance) { + // If this field instance has display settings defined for this view mode, + // respect those settings. + if (!isset($instance['display'][$view_mode])) { + // The instance doesn't specify anything for this view mode, so use the + // default display settings. + $instance['display'][$view_mode] = $instance['display']['default']; + field_update_instance($instance); + } + } + + // Update display settings for 'extra fields'. + foreach (array_keys($settings['extra_fields']['display']) as $name) { + if (!isset($settings['extra_fields']['display'][$name][$view_mode])) { + $settings['extra_fields']['display'][$name][$view_mode] = $settings['extra_fields']['display'][$name]['default']; + } + } +} + +/** * Return an array of field_type options. */ function field_ui_field_type_options() { @@ -1537,17 +1589,24 @@ function field_ui_field_settings_form_submit($form, &$form_state) { * Menu callback; select a widget for the field. */ function field_ui_widget_type_form($form, &$form_state, $instance) { + drupal_set_title($instance['label']); + $bundle = $instance['bundle']; $entity_type = $instance['entity_type']; - $field = field_info_field($instance['field_name']); - - drupal_set_title($instance['label']); + $field_name = $instance['field_name']; + $field = field_info_field($field_name); $field_type = field_info_field_types($field['type']); $widget_type = field_info_widget_types($instance['widget']['type']); $bundles = field_info_bundles(); $bundle_label = $bundles[$entity_type][$bundle]['label']; + $form = array( + '#bundle' => $bundle, + '#entity_type' => $entity_type, + '#field_name' => $field_name, + ); + $form['basic'] = array( '#type' => 'fieldset', '#title' => t('Change widget'), @@ -1561,7 +1620,6 @@ function field_ui_widget_type_form($form, &$form_state, $instance) { '#description' => t('The type of form element you would like to present to the user when creating this field in the %type type.', array('%type' => $bundle_label)), ); - $form['#instance'] = $instance; $form['actions'] = array('#type' => 'actions'); $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Continue')); @@ -1576,9 +1634,12 @@ function field_ui_widget_type_form($form, &$form_state, $instance) { */ function field_ui_widget_type_form_submit($form, &$form_state) { $form_values = $form_state['values']; - $instance = $form['#instance']; - $bundle = $instance['bundle']; - $entity_type = $instance['entity_type']; + $bundle = $form['#bundle']; + $entity_type = $form['#entity_type']; + $field_name = $form['#field_name']; + + // Retrieve the stored instance settings to merge with the incoming values. + $instance = field_read_instance($entity_type, $field_name, $bundle); // Set the right module information. $widget_type = field_info_widget_types($form_values['widget_type']); @@ -1586,6 +1647,7 @@ function field_ui_widget_type_form_submit($form, &$form_state) { $instance['widget']['type'] = $form_values['widget_type']; $instance['widget']['module'] = $widget_module; + try { field_update_instance($instance); drupal_set_message(t('Changed the widget for field %label.', array('%label' => $instance['label']))); @@ -1912,8 +1974,8 @@ function field_ui_field_edit_form_submit($form, &$form_state) { field_default_submit(NULL, NULL, $field, $instance, LANGUAGE_NONE, $items, $form, $form_state); $instance['default_value'] = $items ? $items : NULL; - // Update the instance settings. - $instance_source = field_info_instance($instance['entity_type'], $instance['field_name'], $instance['bundle']); + // Retrieve the stored instance settings to merge with the incoming values. + $instance_source = field_read_instance($instance['entity_type'], $instance['field_name'], $instance['bundle']); $instance = array_merge($instance_source, $instance); field_update_instance($instance); |