You are here

function geocoder_field_widget_get_field_value in Geocoder 7.2

Get a field's value based on geocoded data.

@para field_instance Field instance definition array

Parameters

$entity_type: Type of entity

$entity: Optionally, the entity. You must pass either the entity or $source_field_values

$source_field_values: Array of deltas / source field values. You must pass either this or $entity.

Return value

Three possibilities could be returned by this function:

  • FALSE: do nothing.
  • An empty array: use it to unset the existing field value.
  • A populated array: assign a new field value.
1 call to geocoder_field_widget_get_field_value()
geocoder_field_field_attach_presave in modules/geocoder_field/geocoder_field.module
Implements hook_field_attach_presave().

File

modules/geocoder_field/geocoder_field.module, line 319

Code

function geocoder_field_widget_get_field_value($entity_type, $field_instance, $entity = NULL, $source_field_values = NULL) {
  if (!$source_field_values && !$entity) {
    trigger_error('geocoder_field_widget_get_field_value: You must pass either $source_field_values OR $entity', E_USER_ERROR);
    return FALSE;
  }

  // Required settings
  if (isset($field_instance['widget']['settings']['geocoder_handlers']) && isset($field_instance['widget']['settings']['geocoder_field'])) {
    $geocoder_handlers = array_filter($field_instance['widget']['settings']['geocoder_handlers'], function ($v) {
      return (bool) $v['enabled'];
    });
    uasort($geocoder_handlers, function ($a, $b) {
      if ($a['enabled'] > $b['enabled']) {
        return -1;
      }
      elseif ($a['enabled'] < $b['enabled']) {
        return 1;
      }
      if ($a['weight'] < $b['weight']) {
        return -1;
      }
      elseif ($a['weight'] > $b['weight']) {
        return 1;
      }
      return 0;
    });
    $geocoder_handlers = array_keys($geocoder_handlers);
    $target_info = field_info_field($field_instance['field_name']);
    $field_info = geocoder_field_widget_get_field_info($entity_type, $field_instance, $entity);

    // Get the source values
    if (!$source_field_values) {
      $source_field_values = geocoder_field_widget_get_entity_field_value($entity_type, $field_instance, $entity);
    }

    // If no valid source values were passed.
    if (empty($source_field_values)) {
      return array();
    }

    // Determine how we deal with deltas (multi-value fields)
    if (empty($field_instance['widget']['settings']['delta_handling'])) {
      $delta_handling = 'default';
    }
    else {
      $delta_handling = $field_instance['widget']['settings']['delta_handling'];
    }

    // Check to see if we should be concatenating
    if ($delta_handling == 'c_to_s' || $delta_handling == 'c_to_m') {
      $source_field_values = geocoder_field_widget_get_field_concat($source_field_values);
    }

    // Allow other modules to alter values before we geocode them.
    drupal_alter('geocoder_geocode_values', $source_field_values, $field_info, $field_instance);
    if (is_array($source_field_values) && count($source_field_values)) {

      // Geocode geometries.
      $geometries = array();
      foreach ($source_field_values as $delta => $item) {
        if (in_array($field_info['type'], array(
          'file',
          'image',
        ))) {
          $file = file_load($item['fid']);
          $item['value'] = drupal_realpath($file->uri);
        }
        if ($addressCollection = geocoder($geocoder_handlers, $item['value'])) {
          $geometry = \Drupal\geocoder\Geocoder::getPlugin('Dumper', 'geometry')
            ->dump($addressCollection
            ->first());
          if ($geometry instanceof \Geometry) {
            $geometries[] = $geometry;
          }
        }
      }
      if (empty($geometries)) {

        // This field has no data, so set the field to an empty array in
        // order to delete its saved data.
        return array();
      }
      else {

        // Resolve multiple-values - get back values from our delta-resolver
        $values = geocoder_field_widget_resolve_deltas($geometries, $delta_handling, $target_info);

        // Set the values - geofields do not support languages
        return array(
          LANGUAGE_NONE => $values,
        );
      }
    }
  }
  return array();
}