addressfields.inc in Extra Fields Checkout Pane 6.2
These functions adds extra address fields to forms
File
includes/addressfields.incView source
<?php
/**
* @file
* These functions adds extra address fields to forms
*/
// -------------------------------------------------------------------
// FORM ALTERS (extra address fields)
// -------------------------------------------------------------------
// --------------------------
// uc_store_address_fields
// --------------------------
/**
* _uc_extra_fields_pane_address_fields_uc_store_address_fields_alter()
* Adds extra address fields to form
* which can be defined at /admin/store/settings/addressfields/add
* @param array $form
* @param array $form_state
* @access private
* @see _uc_extra_fields_pane_address_fields_uc_store_address_fields_submit()
*/
function _uc_extra_fields_pane_address_fields_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;
}
else {
$uc_version_20120718 = FALSE;
}
try {
$fields = UCXF_FieldList::getFieldsFromPane(array(
'extra_delivery',
'extra_billing',
));
// Similar to uc_store_address_fields_form() from uc_store.module
foreach ($fields as $fieldname => $field) {
if ($uc_version_20120718) {
// The "enabled" setting is inside "$form['uc_address_fields']'.
$form['fields'][$fieldname]['#summary callback'] = 'summarize_form';
$form['uc_address_fields'][$fieldname] = array(
'#type' => 'checkbox',
'#summary callback' => 'summarize_checkbox',
'#summary arguments' => array(
t('@field is enabled.', array(
'@field' => $field->label,
)),
t('@field is disabled.', array(
'@field' => $field->label,
)),
),
'#default_value' => $field->enabled ? TRUE : FALSE,
);
// The "required" setting is inside "$form['uc_address_fields_required']'.
$form['uc_address_fields_required'][$fieldname] = array(
'#type' => 'checkbox',
'#default_value' => $field->required ? TRUE : FALSE,
);
// Title field.
$form['fields'][$fieldname]['uc_field_' . $fieldname] = array(
'#value' => $field
->output('label'),
);
}
else {
// This is valid when using Ubercart 6.x-2.3 through Ubercart 6.x-2.9.
$form['fields'][$fieldname]['#summary callback'] = 'summarize_form';
$form['fields'][$fieldname]['enabled'] = array(
'#type' => 'checkbox',
'#summary callback' => 'summarize_checkbox',
'#summary arguments' => array(
t('@field is enabled.', array(
'@field' => $field->label,
)),
t('@field is disabled.', array(
'@field' => $field->label,
)),
),
'#default_value' => $field->enabled ? TRUE : FALSE,
);
$form['fields'][$fieldname]['required'] = array(
'#type' => 'checkbox',
'#default_value' => $field->required ? TRUE : FALSE,
);
$form['fields'][$fieldname]['title'] = array(
'#value' => $field
->output('label'),
);
// Add id of field.
$form['fields'][$fieldname]['field_id'] = array(
'#type' => 'value',
'#value' => $field->field_id,
);
}
// Add field machine name.
$form['fields'][$fieldname]['default'] = array(
'#value' => $field->db_name,
);
// Add action links.
$links = array();
if (uc_extra_fields_pane_access($field, 'edit')) {
$links['edit'] = l(t('edit'), 'admin/store/settings/addressfields/' . $field->field_id . '/edit');
}
if (uc_extra_fields_pane_access($field, 'delete')) {
$links['delete'] = l(t('delete'), 'admin/store/settings/addressfields/' . $field->field_id . '/delete');
}
if (count($links) > 0) {
$form['fields'][$fieldname]['action'] = array(
'#value' => implode(' | ', $links),
);
}
}
// Add link to add an address field.
// This field will be shown above the table as is usual in
// the 7.x-1.x version of Extra Fields Pane.
$form['add_field'] = array(
'#type' => 'markup',
'#value' => l('+ ' . t('Add an address field'), 'admin/store/settings/addressfields/add', array(
'attributes' => array(
'class' => 'ucxf-add-field-link ucxf-add-field-link-1',
),
)) . '<br /><br />',
);
// Add a second link to add an address field.
// This field will be shown below the table as was usual in
// 6.x-2.0-beta2 and older versions of Extra Fields Pane.
$form['add_field2'] = array(
'#type' => 'markup',
'#value' => l('+ ' . t('Add an address field'), 'admin/store/settings/addressfields/add', array(
'attributes' => array(
'class' => 'ucxf-add-field-link ucxf-add-field-link-2',
),
)) . '<br /><br />',
);
// Add submit function so 'enabled' and 'required' can be saved
$form['#submit'][] = 'uc_extra_fields_pane_address_fields_uc_store_address_fields_submit';
} catch (UCXF_Exception $e) {
$e
->printMessage();
$e
->logError();
}
}
/**
* uc_extra_fields_pane_address_fields_uc_store_address_fields_submit()
* Saves 'enabled' and 'required' for address fields
* @param array $form
* @param array $form_state
* @see _uc_extra_fields_pane_address_fields_uc_store_address_fields_alter()
*/
function uc_extra_fields_pane_address_fields_uc_store_address_fields_submit($form, $form_state) {
try {
$address_fields = UCXF_FieldList::getFieldsFromPane(array(
'extra_delivery',
'extra_billing',
));
if (isset($form_state['values']['fields'])) {
$fields = $form_state['values']['fields'];
}
foreach ($address_fields as $fieldname => $field) {
if (isset($form['uc_address_fields'])) {
// We're dealing with an Ubercart version dated July 18, 2012 or later.
// Some fields are structured differently.
$field->enabled = empty($form_state['values']['uc_address_fields'][$fieldname]) ? FALSE : TRUE;
$field->required = empty($form_state['values']['uc_address_fields_required'][$fieldname]) ? FALSE : TRUE;
$field->weight = $form_state['values']['uc_address_fields_weight'][$fieldname];
}
else {
$field->enabled = empty($fields[$fieldname]['enabled']) ? FALSE : TRUE;
$field->required = empty($fields[$fieldname]['required']) ? FALSE : TRUE;
$field->weight = $fields[$fieldname]['weight'];
}
$field
->save();
}
} catch (UCXF_Exception $e) {
$e
->printMessage();
$e
->logError();
}
}
// --------------------------
// uc_cart_checkout_form
// --------------------------
/**
* Fixes drop down 'saved addresses' and prefills extra address fields when UC Addresses is enabled.
* @param array $form
* @param array $form_state
* @access private
* @see uc_extra_fields_pane_form_uc_cart_checkout_form_alter()
*/
function uc_extra_fields_pane_address_fields_uc_cart_checkout_form_alter(&$form, $form_state) {
if (uc_addresses_version() === 2) {
return;
}
global $user;
try {
// Check if there are extra address fields
$fields = UCXF_FieldList::getFieldsFromPane(array(
'extra_delivery',
'extra_billing',
));
if (count($fields) < 1) {
// No address fields. No need to alter form
return;
}
// Include file with code to get addresses
module_load_include('inc', 'uc_extra_fields_pane', 'includes/address_select');
// --------------------------
// Alter address selection of delivery and billing pane
// --------------------------
$types = array(
'delivery',
'billing',
);
foreach ($types as $type) {
if (isset($form['panes'][$type][$type . '_address_select'])) {
$default_address = NULL;
$addresses = uc_extra_fields_pane_get_addresses($user->uid, $type);
$options = array(
'0' => t('Select one...'),
);
foreach ($addresses as $key => $address) {
if (isset($address->address_name) && $address->address_name) {
// Use address name as label for the option if available
$option = $address->address_name;
}
elseif (uc_addresses_version() === 1) {
// Format option label following uc_addresses 6.x-1.x logics
$option = preg_replace('/<.*?>/', ', ', uc_address_format($address->first_name, $address->last_name, $address->company, $address->street1, $address->street2, $address->city, $address->zone, $address->postal_code, $address->country));
// MegaChriz: the next lines are useful when using the (unfinished) address display feature,
// see also http://drupal.org/node/904050
if (module_exists('ucxfdev_addressdisplay') && function_exists('ucxfdev_addressdisplay_format_address')) {
$option = ucxfdev_addressdisplay_format_address($address, '', $option);
}
}
else {
// Format option label following uc_store logics
$option = $address->street1;
// Check if the address is a duplicate (i.e. same address, but sent to different person)
if (isset($addresses[$key - 1]) && $option == $addresses[$key - 1]->street1 || isset($addresses[$key + 1]) && $option == $addresses[$key + 1]->street1) {
$option .= ' - ' . $address->first_name . ' ' . $address->last_name;
}
}
$addresskey = drupal_to_js($address);
$options[$addresskey] = check_plain($option);
if (uc_addresses_version() === 1 && $address->is_default) {
// If this address is the default, hold the key so the default value
// for the address selection field can be set later.
$default_address = $addresskey;
}
}
// Apply options
$form['panes'][$type][$type . '_address_select']['#options'] = $options;
$form['panes'][$type][$type . '_address_select']['#attributes']['onchange'] .= "ucxf_apply_address('" . $type . "', this.value);";
// Apply default value for select field if there is a default address
// and if the default address may be filled in automatically.
if ($default_address && variable_get('uc_addresses_default_' . $type . '_address', TRUE)) {
$form['panes'][$type][$type . '_address_select']['#default_value'] = $default_address;
}
// Additions to copy address behaviour (because else values of checkboxes won't be copied)
if (isset($form['panes'][$type]['copy_address'])) {
$source_pane = $type == 'delivery' ? 'billing' : 'delivery';
$target_pane = $type;
$form['panes'][$type]['copy_address']['#attributes']['onclick'] .= "ucxf_copy_address(this.checked, '{$source_pane}' , '{$target_pane}');";
}
}
}
// Add JS function so that data from extra address fields can be applied.
$fields = UCXF_FieldList::getAllAddressFields();
$script = "\n function ucxf_apply_address(type, address_str) {\n if (address_str == '0') {\n return;\n }\n eval('var address = ' + address_str + ';');\n var temp = type + '-' + type;\n ";
foreach ($fields as $fieldname => $field) {
if ($field->value_type == UCXF_Field::UCXF_WIDGET_TYPE_CHECKBOX) {
$set_function = ".attr('checked', address." . $fieldname . " == 1 ? true : false)";
}
else {
$set_function = ".val(address." . $fieldname . ")";
}
$script .= "\$('#edit-panes-' + temp + '-" . form_clean_id($fieldname) . "')" . $set_function . ".trigger('change');\n";
}
$script .= '}';
drupal_add_js($script, 'inline');
// Add JS function for copying over checkbox fields
drupal_add_js(drupal_get_path('module', 'uc_extra_fields_pane') . '/uc_extra_fields_pane.js');
// --------------------------
// Fill in defaults for extra address fields when UC Addresses 6.x-1.x is enabled
// and when at least one of the following settings are true:
// - 'uc_addresses_default_delivery_address'
// - 'uc_addresses_default_billing_address'
// --------------------------
if (uc_addresses_version() === 1 && (variable_get('uc_addresses_default_delivery_address', TRUE) || variable_get('uc_addresses_default_billing_address', TRUE))) {
// Load default UC Addresses address if available
$default_address = NULL;
$addresses = _uc_addresses_db_get_address($user->uid);
if (is_array($addresses) && count($addresses) > 0) {
foreach ($addresses as $address) {
if ($address->is_default) {
$default_address = $address;
}
}
if ($default_address) {
// Load values of extra address fields for this address
$values = uc_extra_fields_pane_value_list_load($default_address->aid, UCXF_VALUE_ADDRESS);
foreach ($values as $oValue) {
$fieldname = $oValue->db_name;
$value = $oValue->value;
// Apply default value for both delivery and billing address,
// but only if the default value is not already set.
if (!isset($form['panes']['delivery']['delivery_' . $fieldname]['#default_value']) && isset($form['panes']['delivery']['delivery_' . $fieldname]) && variable_get('uc_addresses_default_delivery_address', TRUE)) {
$form['panes']['delivery']['delivery_' . $fieldname]['#default_value'] = $value;
}
if (!isset($form['panes']['billing']['billing_' . $fieldname]['#default_value']) && isset($form['panes']['billing']['billing_' . $fieldname]) && variable_get('uc_addresses_default_billing_address', TRUE)) {
$form['panes']['billing']['billing_' . $fieldname]['#default_value'] = $value;
}
}
}
}
}
} catch (UCXF_Exception $e) {
$e
->printMessage();
$e
->logError();
}
}
// --------------------------
// UC Addresses integration: uc_addresses_get_address_form
// --------------------------
/**
* uc_extra_fields_pane_addressfields_uc_addresses_get_address_form_alter()
* @param array $form
* @param array $form_state
* @return void
* @see uc_extra_fields_pane_addressfields_uc_addresses_get_address_form_submit()
*/
function uc_extra_fields_pane_addressfields_uc_addresses_get_address_form_alter(&$form, $form_state) {
$fields = UCXF_FieldList::getFieldsFromPane(array(
'extra_delivery',
'extra_billing',
));
foreach ($fields as $fieldname => $field) {
// Generate field
$generated_field = $field
->generate();
// Set default value
$oValue = uc_extra_fields_pane_value_load($form['panes']['address']['aid']['#value'], UCXF_VALUE_ADDRESS, $field->field_id);
$generated_field['#default_value'] = $oValue->value;
// Add field to pane
$form['panes']['address'][$fieldname] = $generated_field;
}
// Add submit function
$form['#submit'][] = 'uc_extra_fields_pane_addressfields_uc_addresses_get_address_form_submit';
}
/**
* uc_extra_fields_pane_addressfields_uc_addresses_get_address_form_submit()
* @param array $form
* @param array $form_state
* @see uc_extra_fields_pane_addressfields_uc_addresses_get_address_form_alter()
*/
function uc_extra_fields_pane_addressfields_uc_addresses_get_address_form_submit($form, $form_state) {
$address = $form_state['values']['panes']['address'];
// Load field definitions
$fields = UCXF_FieldList::getFieldsFromPane(array(
'extra_delivery',
'extra_billing',
));
// MegaChriz:
// address id is not available when address is added, only when it is edited,
// we need to wait until uc_addresses is improved on this part.
// see: drupal.org/node/851658
// with the patch applied in #4, $form_state['storage']['aid'] will contain the address id.
// Get address id
// WARNING: $form_state['storage']['aid'] will never contain anything with current version of uc_addresses (v1.0)
$address_id = $address['aid'] ? $address['aid'] : $form_state['storage']['aid'];
// Save values
if ($address_id) {
foreach ($fields as $fieldname => $field) {
uc_extra_fields_pane_value_save(array(
'element_id' => $address_id,
'element_type' => UCXF_VALUE_ADDRESS,
'field_id' => $field->field_id,
'value' => $address[$fieldname],
));
}
}
}
// --------------------------
// UC Addresses integration: user_register
// --------------------------
/**
* uc_extra_fields_pane_addressfields_user_register_form_alter
* @param array $form
* @param array $form_state
* @return void
* @see uc_extra_fields_pane_user()
*/
function uc_extra_fields_pane_addressfields_user_register_form_alter(&$form, $form_state) {
$fields = UCXF_FieldList::getFieldsFromPane(array(
'extra_delivery',
'extra_billing',
));
foreach ($fields as $fieldname => $field) {
$form[0][$fieldname] = $field
->generate();
}
}