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();
}