You are here

filter_harmonizer_for_geofield.inc in Views Filter Harmonizer 1.0.x

Same filename and directory in other branches
  1. 8 includes/filter_harmonizer_for_geofield.inc

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.inc
View 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;
    }
  }
}