You are here

function uc_store_process_address_field in Ubercart 7.3

Element process hook for address fields.

1 string reference to 'uc_store_process_address_field'
uc_store_element_info in uc_store/uc_store.module
Implements hook_element_info().

File

uc_store/uc_store.module, line 358
Contains global Ubercart functions and store administration functionality.

Code

function uc_store_process_address_field($element, $form_state) {
  $element['#tree'] = TRUE;
  $prefix = $element['#key_prefix'] ? $element['#key_prefix'] . '_' : '';
  $weight = uc_store_address_field_weights();
  if (isset($form_state['uc_address'])) {

    // Use submitted Ajax values.
    $value = $form_state['uc_address'];
  }
  elseif (is_array($element['#value']) || is_object($element['#value'])) {

    // Use provided default value.
    $value = (array) $element['#value'];
  }
  else {
    $value = array();
  }
  $countries = db_query("SELECT country_id, country_name FROM {uc_countries} WHERE version > :version", array(
    ':version' => 0,
  ))
    ->fetchAllKeyed();
  foreach ($countries as $country_id => $country_name) {
    $countries[$country_id] = t($country_name);
  }
  natcasesort($countries);

  // Force the selected country to a valid one, so the zone dropdown matches.
  if (isset($value[$prefix . 'country']) && !isset($countries[$value[$prefix . 'country']])) {
    $country_keys = array_keys($countries);
    $value[$prefix . 'country'] = $country_keys[0];
  }

  // Iterating on the UcAddress object excludes non-public properties, which
  // is exactly what we want to do.
  $address = new UcAddress();
  foreach ($address as $base_field => $field_value) {
    $field = $prefix . $base_field;
    if (!isset($value[$field])) {
      continue;
    }
    switch ($base_field) {
      case 'country':
        $subelement = array(
          '#type' => 'select',
          '#options' => $countries,
          '#ajax' => array(
            'callback' => 'uc_store_update_address_field_zones',
            'wrapper' => 'uc-store-address-' . str_replace('_', '-', $prefix) . 'zone-wrapper',
            'progress' => array(
              'type' => 'throbber',
            ),
          ),
          '#element_validate' => array(
            'uc_store_validate_address_field_country',
          ),
          '#key_prefix' => $element['#key_prefix'],
        );
        break;
      case 'zone':
        $subelement = array(
          '#prefix' => '<div id="uc-store-address-' . str_replace('_', '-', $prefix) . 'zone-wrapper">',
          '#suffix' => '</div>',
        );
        $zones = db_query("SELECT zone_id, zone_name FROM {uc_zones} WHERE zone_country_id = :country", array(
          ':country' => $value[$prefix . 'country'],
        ))
          ->fetchAllKeyed();
        if (!empty($zones)) {
          natcasesort($zones);
          $subelement += array(
            '#type' => 'select',
            '#options' => $zones,
            '#empty_value' => 0,
          );
        }
        else {
          $subelement += array(
            '#type' => 'hidden',
            '#value' => 0,
            '#required' => FALSE,
          );
        }
        break;
      case 'postal_code':
        $subelement = array(
          '#type' => 'textfield',
          '#size' => 10,
          '#maxlength' => 10,
        );
        break;
      case 'phone':
        $subelement = array(
          '#type' => 'textfield',
          '#size' => 16,
          '#maxlength' => 32,
        );
        break;
      default:
        $subelement = array(
          '#type' => 'textfield',
          '#size' => 32,
        );
    }

    // Copy JavaScript states from the parent element.
    if (isset($element['#states'])) {
      $subelement['#states'] = $element['#states'];
    }

    // Set common values for all address fields.
    $label = uc_get_field_name($base_field);
    $element[$field] = $subelement + array(
      '#title' => $label ? $label : '&nbsp;',
      '#default_value' => $value[$field],
      '#parents' => array_merge(array_slice($element['#parents'], 0, -1), array(
        $field,
      )),
      '#pre_render' => array(
        'uc_store_pre_render_address_field',
      ),
      '#access' => $element['#hidden'] ? FALSE : uc_address_field_enabled($base_field),
      '#required' => $element['#required'] ? uc_address_field_required($base_field) : FALSE,
      '#weight' => isset($weight[$base_field]) ? $weight[$base_field] : 0,
    );
  }
  return $element;
}