filter_harmonizer_for_geofield.inc in Views Filter Harmonizer 8
Same filename and directory in other branches
filter_harmonizer_for_geofield.inc
Implements the hooks declared in filter_harmonizer.api.php on behalf of the Geofield module.
File
includes/filter_harmonizer_for_geofield.incView source
<?php
/**
* @file
* filter_harmonizer_for_geofield.inc
*
* Implements the hooks declared in filter_harmonizer.api.php on behalf of the
* Geofield module.
*/
use Drupal\views\Plugin\views\filter\FilterPluginBase;
use Drupal\geofield\Plugin\views\filter\GeofieldProximityFilter;
use Drupal\geofield\Plugin\views\argument\GeofieldProximityArgument;
/**
* Implements hook_filter_harmonizer_is_empty().
*
* Sets is_empty based on whether the supplied filter is considered "empty"
* for a Geofield (Proximity) regular filter.
*/
function geofield_filter_harmonizer_is_empty(&$is_empty, FilterPluginBase $filter) {
if ($filter instanceof GeofieldProximityFilter) {
$v = $filter->value;
$is_empty = !is_array($v) || !isset($v['value']) || $v['value'] === '' || empty($v['source_configuration']['origin']) || !isset($v['source_configuration']['origin']['lat']) || $v['source_configuration']['origin']['lat'] === '';
}
}
/**
* Implements hook_filter_harmonizer_stringify_regular_filter().
*/
function geofield_filter_harmonizer_stringify_regular_filter(FilterPluginBase $regular_filter) {
if ($regular_filter instanceof GeofieldProximityFilter) {
$origin = $regular_filter->value['source_configuration']['origin'];
$lat = $origin['lat'];
$lon = $origin['lon'];
$op = $regular_filter->operator;
$dist = $regular_filter->value['value'];
switch ($regular_filter->options['units']) {
case 'GEOFIELD_METERS':
$unit = 'm';
break;
case 'GEOFIELD_MILES':
$unit = 'mi';
break;
case 'GEOFIELD_NAUTICAL_MILES':
$unit = 'nmi';
break;
case 'GEOFIELD_YARDS':
$unit = 'yd';
break;
case 'GEOFIELD_FEET':
$unit = 'ft';
break;
default:
$unit = 'km';
}
return "{$lat},{$lon}{$op}{$dist}{$unit}";
}
}
/**
* Implements hook_filter_harmonizer_formalize_contextual_arg().
*
* Returns contextual arguments as an array suitable for populating a Geofield
* Proximity (exposed) regular filter.
*/
function geofield_filter_harmonizer_formalize_contextual_arg($contextual_filter, FilterPluginBase $regular_filter) {
if ($contextual_filter instanceof GeofieldProximityArgument) {
if ($values = $contextual_filter
->getParsedReferenceLocation()) {
if (empty($values['units'])) {
$values['units'] = "GEOFIELD_KILOMETERS";
}
$values['value'] = $values['distance'];
$values['origin']['lat'] = $values['lat'];
$values['origin']['lon'] = $values['lon'];
unset($values['distance'], $values['lat'], $values['lon']);
if ($regular_filter instanceof GeofieldProximityFilter) {
$regular_filter->operator = $values['operator'];
$regular_filter->options['units'] = $values['units'];
}
return $values;
}
}
}