View source
<?php
require_once 'location_taxonomize_af.inc';
function location_taxonomize_af_location_taxonomize_source() {
return array(
'location_taxonomize_af' => 'Address Field',
);
}
function location_taxonomize_af_location_taxonomize_initialize($settings) {
if ($settings['source'] == 'location_taxonomize_af') {
drupal_set_message(t("NOTE: In order to actually taxonomize data from Address Field fields, you must also edit the individual fields and enable the 'Taxonomize locations from this field' checkbox."), 'warning');
}
}
function location_taxonomize_af_field_widget_info_alter(&$info) {
$info['addressfield_standard']['settings'] += array(
'location_taxonomize' => 0,
);
}
function location_taxonomize_af_form_field_ui_field_edit_form_alter(&$form, $form_state, $form_id) {
if ($form['#field']['type'] != 'addressfield') {
return;
}
$settings = $form['#instance']['widget']['settings'];
$enable = array(
'#type' => 'checkbox',
'#title' => t('Taxonomize locations from this field using Location Taxonomize'),
'#default_value' => $settings['location_taxonomize'],
);
$form['instance']['widget']['settings']['location_taxonomize'] = $enable;
}
function location_taxonomize_af_field_widget_addressfield_standard_form_alter(&$element, &$form_state, $context) {
if (_location_taxonomize_get_source() != LT_AF_MODULE_ID) {
return;
}
if (!isset($context['form']['#node_edit_form'])) {
return;
}
$taxonomize = $context['instance']['widget']['settings']['location_taxonomize'];
if ($taxonomize) {
if (!in_array('location_taxonomize_af_process_address', $element['#process'])) {
$element['#process'][] = 'location_taxonomize_af_process_address';
}
}
}
function location_taxonomize_af_process_address($element, &$form_state, &$form) {
if (!in_array('location_taxonomize_af_element_submitted', $form['#submit'])) {
array_unshift($form['#submit'], 'location_taxonomize_af_element_submitted');
}
if (!isset($form_state['temporary']['addressfields']) || !in_array($element['#field_name'], $form_state['temporary']['addressfields'])) {
$form_state['temporary']['addressfields'][] = $element['#field_name'];
}
return $element;
}
function location_taxonomize_af_element_submitted($form, &$form_state) {
$lang = 'und';
$fields = $form_state['temporary']['addressfields'];
$items = array();
foreach ($fields as $field) {
$deltas = $form_state['values'][$field][$lang];
$actual_delta = 0;
foreach ($deltas as $delta) {
if (isset($form[$field][$lang][$actual_delta]['locality_block']['administrative_area']['#options'])) {
$options = $form[$field][$lang][$actual_delta]['locality_block']['administrative_area']['#options'];
$delta['administrative_area_name'] = $options[$delta['administrative_area']];
}
$delta['country_name'] = location_taxonomize_get_country_name($delta['country']);
$items[] = $delta;
$actual_delta++;
}
}
if (!empty($items)) {
location_taxonomize_taxonomize($items, $form, $form_state);
}
}
function location_taxonomize_af_bulk_taxonomize_op($form_state, &$context) {
if (!isset($context['sandbox']['progress'])) {
$field_refs = array();
$fields = field_info_fields();
foreach ($fields as $field => $data) {
if ($data['type'] != 'addressfield') {
unset($fields[$field]);
}
}
foreach ($fields as $field) {
foreach ($field['bundles'] as $entity => $bundles) {
foreach ($bundles as $bundle) {
$instance = field_info_instance($entity, $field['field_name'], $bundle);
if ($instance['widget']['settings']['location_taxonomize'] == 1) {
$field_refs[] = array(
$entity,
$bundle,
$field['field_name'],
);
}
}
}
}
$final = array();
$count = 0;
foreach ($field_refs as $field) {
$e_type = $field[0];
$bundle = $field[1];
$field_name = $field[2];
$replace = array(
':etype' => $e_type,
':bundle' => $bundle,
);
$table = 'field_data_' . $field_name;
$result = db_query("SELECT entity_id FROM {$table} WHERE entity_type = :etype AND bundle = :bundle ORDER BY entity_id ASC", $replace);
$result_array = $result
->fetchAllAssoc('entity_id');
foreach ($result_array as $e) {
if ($e_type == 'node') {
$id = $e->entity_id;
$final[$id][] = $field_name;
$count++;
}
}
}
$context['sandbox']['progress'] = 0;
$context['sandbox']['max'] = $count;
$context['sandbox']['current'] = 0;
$context['results']['added'] = 0;
$context['results']['processed'] = 0;
$context['sandbox']['fields'] = $final;
if ($count == 0) {
return;
}
}
$limit = 10;
$i = 0;
$saved = 0;
$taxonomize = array();
if (!empty($context['sandbox']['fields'])) {
foreach ($context['sandbox']['fields'] as $nid => $fields) {
$node = node_load($nid);
foreach ($fields as $field) {
$items = field_get_items('node', $node, $field);
foreach ($items as $address) {
$address['country_name'] = location_taxonomize_get_country_name($address['country']);
$taxonomize[$nid][] = $address;
}
$i++;
array_shift($context['sandbox']['fields'][$nid]);
if (empty($context['sandbox']['fields'][$nid])) {
unset($context['sandbox']['fields'][$nid]);
}
}
if ($i > $limit) {
break;
}
}
$results = location_taxonomize_taxonomize_bulk($taxonomize);
$saved = $results['saved'];
}
$added = $saved;
$context['results']['added'] += $added;
$context['sandbox']['progress'] += $i;
$context['message'] = t('Processing address');
$context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
$context['sandbox']['current'] = $context['sandbox']['progress'];
$context['results']['processed'] = $context['sandbox']['progress'];
}