You are here

weights.inc in Extra Fields Checkout Pane 6.2

These functions adds weight to the address fields, so it becomes possible to change the order of the address fields.

File

includes/weights.inc
View source
<?php

/**
 * @file
 * These functions adds weight to the address fields,
 * so it becomes possible to change the order of the address fields.
 */

// -------------------------------------------------------------------
// FORM ALTERS (address fields weight)
// -------------------------------------------------------------------
// --------------------------
// uc_store_address_fields
// --------------------------

/**
 * _uc_extra_fields_pane_weight_uc_store_address_fields_alter()
 * Adds option to order address fields by adding a weight field
 * @param array $form
 * @param array $form_state
 * @access private
 * @return void
 * @see uc_extra_fields_pane_weight_uc_store_address_fields_submit()
 * @see theme_uc_extra_fields_pane_weight_uc_store_address_fields()
 */
function _uc_extra_fields_pane_weight_uc_store_address_fields_alter(&$form, $form_state) {
  if (isset($form['uc_address_fields'])) {

    // We're dealing with an Ubercart version dated July 18, 2012 or later.
    // Some fields are structured differently.
    $uc_version_20120718 = TRUE;
    $form['uc_address_fields_weight']['#tree'] = TRUE;
  }
  else {
    $uc_version_20120718 = FALSE;
  }

  // Get weight settings.
  $weights = variable_get('uc_address_fields_weight', _uc_extra_fields_pane_getDefaultAddressFieldsWeights($form['fields']));

  // Merge weight settings with default weight settings in case extra fields were added.
  $weights = array_merge(_uc_extra_fields_pane_getDefaultAddressFieldsWeights($form['fields']), $weights);
  foreach ($weights as $fieldname => $weight) {
    if ($uc_version_20120718) {
      $form['uc_address_fields_weight'][$fieldname] = array(
        '#type' => 'weight',
        '#delta' => 30,
        '#default_value' => $weight,
        '#attributes' => array(
          'class' => 'uc-address-fields-table-ordering',
        ),
      );

      // Apply weight settings on fields.
      $form['fields'][$fieldname]['#weight'] = $weight;
    }
    elseif (isset($form['fields'][$fieldname])) {

      // Add weight fields.
      $form['fields'][$fieldname]['weight'] = array(
        '#type' => 'weight',
        '#delta' => 30,
        '#default_value' => $weight,
        '#attributes' => array(
          'class' => 'uc-address-fields-table-ordering',
        ),
      );

      // Apply weight settings on fields.
      $form['fields'][$fieldname]['#weight'] = $weight;

      // Add submit function in order to save the weight settings.
      $form['#submit'][] = 'uc_extra_fields_pane_weight_uc_store_address_fields_submit';
    }
  }
}

/**
 * uc_extra_fields_pane_weight_uc_store_address_fields_submit()
 * Saves the weight settings for the address fields
 * @param array $form
 * @param array $form_state
 * @return void
 * @see _uc_extra_fields_pane_weight_uc_store_address_fields_alter()
 */
function uc_extra_fields_pane_weight_uc_store_address_fields_submit($form, $form_state) {
  $weights = array();
  foreach ($form_state['values']['fields'] as $fieldname => $fieldsettings) {
    $weights[$fieldname] = $fieldsettings['weight'];
  }
  variable_set('uc_address_fields_weight', $weights);
}

// --------------------------
// uc_cart_checkout_form_alter
// --------------------------

/**
 * uc_extra_fields_pane_weight_uc_cart_checkout_form_alter().
 * Applies ordering to address fields following the 'uc_address_fields_weight'-settings.
 * @param array $form
 * @param array $form_state
 * @access private
 * @return void
 */
function uc_extra_fields_pane_weight_uc_cart_checkout_form_alter(&$form, $form_state) {

  // Apply weight for delivery fields (fieldnames are prefixed with 'delivery_')
  _uc_extra_fields_pane_applyWeights($form['panes']['delivery'], 'delivery_');

  // Apply weight for billing fields (fieldnames are prefixed with 'billing_')
  _uc_extra_fields_pane_applyWeights($form['panes']['billing'], 'billing_');
}

