From 61af5d89737d28564ea5cf7e8dedd72b04b8cb3f Mon Sep 17 00:00:00 2001 From: RoSk0 Date: Wed, 24 Jul 2013 16:37:51 +0300 Subject: [PATCH] #2047643 by RoSk0: Support per bundle settings. --- includes/name.content.inc | 136 ++++++++++++++++++++++++++++++++++++++++++++-- name.admin.inc | 17 ++++++ name.module | 30 ++++++++++ 3 files changed, 179 insertions(+), 4 deletions(-) diff --git a/includes/name.content.inc b/includes/name.content.inc index 8c0a775..1149700 100644 --- a/includes/name.content.inc +++ b/includes/name.content.inc @@ -17,6 +17,62 @@ function _name_field_settings_form($field, $instance, $has_data) { $settings = $field['settings']; $form = array('#tree' => TRUE); $components = _name_translations(); + + $field_bundles = _name_count_field_bundles($field['bundles']); + // There is no need to show override settings if there is only one field + // bundle. + if ($field_bundles > 1) { + $form['override'] = array( + '#type' => 'checkbox', + '#title' => t('Override field components for this bundle?'), + '#default_value' => empty($instance['settings']['override']) ? 0 : 1, + ); + + $form['override_settings'] = array( + '#type' => 'container', + '#theme' => 'name_override_settings', + '#tree' => TRUE, + '#states' => array( + 'visible' => array( + ':input[name="field[settings][override]"]' => array('checked' => TRUE), + ), + ), + ); + + $message = 'Settings specified in this table will by applied ONLY to this' + . ' instance of this field, unlike of the settings in table below.'; + $form['override_settings']['caption'] = array( + '#markup' => t($message), + ); + + $header['field_name'] = array('#markup' => t('Field')); + $overridden_components['field_name'] = array('#markup' => t('Components')); + $overridden_minimum_components['field_name'] = array('#markup' => t('Minimum components')); + $overridden_settings = empty($instance['settings']['override_settings']) ? array() : $instance['settings']['override_settings']; + foreach ($components as $key => $title) { + $header[$key] = array('#markup' => $title); + $overridden_components[$key] = array( + '#type' => 'checkbox', + '#default_value' => empty($overridden_settings['overridden_components']) ? 0 : $overridden_settings['overridden_components'][$key], + '#return_value' => $key, + ); + $overridden_minimum_components[$key] = array( + '#type' => 'checkbox', + '#default_value' => empty($overridden_settings['overridden_minimum_components']) ? 0 : $overridden_settings['overridden_minimum_components'][$key], + '#return_value' => $key, + ); + } + + $overridden_settings_components = array( + 'header', + 'overridden_components', + 'overridden_minimum_components', + ); + foreach ($overridden_settings_components as $component) { + $form['override_settings'][$component] = $$component; + } + } + $form['components'] = array( '#type' => 'checkboxes', '#title' => t('Components'), @@ -172,9 +228,15 @@ function _name_field_settings_form_validate($elements, &$form_state, $form) { _name_options_validate($values['generational_options'], $values['max_length']['generational'], t('Generational options'), 'field][settings][generational_options'); - // Validates that a minimum component is checked when that component is not used. + // Validates that a minimum component is checked when that component is not + // used. _name_field_components_validate($values['components'], $values['minimum_components'], 'field][settings][minimum_components'); + // Same validation for overridden components. + if (isset($values['override_settings'])) { + _name_field_components_validate($values['override_settings']['overridden_components'], + $values['override_settings']['overridden_minimum_components'], 'field][settings][override_settings][overridden_minimum_components'); + } } // TODO - hook_field_views_data() if required @@ -304,6 +366,12 @@ function _name_field_instance_settings_form($field, $instance = NULL) { '#default_value' => isset($settings['inline_css']) ? $settings['inline_css'][$key] : '', '#size' => 8, ); + $form['labels'][$key] = array( + '#type' => 'textfield', + '#title' => t('Label for !title', array('!title' => $title)), + '#default_value' => isset($settings['labels']) ? $settings['labels'][$key] : '', + '#size' => 12, + ); } $form['component_css'] = array( @@ -381,7 +449,10 @@ function _name_field_widget_form(&$form, &$form_state, $field, $instance, $langc _name_defaults($field['settings'], 'settings'); $fs = $field['settings']; $ws = $instance['settings']; - + if (!empty($ws['override'])) { + $fs['components'] = $ws['override_settings']['overridden_components']; + $fs['minimum_components'] = $ws['override_settings']['overridden_minimum_components']; + } $element += array( '#type' => 'name_element', '#title' => check_plain($instance['label']), @@ -405,7 +476,8 @@ function _name_field_widget_form(&$form, &$form_state, $field, $instance, $langc $size = !empty($ws['size'][$key]) ? $ws['size'][$key] : 60; $title_display = isset($ws['title_display'][$key]) ? $ws['title_display'][$key] : 'description'; - $element['#components'][$key]['title'] = check_plain($fs['labels'][$key]); + $component_label = empty($ws['labels'][$key]) ? $fs['labels'][$key] : $ws['labels'][$key]; + $element['#components'][$key]['title'] = check_plain($component_label); $element['#components'][$key]['title_display'] = $title_display; $element['#components'][$key]['size'] = $size; @@ -540,4 +612,60 @@ function _name_get_vocabulary_id_by_code_or_number($value) { $vid = $vocab->vid; } return $vid; -} \ No newline at end of file +} + +/** + * Return quantity of current field bundles. + * + * @param array $bundles + * Array of bundles from field_info_field() return($field['bundles']). + * + * @return int + * Quantity of bundles. + */ +function _name_count_field_bundles($bundles) { + $count =& drupal_static(__FUNCTION__, 0); + foreach ($bundles as $bundle) { + if (is_array($bundle)) { + _name_count_field_bundles($bundle); + } + else { + $count++; + } + } + + return $count; +} + +/** + * Themes override settings table. + */ +function theme_name_override_settings($variables) { + $table = $variables['table']; + $caption = $table['caption']['#markup']; + unset($table['caption']); + + $header = array(); + foreach (element_children($table['header']) as $key) { + $header[$key]['data'] = $table['header'][$key]; + } + unset($table['header']); + + $rows = array(); + foreach (element_children($table) as $id) { + $row = array('data' => array()); + $row['data'][] = drupal_render($table[$id]['field_name']); + foreach (_name_translations() as $key => $title) { + $row['data'][] = drupal_render($table[$id][$key]); + } + $rows[] = $row; + } + $output = theme('table', array( + 'caption' => $caption, + 'header' => $header, + 'rows' => $rows, + )); + $output .= drupal_render_children($table); + + return $output; +} diff --git a/name.admin.inc b/name.admin.inc index 0d874bf..def2e43 100644 --- a/name.admin.inc +++ b/name.admin.inc @@ -555,6 +555,11 @@ function _name_field_instance_settings_pre_render($form) { '#suffix' => '', '#weight' => 4, ), + 'labels' => array( + '#prefix' => '' . t('Label overrides') . '5', + '#suffix' => '', + '#weight' => 5, + ), ), 'tfoot' => array( '#markup' => '
    ' @@ -563,6 +568,7 @@ function _name_field_instance_settings_pre_render($form) { . '
  1. ' . t('The Field type controls how the field is rendered. Autocomplete is a text field with autocomplete, and the behaviour of this is controlled by the field settings.') . '
  2. ' . '
  3. ' . t('The HTML size property tells the browser what the width of the field should be when it is rendered. This gets overriden by the themes CSS properties. This must be between 1 and 255.') . '
  4. ' . '
  5. ' . t('Additional inline styles for the input element. For example, "width: 45px; background-color: #f3f3f3"') . '
  6. ' + . '
  7. ' . t('Optional overrides for field labels.') . '
  8. ' . '
