diff -burp addresses/addresses.module addresses_customize/addresses.module --- addresses/addresses.module 2010-01-29 15:49:32.000000000 -0500 +++ addresses_customize/addresses.module 2010-07-06 19:26:47.745685900 -0400 @@ -188,6 +188,7 @@ function addresses_elements() { * Array. Form fields */ function addresses_elements_process($element, $edit, $form_state, $form) { + $settings = empty($form['#field_info'][$element['#field_name']]) ? variable_get('addresses_user_settings', array()) : $form['#field_info'][$element['#field_name']]; $fields = $element['#fields']; $values = $element['#default_value']; @@ -217,12 +218,29 @@ function addresses_elements_process($ele // Include the main module file module_load_include('inc', 'addresses'); - // Get other fields from hook_addressesfieldsapi - $element = array_merge( - $element, - module_invoke_all('addressesfieldapi', 'form', $fields, $values) - ); + // Update the $fields array to reflect element visibility settings per the + // new global settings options. It would be cleaner to simply update the + // form generation function, but this method will be compatible with extra + // contrib fields. + foreach(array_keys($fields) as $ftype) { + if (!empty($settings[$ftype . '_select'])) { + $fields[$ftype] = $settings[$ftype . '_select']; + } + } + + // Invoke addressfieldapi to allow modules to add their own addresses fields. + // Then update these fields with the global settings for each field instance. + $extra = module_invoke_all('addressesfieldapi', 'form', $fields, $values); + foreach (element_children($extra) as $eName) { + $extra[$eName]['#title'] = t($settings[$eName . '_label']); + $extra[$eName]['#description'] = t($settings[$eName . '_desc']); + if ('textfield' == $extra[$eName]['#type']) { + $extra[$eName]['#size'] = $settings[$eName . '_size']; + } + } + // Add the extra fields to the element and return it. + $element = array_merge($element, $extra); return $element; } diff -burp addresses/addresses.settings.inc addresses_customize/addresses.settings.inc --- addresses/addresses.settings.inc 2010-02-09 18:18:40.000000000 -0500 +++ addresses_customize/addresses.settings.inc 2010-07-06 17:25:19.000000000 -0400 @@ -487,17 +487,38 @@ function _addresses_settings_fields($fie foreach ($ftypes as $ftype => $field) { // List of address fields - $form['addresses'][$ftype] = array( - '#default_value' => !isset($field_values[$ftype]) ? $field['display'] : $field_values[$ftype], + $form['addresses'][$ftype][$ftype . '_select'] = array( + '#type' => 'select', '#options' => array( - ADDRESSES_FIELD_NONE => '', - ADDRESSES_FIELD_SHOW => '', - ADDRESSES_FIELD_REQUIRED => '', - ADDRESSES_FIELD_HIDDEN => '', + ADDRESSES_FIELD_NONE => 'None', + ADDRESSES_FIELD_SHOW => 'Normal', + ADDRESSES_FIELD_REQUIRED => 'Required', + ADDRESSES_FIELD_HIDDEN => 'Hidden', ), - '#title' => $field['title'], - '#type' => 'radios', + '#default_value' => !isset($field_values[$ftype . '_select']) ? $field['display'] : $field_values[$ftype . '_select'], + ); + + // Add form elements to allow the customization of field element labels + // descriptions, and sizes. + $form['addresses'][$ftype][$ftype . '_label'] = array( + '#type' => 'textfield', + '#size' => 20, + '#maxlength' => 255, + '#default_value' => !isset($field_values[$ftype . '_label']) ? $field['title'] : $field_values[$ftype . '_label'], + ); + $form['addresses'][$ftype][$ftype . '_desc'] = array( + '#type' => 'textfield', + '#size' => 60, + '#maxlength' => 255, + '#default_value' => !isset($field_values[$ftype . '_desc']) ? $field['description'] : $field_values[$ftype . '_desc'], + ); + $form['addresses'][$ftype][$ftype . '_size'] = array( + '#type' => 'textfield', + '#size' => 2, + '#maxlength' => 3, + '#default_value' => !isset($field_values[$ftype . '_size']) ? $field['length'] : $field_values[$ftype . '_size'], ); + $form['addresses'][$ftype]['#title'] = $field['title']; } $form['addresses']['#theme'] = 'addresses_settings_fields'; @@ -593,18 +614,17 @@ function theme_addresses_elements($eleme */ function theme_addresses_settings_fields($form) { foreach (element_children($form) as $ftype) { - $field = $form[$ftype]; $rows[] = array( - $field['#title'], - drupal_render($field[0]), - drupal_render($field[1]), - drupal_render($field[2]), - drupal_render($field[3]), + $form[$ftype]['#title'], + drupal_render($form[$ftype][$ftype . '_select']), + drupal_render($form[$ftype][$ftype . '_size']), + drupal_render($form[$ftype][$ftype . '_label']), + drupal_render($form[$ftype][$ftype . '_desc']), ); unset($form[$ftype]); } - $header = array(t('Field'), t('None'), t('Normal'), t('Required'), t('Hidden')); + $header = array(t('Field'), t('Visibility'), t('Size'), t('Label'), t('Help text')); $output = theme('table', $header, $rows); $output .= drupal_render($form); diff -burp addresses/addresses_cck/addresses_cck.module addresses_customize/addresses_cck/addresses_cck.module --- addresses/addresses_cck/addresses_cck.module 2010-01-30 18:44:12.000000000 -0500 +++ addresses_customize/addresses_cck/addresses_cck.module 2010-07-02 12:50:19.000000000 -0400 @@ -142,9 +142,11 @@ function addresses_cck_field_settings($o // With the fields and their values correctly assigned, // its time to recover only the field name and its value // and save it - foreach (array_keys($form['addresses']) as $field) { + foreach (array_keys($form['addresses']) as $ftype) { + foreach(element_children($form['addresses'][$ftype]) as $field) { $fields[] = $field; } + } return $fields; case 'callbacks': @@ -191,7 +193,7 @@ function addresses_cck_field_settings($o */ function _addresses_cck_field_validate(&$form, &$form_state) { foreach (array_keys($form_state['values']['columns']) as $ftype) { - if ($form_state['values'][$ftype] == ADDRESSES_FIELD_REQUIRED) { + if ($form_state['values'][$ftype . '_select'] == ADDRESSES_FIELD_REQUIRED) { form_set_value($form['field']['required'], TRUE, $form_state); return; } diff -burp addresses/addresses_user/addresses_user.module addresses_customize/addresses_user/addresses_user.module --- addresses/addresses_user/addresses_user.module 2010-01-29 15:39:36.000000000 -0500 +++ addresses_customize/addresses_user/addresses_user.module 2010-07-06 19:35:40.273144700 -0400 @@ -30,7 +30,7 @@ function _addresses_user_access($account */ function addresses_user_form__addresses_settings_alter(&$form, &$form_state) { module_load_include('settings.inc', 'addresses'); - $form += _addresses_settings_fields(variable_get('addresses_user', array())); + $form += _addresses_settings_fields(variable_get('addresses_user_settings', array())); // Set the 'addresses' as a fieldset $form['addresses_user'] = array( @@ -65,6 +65,13 @@ function addresses_user_form__addresses_ '#tree' => FALSE, '#type' => 'checkbox', ); + + // Even though this form will be passed through to system_settings_form, we + // will still need a custom submit handler so that we can save the field settings + // in a compatible format. This is because the fieldset added here applies + // the #tree attribute to the rest of the form elements, which changes the shape + // of the data returned on submit. + $form['#submit'][] = '_addresses_user_settings_submit'; } /** @@ -144,6 +151,28 @@ function _addresses_user_form_submit($fo } /** + * Submit the settings + * + * @ingroup form + */ +function _addresses_user_settings_submit($form, &$form_state) { + $ftypes = $form_state['values']['addresses_user']; + $fields = array(); + $settings = array(); + + foreach($ftypes as $ftype => $elements) { + $fields[$ftype] = $elements[$ftype . '_select']; + foreach($elements as $name => $value) { + $settings[$name] = $value; + } + } + + variable_set('addresses_user', $fields); + variable_set('addresses_user_settings', $settings); + unset($form_state['addresses_user']); +} + +/** * Implementation of hook_menu(). */ function addresses_user_menu() {