diff --git a/includes/name.content.inc b/includes/name.content.inc index 8c0a775e80b1bad855009f8a0f0424e92858e800..dcee1eda5f3504009233cc9ea089559a525ac686 100644 --- a/includes/name.content.inc +++ b/includes/name.content.inc @@ -172,9 +172,28 @@ 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 not selected when that component is + // not selected. _name_field_components_validate($values['components'], $values['minimum_components'], 'field][settings][minimum_components'); + + if (!empty($form_state['values']['instance'])) { + $instance_settings = $form_state['values']['instance']['settings']; + $instance_components = array_filter($instance_settings['components']); + $instance_minimum_components = array_filter($instance_settings['minimum_components']); + if ($instance_components && $instance_minimum_components) { + _name_field_components_validate($instance_components, + $instance_minimum_components, 'instance[settings][minimum_components'); + } + elseif ($instance_minimum_components) { + _name_field_components_validate($values['components'], + $instance_minimum_components, 'instance[settings][minimum_components'); + } + elseif ($instance_components) { + _name_field_components_validate($instance_components, + $values['minimum_components'], 'instance[settings][components'); + } + } } // TODO - hook_field_views_data() if required @@ -304,8 +323,28 @@ 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['components'] = array( + '#type' => 'checkboxes', + '#title' => t('Components overrides'), + '#default_value' => $settings['components'], + '#options' => $components, + '#element_validate' => array('_name_field_minimal_component_requirements'), + ); + $form['minimum_components'] = array( + '#type' => 'checkboxes', + '#title' => t('Minimum components overrides'), + '#default_value' => $settings['minimum_components'], + '#element_validate' => array('_name_field_minimal_component_requirements'), + '#options' => $components, + ); $form['component_css'] = array( '#type' => 'textfield', '#title' => t('Component separator CSS'), @@ -381,7 +420,18 @@ function _name_field_widget_form(&$form, &$form_state, $field, $instance, $langc _name_defaults($field['settings'], 'settings'); $fs = $field['settings']; $ws = $instance['settings']; + $ws += array( + 'components' => array(), + 'minimum_components' => array(), + ); + // Use populated overrides if present. + if (array_filter($ws['components'])) { + $fs['components'] = $ws['components']; + } + if (array_filter($ws['minimum_components'])) { + $fs['minimum_components'] = $ws['minimum_components']; + } $element += array( '#type' => 'name_element', '#title' => check_plain($instance['label']), @@ -405,7 +455,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 +591,4 @@ function _name_get_vocabulary_id_by_code_or_number($value) { $vid = $vocab->vid; } return $vid; -} \ No newline at end of file +} diff --git a/name.admin.inc b/name.admin.inc index 0d874bf98a4d40f2efcb13b2dcbcfdc960624fb6..2cffccb9aec4ae0975f39da5b2a97f9cd2bc29e6 100644 --- a/name.admin.inc +++ b/name.admin.inc @@ -555,6 +555,25 @@ function _name_field_instance_settings_pre_render($form) { '#suffix' => '', '#weight' => 4, ), + 'field_override_label' => array( + '#markup' => '' . t('Field setting overrides') . '', + '#weight' => 5, + ), + 'components' => array( + '#prefix' => '' . t('Components') . '5', + '#suffix' => '', + '#weight' => 6, + ), + 'minimum_components' => array( + '#prefix' => '' . t('Minimum components') . '6', + '#suffix' => '', + '#weight' => 7, + ), + 'labels' => array( + '#prefix' => '' . t('Labels') . '7', + '#suffix' => '', + '#weight' => 8, + ), ), 'tfoot' => array( '#markup' => '
    ' @@ -563,6 +582,9 @@ 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 Components used. Leave all unchecked to use the field settings.') . '
  8. ' + . '
  9. ' . t('Optional overrides for Minimum components used. Leave all unchecked to use the field settings.') . '
  10. ' + . '
  11. ' . t('Optional overrides for field labels.') . '
  12. ' . '