', '#weight' => 2, ), @@ -591,6 +597,9 @@ function _name_field_instance_settings_pre_render($form) { unset($form['instance_inline_css'][$key]['#description']); unset($form['instance_inline_css'][$key]['#title']); + unset($form['instance_labels'][$key]['#description']); + unset($form['instance_labels'][$key]['#title']); + // Moves the size element into the table. $form['styled_settings']['tbody']['size'][$key] = $form['instance_size'][$key]; $form['styled_settings']['tbody']['size'][$key]['#prefix'] = ''; @@ -612,6 +621,11 @@ function _name_field_instance_settings_pre_render($form) { $form['styled_settings']['tbody']['inline_css'][$key]['#suffix'] = ''; $form['styled_settings']['tbody']['inline_css'][$key]['#weight'] = $i; + $form['styled_settings']['tbody']['labels'][$key] = $form['instance_labels'][$key]; + $form['styled_settings']['tbody']['labels'][$key]['#prefix'] = ''; + $form['styled_settings']['tbody']['labels'][$key]['#suffix'] = ''; + $form['styled_settings']['tbody']['labels'][$key]['#weight'] = $i; + // Clean up the leftovers. unset($form['instance_size'][$key]); $form['instance_size']['#access'] = FALSE; @@ -625,6 +639,9 @@ function _name_field_instance_settings_pre_render($form) { unset($form['instance_inline_css'][$key]); $form['instance_inline_css']['#access'] = FALSE; + unset($form['instance_labels'][$key]); + $form['instance_labels']['#access'] = FALSE; + } return $form; diff --git a/name.module b/name.module index bb43e2a..05b2479 100644 --- a/name.module +++ b/name.module @@ -149,6 +149,11 @@ function name_theme() { 'name_format_parameter_help' => array( 'file' => 'includes/name.parser.inc', ), + // Themes override settings table. + 'name_override_settings' => array( + 'render element' => 'table', + 'file' => 'includes/name.content.inc', + ), ); return $theme; @@ -979,6 +984,10 @@ function name_field_load($entity_type, $entities, $field, $instances, $langcode, foreach ($entities as $id => $entity) { foreach ($items[$id] as $delta => $item) { foreach (_name_translations() as $key => $title) { + if (!empty($instances[$id]['settings']['override'])) { + $field['settings']['components'] = $instances[$id]['settings']['override_settings']['overridden_components']; + $field['settings']['minimum_components'] = $instances[$id]['settings']['override_settings']['overridden_minimum_components']; + } if (empty($field['settings']['components'][$key])) { unset($items[$id][$delta][$key]); } @@ -1395,6 +1404,7 @@ function name_form_field_ui_field_edit_form_alter(&$form, &$form_state, $form_id if (isset($form['field']['settings'])) { $form['field']['settings']['#pre_render'][] = 'name_field_settings_pre_render'; } + $form['#submit'][] = 'name_field_settings_form_submit'; } function name_form_field_ui_field_settings_form_alter(&$form) { @@ -1404,6 +1414,7 @@ function name_form_field_ui_field_settings_form_alter(&$form) { if (isset($form['field']['settings'])) { $form['field']['settings']['#pre_render'][] = 'name_field_settings_pre_render'; } + $form['#submit'][] = 'name_field_settings_form_submit'; } /** @@ -1705,3 +1716,22 @@ function name_features_api() { ), ); } + +/** + * Submit handler for field settings form. + * + * Duplicates override settings to field instance. + */ +function name_field_settings_form_submit($form, &$form_state) { + $values = $form_state['values']; + $entity = empty($form['#entity_type']) ? $values['instance']['entity_type'] : $form['#entity_type']; + $bundle = empty($form['#bundle']) ? $values['instance']['bundle'] : $form['#bundle']; + $field_name = empty($values['field']['field_name']) ? $values['instance']['field_name'] : $values['field']['field_name']; + $settings = $values['field']['settings']; + if (!empty($settings['override'])) { + $instance = field_info_instance($entity, $field_name, $bundle); + $instance['settings']['override'] = 1; + $instance['settings']['override_settings'] = $settings['override_settings']; + field_update_instance($instance); + } +} -- 1.8.1.2