// -------------------------------------------------------------------
// HELPER FUNCTIONS
// Helper functions to apply weights to address fields
// -------------------------------------------------------------------

/**
 * _getDefaultAddressFieldsWeights()
 * Get the default weight settings for the address fields.
 *
 * These settings will be used as a default value for variable_get('uc_address_fields_weight').
 * Because the contents of this setting will be called on several places, a general function
 * is used to get the default settings.
 *
 * If the fields don't have the #weight-attribute then the default $iWeight
 * will be considered the weight of the field, this value will be
 * increased for each field.
 *
 * @param array $fields
 * @param string $prefix
 * 	On some forms the field names are prefixed, for example on the checkout forms
 *	where the fields names are prefixed with 'delivery_' and 'billing_'
 *	The settings are saved for the fields without the prefix, so we need to load
 *  the settings without the prefix.
 * @access private
 * @return array $aWeightFields
 */
function _uc_extra_fields_pane_getDefaultAddressFieldsWeights($fields, $prefix = '') {

  // Get all available fields for the weight
  $aWeightFields = array();
  $iWeight = -31;
  foreach (element_children($fields) as $fieldname) {
    $iWeight++;

    // Substract prefix from fieldname, we don't want the prefix
    // saved into the default weight settings
    $fixedfieldname = $fieldname;
    if (strlen($prefix)) {
      if (strpos($fieldname, $prefix) === 0) {
        $fixedfieldname = substr($fieldname, strlen($fieldname));
      }
    }
    if (isset($fields[$fieldname]['#weight'])) {
      $aWeightFields[$fixedfieldname] = $fields[$fieldname]['#weight'];
      $iWeight = $fields[$fieldname]['#weight'];
    }
    else {
      $aWeightFields[$fixedfieldname] = $iWeight;
    }
  }
  return $aWeightFields;
}

/**
 * _applyWeights()
 * Applies ordering to address fields following the 'uc_address_fields_weight'-settings.
 * This function is used by some form-alter functions of this module that alters address forms.
 * @param array $form_part
 * @param string $prefix
 *	On the checkout-form the address fields got prefixes: 'delivery_' & 'billing_'.
 * @access private
 * @return void
 */
function _uc_extra_fields_pane_applyWeights(&$form_part, $prefix = '') {

  // Get weight settings
  $weights = variable_get('uc_address_fields_weight', _uc_extra_fields_pane_getDefaultAddressFieldsWeights($form_part, $prefix));

  // Ubercart Addresses integration:
  // If a field 'address_select' exists, give this field the lowest weight, so that this field appears at first
  if (isset($form_part[$prefix . 'address_select'])) {
    $iLowestWeight = min($weights);
    $weights['address_select'] = $iLowestWeight - 1;
  }

  // Apply weight to fields
  foreach ($weights as $fieldname => $weight) {
    if (isset($form_part[$prefix . $fieldname])) {
      $form_part[$prefix . $fieldname]['#weight'] = $weight;
    }

    // Fieldtype can be a constant. In that case an extra field typed '#item' can be shown.
    if (isset($form_part[$prefix . $fieldname . '_i'])) {
      $form_part[$prefix . $fieldname . '_i']['#weight'] = $weight;
    }
  }
}

Functions

Namesort descending Description
uc_extra_fields_pane_weight_uc_cart_checkout_form_alter uc_extra_fields_pane_weight_uc_cart_checkout_form_alter(). Applies ordering to address fields following the 'uc_address_fields_weight'-settings.
uc_extra_fields_pane_weight_uc_store_address_fields_submit uc_extra_fields_pane_weight_uc_store_address_fields_submit() Saves the weight settings for the address fields
_uc_extra_fields_pane_applyWeights _applyWeights() Applies ordering to address fields following the 'uc_address_fields_weight'-settings. This function is used by some form-alter functions of this module that alters address forms.
_uc_extra_fields_pane_getDefaultAddressFieldsWeights _getDefaultAddressFieldsWeights() Get the default weight settings for the address fields.
_uc_extra_fields_pane_weight_uc_store_address_fields_alter _uc_extra_fields_pane_weight_uc_store_address_fields_alter() Adds option to order address fields by adding a weight field