diff --git a/addressfield.info b/addressfield.info index af5d068..001e9af 100644 --- a/addressfield.info +++ b/addressfield.info @@ -6,6 +6,7 @@ package = Fields dependencies[] = ctools files[] = addressfield.migrate.inc +files[] = includes/processor_addressfield.inc files[] = views/addressfield_views_handler_field_administrative_area.inc files[] = views/addressfield_views_handler_field_country.inc files[] = views/addressfield_views_handler_filter_country.inc diff --git a/addressfield.module b/addressfield.module index 68b45d9..e825166 100644 --- a/addressfield.module +++ b/addressfield.module @@ -906,3 +906,17 @@ function _addressfield_country_options_list($field = NULL, $instance = NULL) { return $countries; } + +/** + * Implements hook_search_api_processor_info(). + */ +function addressfield_search_api_processor_info() { + $callbacks['search_api_addressfield'] = array( + 'name' => t('Address field'), + 'description' => t('This processor appends full text value of administrative_area (state) to its abbreviation ' . + '(i.e., "CA" => "CA California"). '), + 'class' => 'SearchApiAddressfield', + ); + + return $callbacks; +} diff --git a/includes/processor_addressfield.inc b/includes/processor_addressfield.inc new file mode 100644 index 0000000..dd82bbf --- /dev/null +++ b/includes/processor_addressfield.inc @@ -0,0 +1,93 @@ + "California"). + */ +class SearchApiAddressfield extends SearchApiAbstractProcessor { + + public function configurationForm() { + $form = parent::configurationForm(); + $form += array( + 'address_field' => array( + '#markup' => '

There are no configurations for Address field processor in its current version, + as it only replaces the abbreviation of administrative_area (state) for its full text + value (i.e., "CA" => "California").

+

Make sure that both fields are added to index (administrative_area and country).

', + ), + ); + unset($form['fields']); + + return $form; + } + + public function preprocessIndexItems(array &$items) { + + $reference_types = array('taxonomy_term_reference', + 'entityreference', + 'commerce_product_reference'); + + foreach ($items as &$item) { + foreach ($item as $name => &$field) { + // Don't preprocess the field with an empty value. + if (!empty($field['value'])) { + + $field_name = explode(":", $name); + $field_info = field_read_fields(array('field_name' => $field_name[0])); + // Only process fields of addressfield type. + if (!empty($field_info) && $field_info[$field_name[0]]['type'] == "addressfield") { + + // Process administrative_area (State) sub-field. + if (isset($field_name[1]) && $field_name[1] == "administrative_area") { + + // Get country code. + $country_code = reset(explode(" ", $item[$field_name[0] . ':country']['value'])); + module_load_include('inc', 'addressfield', 'addressfield.administrative_areas'); + $administrative_areas = addressfield_get_administrative_areas($country_code); + + if (!empty($administrative_areas)) { + // Append administrative_area full value to abbreviation. + $field['value'] = $administrative_areas[$field['value']]; + $this->processField($field['value'], $field['type']); + } + } + } + else if (!empty($field_info) && in_array($field_info[$field_name[0]]['type'], $reference_types)) { + + /* + * Reference to an entity type that could have an addressfield. + */ + $last_two = array(); + $last_two[] = array_pop($field_name); + $last_two[] = array_pop($field_name); + $field_name = array_reverse($last_two); + $field_info = field_read_fields(array('field_name' => $field_name[0])); + + if (isset($field_name[1]) && $field_name[1] == "administrative_area") { + // Get country code + $field_name_country = explode(":", $name); + array_pop($field_name_country); + array_push($field_name_country, 'country'); + $field_name_country = implode(':', $field_name_country); + + $country_code = reset(explode(" ", $item[$field_name_country]['value'])); + module_load_include('inc', 'addressfield', 'addressfield.administrative_areas'); + $administrative_areas = addressfield_get_administrative_areas($country_code); + + if (!empty($administrative_areas)) { + // Append administrative_area full value to abbreviation + $field['value'] = $administrative_areas[$field['value']]; + $this->processField($field['value'], $field['type']); + } + } + } + } + } + } + } +} \ No newline at end of file