From 83106a291b1229a4ef52903be6d1e320bec7c7d2 Mon Sep 17 00:00:00 2001 From: RoSk0 Date: Tue, 23 Jul 2013 19:38:27 +0300 Subject: [PATCH] #2047643 by RoSk0: Support per bundle settings. --- includes/name.content.inc | 131 +++++++++++++++++++++++++++++++++++++++++++++- name.module | 31 +++++++++++ 2 files changed, 160 insertions(+), 2 deletions(-) diff --git a/includes/name.content.inc b/includes/name.content.inc index 8c0a775..d131224 100644 --- a/includes/name.content.inc +++ b/includes/name.content.inc @@ -17,6 +17,70 @@ 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_labels['field_name'] = array('#markup' => t('Labels')); + $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_labels[$key] = array( + '#type' => 'textfield', + '#required' => TRUE, + '#size' => 12, + '#default_value' => empty($overridden_settings['overridden_labels']) ? $settings['labels'][$key] : $overridden_settings['overridden_labels'][$key], + ); + } + + $overridden_settings_components = array( + 'header', + 'overridden_components', + 'overridden_minimum_components', + 'overridden_labels', + ); + foreach ($overridden_settings_components as $component) { + $form['override_settings'][$component] = $$component; + } + } + $form['components'] = array( '#type' => 'checkboxes', '#title' => t('Components'), @@ -175,6 +239,9 @@ function _name_field_settings_form_validate($elements, &$form_state, $form) { // 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. + _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 @@ -381,7 +448,11 @@ 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']; + $fs['labels'] = $ws['override_settings']['overridden_labels']; + } $element += array( '#type' => 'name_element', '#title' => check_plain($instance['label']), @@ -540,4 +611,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.module b/name.module index bb43e2a..45cbc3a 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,11 @@ 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']; + $field['settings']['labels'] = $instances[$id]['settings']['override_settings']['overridden_labels']; + } if (empty($field['settings']['components'][$key])) { unset($items[$id][$delta][$key]); } @@ -1395,6 +1405,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 +1415,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 +1717,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