/** * Process form. * * @param CRM_Contact_BAO_Query $query * @param array $values * * @return null * @throws Exception */ public static function process(&$query, &$values) { list($name, $op, $distance, $grouping, $wildcard) = $values; // also get values array for all address related info $proximityVars = array('street_address' => 1, 'city' => 1, 'postal_code' => 1, 'state_province_id' => 0, 'country_id' => 0, 'state_province' => 0, 'country' => 0, 'distance_unit' => 0); $proximityAddress = array(); $qill = array(); foreach ($proximityVars as $var => $recordQill) { $proximityValues = $query->getWhereValues("prox_{$var}", $grouping); if (!empty($proximityValues) && !empty($proximityValues[2])) { $proximityAddress[$var] = $proximityValues[2]; if ($recordQill) { $qill[] = $proximityValues[2]; } } } if (empty($proximityAddress)) { return NULL; } if (isset($proximityAddress['state_province_id'])) { $proximityAddress['state_province'] = CRM_Core_PseudoConstant::stateProvince($proximityAddress['state_province_id']); $qill[] = $proximityAddress['state_province']; } $config = CRM_Core_Config::singleton(); if (!isset($proximityAddress['country_id'])) { // get it from state if state is present if (isset($proximityAddress['state_province_id'])) { $proximityAddress['country_id'] = CRM_Core_PseudoConstant::countryIDForStateID($proximityAddress['state_province_id']); } elseif (isset($config->defaultContactCountry)) { $proximityAddress['country_id'] = $config->defaultContactCountry; } } if (!empty($proximityAddress['country_id'])) { $proximityAddress['country'] = CRM_Core_PseudoConstant::country($proximityAddress['country_id']); $qill[] = $proximityAddress['country']; } if (isset($proximityAddress['distance_unit']) && $proximityAddress['distance_unit'] == 'miles') { $qillUnits = " {$distance} " . ts('miles'); $distance = $distance * 1609.344; } else { $qillUnits = " {$distance} " . ts('km'); $distance = $distance * 1000.0; } $qill = ts('Proximity search to a distance of %1 from %2', array(1 => $qillUnits, 2 => implode(', ', $qill))); $fnName = isset($config->geocodeMethod) ? $config->geocodeMethod : NULL; if (empty($fnName)) { CRM_Core_Error::fatal(ts('Proximity searching requires you to set a valid geocoding provider')); } $query->_tables['civicrm_address'] = $query->_whereTables['civicrm_address'] = 1; require_once str_replace('_', DIRECTORY_SEPARATOR, $fnName) . '.php'; $fnName::format($proximityAddress); if (!is_numeric(CRM_Utils_Array::value('geo_code_1', $proximityAddress)) || !is_numeric(CRM_Utils_Array::value('geo_code_2', $proximityAddress))) { // we are setting the where clause to 0 here, so we wont return anything $qill .= ': ' . ts('We could not geocode the destination address.'); $query->_qill[$grouping][] = $qill; $query->_where[$grouping][] = ' (0) '; return NULL; } $query->_qill[$grouping][] = $qill; $query->_where[$grouping][] = self::where($proximityAddress['geo_code_1'], $proximityAddress['geo_code_2'], $distance); return NULL; }