', '#weight' => 2, ), @@ -591,6 +613,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 +637,21 @@ 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; + + $form['styled_settings']['tbody']['components'][$key] = $form['instance_components'][$key]; + $form['styled_settings']['tbody']['components'][$key]['#prefix'] = ''; + $form['styled_settings']['tbody']['components'][$key]['#suffix'] = ''; + $form['styled_settings']['tbody']['components'][$key]['#weight'] = $i; + + $form['styled_settings']['tbody']['minimum_components'][$key] = $form['instance_minimum_components'][$key]; + $form['styled_settings']['tbody']['minimum_components'][$key]['#prefix'] = ''; + $form['styled_settings']['tbody']['minimum_components'][$key]['#suffix'] = ''; + $form['styled_settings']['tbody']['minimum_components'][$key]['#weight'] = $i; + // Clean up the leftovers. unset($form['instance_size'][$key]); $form['instance_size']['#access'] = FALSE; @@ -625,6 +665,14 @@ 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; + + unset($form['instance_components'][$key]); + $form['instance_components']['#access'] = FALSE; + + unset($form['instance_minimum_components'][$key]); + $form['instance_minimum_components']['#access'] = FALSE; } return $form; diff --git a/name.devel_generate.inc b/name.devel_generate.inc index 28286a6271ef18a94e7d10db687523dec2f33ebf..ad8dbe81c6992894078321385e74fe0cf33e9700 100644 --- a/name.devel_generate.inc +++ b/name.devel_generate.inc @@ -28,8 +28,13 @@ function _name_devel_generate($object, $field, $instance, $bundle) { $func = variable_get('name_devel_generate_names', '_name_devel_generate_name'); $names = $func($field); - - $components = array_filter($field['settings']['components']); + $instance['setting'] += array( + 'components' => array(), + ); + $components = array_filter($instance['setting']['components']); + if (!$components) { + $components = array_filter($field['settings']['components']); + } return array_intersect_key($names[array_rand($names)], $components); } diff --git a/name.module b/name.module index bb43e2a2c4d0bf32528c2153dd2e30d7c4b59797..7a14b98294095bebe205acd83c6502b4d53761cc 100644 --- a/name.module +++ b/name.module @@ -911,6 +911,10 @@ function name_field_info() { ), 'inline_css' => array_combine($keys, array_fill(0, $count, '')), 'title_display' => array_combine($keys, array_fill(0, $count, 'description')), + // Field instance overrides. + 'components' => array(), + 'minimum_components' => array(), + 'labels' => array_combine($keys, array_fill(0, $count, '')), // New settings to override the user name. Only applies to user entities. 'override_format' => 'default', // Prevents the default break between the name components and credentials @@ -977,9 +981,15 @@ function name_field_settings_form_validate($form, &$form_state) { */ function name_field_load($entity_type, $entities, $field, $instances, $langcode, &$items) { foreach ($entities as $id => $entity) { + // Use populated overrides if present. + $instances[$id]['settings'] += array('components' => array()); + $components = array_filter($instances[$id]['settings']['components']); + if (!$components) { + $components = $field['settings']['components']; + } foreach ($items[$id] as $delta => $item) { foreach (_name_translations() as $key => $title) { - if (empty($field['settings']['components'][$key])) { + if (empty($components[$key])) { unset($items[$id][$delta][$key]); } else { @@ -1011,13 +1021,16 @@ function name_field_is_empty($item, $field) { * component is not selected. */ function _name_field_minimal_component_requirements($element, &$form_state) { - $required_field_set = array_flip(array('given', 'family')); - $value = array_intersect_key($required_field_set, array_filter((array) $element['#value'])); - if (empty($value)) { - $required_fields = array_intersect_key(_name_translations(), $required_field_set); - form_set_error(implode('][', $element['#parents']) . '][given]', - t('!label must have one of the following components: %components', - array('!label' => $element['#title'], '%components' => implode(', ', $required_fields)))); + $values = array_filter((array) $element['#value']); + if ($values) { + $required_field_set = array_flip(array('given', 'family')); + $values = array_intersect_key($required_field_set, $values); + if (empty($values)) { + $required_fields = array_intersect_key(_name_translations(), $required_field_set); + form_set_error(implode('][', $element['#parents']) . '][given]', + t('!label must have one of the following components: %components', + array('!label' => $element['#title'], '%components' => implode(', ', $required_fields)))); + } } } diff --git a/tests/name.test b/tests/name.test index e78a47a93d74ae4ac30a06f4406047f8697668a6..0c2bd204386447a249a1aa6a3eb4eef952e4fab4 100644 --- a/tests/name.test +++ b/tests/name.test @@ -514,10 +514,12 @@ class Name_FieldTestCase extends NameTestHelper { t('!field options field is required.', array('!field' => $n['title'])), t('!field options field is required.', array('!field' => $n['generational'])), + // There is now empty tests on both of these fields, so the second + // message will not show if the required message is shown. t('!field field is required.', array('!field' => t('Components'))), - t('!field must have one of the following components: !components', array('!field' => t('Components'), '!components' => check_plain(implode(', ', array($n['given'], $n['family']))))), t('!field field is required.', array('!field' => t('Minimum components'))), - t('!field must have one of the following components: !components', array('!field' => t('Minimum components'), '!components' => check_plain(implode(', ', array($n['given'], $n['family']))))), + // t('!field must have one of the following components: !components', array('!field' => t('Components'), '!components' => check_plain(implode(', ', array($n['given'], $n['family']))))), + // t('!field must have one of the following components: !components', array('!field' => t('Minimum components'), '!components' => check_plain(implode(', ', array($n['given'], $n['family']))))), ); foreach ($required_messages as $message) { $this->assertText($message);