123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- <?php
- /**
- * @file
- * The default format for adresses.
- */
- $plugin = array(
- 'title' => t('Address form (country-specific)'),
- 'format callback' => 'addressfield_format_address_generate',
- 'type' => 'address',
- 'weight' => -100,
- );
- /**
- * Format callback.
- *
- * @see CALLBACK_addressfield_format_callback()
- */
- function addressfield_format_address_generate(&$format, $address, $context = array()) {
- // Load the predefined address format for the selected country.
- module_load_include('inc', 'addressfield', 'addressfield.address_formats');
- $address_format = addressfield_get_address_format($address['country']);
- // Used to move certain fields to their own row.
- $clearfix = '<div class="clearfix"></div>';
- // The street block.
- $format['street_block'] = array(
- '#type' => 'addressfield_container',
- '#attributes' => array(
- 'class' => array('street-block'),
- ),
- '#weight' => 0,
- );
- $format['street_block']['thoroughfare'] = array(
- '#title' => t('Address 1'),
- '#tag' => 'div',
- '#attributes' => array(
- 'class' => array('thoroughfare'),
- 'autocomplete' => 'address-line1',
- ),
- '#size' => 30,
- '#maxlength' => 255,
- '#required' => TRUE,
- );
- $format['street_block']['premise'] = array(
- '#title' => t('Address 2'),
- '#tag' => 'div',
- '#attributes' => array(
- 'class' => array('premise'),
- 'autocomplete' => 'address-line2',
- ),
- '#size' => 30,
- '#maxlength' => 255,
- );
- $format['locality_block'] = array(
- '#type' => 'addressfield_container',
- '#attributes' => array(
- 'class' => array('addressfield-container-inline', 'locality-block', 'country-' . $address['country']),
- ),
- '#weight' => 50,
- '#maxlength' => 255,
- );
- $format['locality_block']['#attached']['css'][] = drupal_get_path('module', 'addressfield') . '/addressfield.css';
- $format['locality_block']['postal_code'] = array(
- '#title' => $address_format['postal_code_label'],
- '#required' => in_array('postal_code', $address_format['required_fields']),
- '#access' => in_array('postal_code', $address_format['used_fields']),
- '#size' => 10,
- '#maxlength' => 255,
- '#attributes' => array(
- 'class' => array('postal-code'),
- 'autocomplete' => 'postal-code',
- ),
- );
- $format['locality_block']['dependent_locality'] = array(
- '#title' => $address_format['dependent_locality_label'],
- '#required' => in_array('dependent_locality', $address_format['required_fields']),
- '#access' => in_array('dependent_locality', $address_format['used_fields']),
- '#size' => 25,
- '#maxlength' => 255,
- '#tag' => 'div',
- '#attributes' => array(
- 'class' => array('dependent-locality'),
- 'autocomplete' => '"address-level3',
- ),
- // Most formats place this field in its own row.
- '#suffix' => $clearfix,
- );
- $format['locality_block']['locality'] = array(
- '#title' => $address_format['locality_label'],
- '#required' => in_array('locality', $address_format['required_fields']),
- '#access' => in_array('locality', $address_format['used_fields']),
- '#size' => 30,
- '#maxlength' => 255,
- '#prefix' => ' ',
- '#attributes' => array(
- 'class' => array('locality'),
- 'autocomplete' => '"address-level2',
- ),
- );
- $format['locality_block']['administrative_area'] = array(
- '#title' => $address_format['administrative_area_label'],
- '#required' => in_array('administrative_area', $address_format['required_fields']),
- '#access' => in_array('administrative_area', $address_format['used_fields']),
- '#empty_value' => '',
- '#size' => 10,
- '#maxlength' => 255,
- '#prefix' => ' ',
- '#render_option_value' => $address_format['render_administrative_area_value'],
- '#attributes' => array(
- 'class' => array('state'),
- 'autocomplete' => 'address-level1',
- ),
- );
- $format['country'] = array(
- '#title' => t('Country'),
- '#options' => _addressfield_country_options_list(),
- '#render_option_value' => TRUE,
- '#required' => TRUE,
- '#attributes' => array(
- 'class' => array('country'),
- 'autocomplete' => 'country',
- ),
- '#weight' => 100,
- );
- if (empty($format['locality_block']['postal_code']['#access'])) {
- // Remove the prefix from the first widget of the block.
- $element_children = element_children($format['locality_block']);
- $first_child = reset($element_children);
- unset($format['locality_block'][$first_child]['#prefix']);
- }
- if (!empty($format['locality_block']['administrative_area']['#access'])) {
- // Set the predefined administrative areas, if found.
- module_load_include('inc', 'addressfield', 'addressfield.administrative_areas');
- $administrative_areas = addressfield_get_administrative_areas($address['country']);
- $format['locality_block']['administrative_area']['#options'] = $administrative_areas;
- }
- // Country-specific customizations.
- if (in_array($address['country'], array('AU', 'EE', 'LT', 'LV', 'NZ', 'RU'))) {
- // These countries don't use the "Address 2" line.
- // Leave it as a precaution, but hide the label to avoid confusing users.
- $format['street_block']['thoroughfare']['#title'] = t('Address');
- $format['street_block']['premise']['#title_display'] = 'invisible';
- }
- elseif ($address['country'] == 'US') {
- if ($context['mode'] == 'render') {
- $format['locality_block']['locality']['#suffix'] = ',';
- }
- }
- elseif ($address['country'] == 'BR') {
- $format['locality_block']['dependent_locality']['#suffix'] = $clearfix;
- $format['locality_block']['dependent_locality']['#tag'] = 'div';
- $format['locality_block']['administrative_area']['#suffix'] = $clearfix;
- $format['locality_block']['postal_code']['#tag'] = 'div';
- // Change some titles to make translation easier.
- $format['street_block']['#attributes'] = array(
- 'class' => array('addressfield-container-inline'),
- );
- $format['street_block']['thoroughfare']['#title'] = t('Thoroughfare');
- $format['street_block']['thoroughfare']['#tag'] = NULL;
- $format['street_block']['premise'] = array(
- '#title' => t('Complement'),
- '#tag' => NULL,
- '#attributes' => array('class' => array('premise')),
- '#size' => 20,
- '#maxlength' => 255,
- '#prefix' => ', ',
- );
- $format['locality_block']['locality']['#suffix'] = ' - ';
- // Hide suffixes and prefixes while in form.
- if ($context['mode'] == 'form') {
- $format['street_block']['premise']['#prefix'] = NULL;
- $format['street_block']['premise']['#suffix'] = NULL;
- $format['locality_block']['locality']['#suffix'] = NULL;
- }
- }
- elseif ($address['country'] == 'CN') {
- $format['locality_block']['locality']['#suffix'] = $clearfix;
- }
- elseif ($address['country'] == 'CA') {
- if ($context['mode'] == 'render') {
- $format['locality_block']['locality']['#suffix'] = ',';
- }
- }
- elseif ($address['country'] == 'GB') {
- $format['locality_block']['administrative_area']['#size'] = '30';
- }
- elseif ($address['country'] == 'ID') {
- $format['locality_block']['administrative_area']['#weight'] = 1;
- }
- elseif ($address['country'] == 'JP') {
- $format['locality_block']['#weight'] = 10;
- $format['locality_block']['postal_code']['#weight'] = 10;
- $format['locality_block']['postal_code']['#tag'] = 'div';
- $format['locality_block']['postal_code']['#size'] = 30;
- $format['locality_block']['administrative_area']['#weight'] = 20;
- $format['locality_block']['administrative_area']['#size'] = 30;
- $format['locality_block']['locality']['#weight'] = 30;
- $format['street_block']['#weight'] = 20;
- }
- elseif ($address['country'] == 'PE') {
- $format['locality_block']['administrative_area']['#weight'] = 1;
- $format['locality_block']['locality']['#weight'] = 2;
- }
- elseif ($address['country'] == 'PH' || $address['country'] == 'TH') {
- $format['locality_block']['dependent_locality']['#suffix'] = '';
- $format['locality_block']['locality']['#suffix'] = $clearfix;
- }
- // These countries show every field in its own row.
- $countries_field_per_row = array(
- 'AM', 'EG', 'FK', 'GB', 'GG', 'GS', 'HK', 'HU', 'IE', 'IM', 'IO', 'JE', 'JM',
- 'JP', 'KE', 'KR', 'KZ', 'LK', 'PA', 'PN', 'RU', 'SC', 'SH', 'SZ', 'TC', 'UA',
- 'VG', 'ZA',
- );
- if (in_array($address['country'], $countries_field_per_row)) {
- $format['locality_block']['#attributes']['class'][0] = 'addressfield-container';
- $format['locality_block']['postal_code']['#prefix'] = '';
- $format['locality_block']['postal_code']['#tag'] = 'div';
- $format['locality_block']['locality']['#prefix'] = '';
- $format['locality_block']['locality']['#tag'] = 'div';
- $format['locality_block']['administrative_area']['#prefix'] = '';
- $format['locality_block']['administrative_area']['#tag'] = 'div';
- }
- // These countries tend to put the postal code after the locality.
- $countries_postal_code_after_locality = array(
- 'AS', 'AU', 'BD', 'BF', 'BH', 'BM', 'BN', 'BR', 'BT', 'CA', 'CC', 'CN', 'CX',
- 'EG', 'FK', 'FM', 'GB', 'GG', 'GS', 'GU', 'HN', 'HU', 'ID', 'IL', 'IM', 'IN',
- 'IO', 'IQ', 'IR', 'JE', 'JO', 'JP', 'KE', 'KH', 'KR', 'LB', 'LK', 'LS', 'LV',
- 'MH', 'MM', 'MN', 'MP', 'MT', 'MV', 'MX', 'MY', 'NF', 'NG', 'NP', 'NZ', 'PG',
- 'PH', 'PK', 'PN', 'PR', 'PW', 'RU', 'SA', 'SH', 'SO', 'SZ', 'TC', 'TH', 'TW',
- 'UA', 'UM', 'US', 'VE', 'VI', 'VG', 'VN', 'ZA',
- );
- if (in_array($address['country'], $countries_postal_code_after_locality)) {
- // Take the widget out of the array.
- $postal_code_widget = $format['locality_block']['postal_code'];
- $postal_code_widget['#prefix'] = ' ';
- unset($format['locality_block']['postal_code']);
- // Add it back.
- $format['locality_block']['postal_code'] = $postal_code_widget;
- // Remove the prefix from the first widget of the block.
- $element_children = element_children($format['locality_block']);
- $first_child = reset($element_children);
- unset($format['locality_block'][$first_child]['#prefix']);
- }
- if ($context['mode'] == 'form') {
- // Provide a wrapper ID for AJAX replacement based on country selection.
- if (!isset($format['#wrapper_id'])) {
- $format['#wrapper_id'] = drupal_html_id('addressfield-wrapper');
- $format['#prefix'] = '<div id="' . $format['#wrapper_id'] . '">';
- $format['#suffix'] = '</div>';
- }
- // AJAX enable it.
- $format['country']['#ajax'] = array(
- 'callback' => 'addressfield_standard_widget_refresh',
- 'wrapper' => $format['#wrapper_id'],
- );
- $format['country']['#element_validate'] = array('addressfield_standard_country_validate');
- // Don't validate any element when the country is changed.
- $format['country']['#limit_validation_errors'] = array();
- // Move the country selector to the top of the form.
- $format['country']['#weight'] = -500;
- // Limit it to the countries supported by the widget.
- if (isset($context['field'])) {
- $format['country']['#options'] = _addressfield_country_options_list($context['field'], $context['instance']);
- }
- // The whole field is considered empty if the country column is empty.
- // Therefore, if the field is optional, allow the country to be optional.
- // The same logic applies if the field allows multiple values, in which case
- // only the first delta needs to have a value.
- if (empty($context['instance']['required']) || (isset($context['delta']) && $context['delta'] > 0)) {
- $format['country']['#required'] = FALSE;
- $format['country']['#empty_value'] = '';
- // Hide all other fields until the country is selected.
- if (empty($address['country'])) {
- $format['street_block']['#access'] = FALSE;
- $format['locality_block']['#access'] = FALSE;
- }
- }
- }
- }
|