Содержимое сайта в зависимости от гео данных

Главные вкладки

Аватар пользователя inder inder 25 февраля в 18:13

Всем привет, делаю сайт, для примера кафешки в области. Когда человек заходин на сайт, мне нужно показывать те которые будут максимально близко к юзеру. Может кто-то делал подобное ?

Комментарии

Аватар пользователя mnigma mnigma 25 февраля в 22:56

Привет! Попробую кратко.
Если более точное расположение, то нужно через браузер спросить у пользователя разрешение на определение его местоположения (смотреть в сторону navigator.geolocation). При этом сразу не покажет - только после одобрения.
Второй вариант - не всегда точный. Использовать сторонний сервер (сервис) для определения местоположения по ip (пару-тройку лет назад были даже бесплатные).

Полученные координаты записать в сессию.

В ноде "кафешки" должны быть координаты. Потом можно руками написать вывод или, если используется модуль Geolocation, вывести вьюхой используя Proximity в сортировке, подставляя сохраненные значения (я подставлял в hook_views_query_alter).

Аватар пользователя mnigma mnigma 28 февраля в 9:44

Давно делал, немного перепутал. В hook_views_query_alter не срабатывало наверно.

<?php hook_views_pre_view(Drupal\views\ViewExecutable $view$display_id, array &$args){
  if (
$view->id() == 'rybolovnye_mesta') {
    
$filters $view->display_handler->getOption('filters');
    if (isset(
$_GET['geo']) && $_GET['geo'] == 1) {
      
$lat $lon false;
      if (isset(
$_SESSION['fi']['ses_user.latitude'])) {
        
$lat $_SESSION['fi']['ses_user.latitude'];
        
$lon $_SESSION['fi']['ses_user.longitude'];
      }
      if (
$lat && $lon) {
        if (isset(
$filters['field_adres_na_karte_proximity']) && isset($filters['field_adres_na_karte_proximity']['location_input']['fixed_value:fixed_value']['settings'])) {
          if (isset(
$filters['field_adres_na_karte_proximity']['location_input']['fixed_value:fixed_value']['settings']['location_settings']['settings']['latitude'])
            && isset(
$filters['field_adres_na_karte_proximity']['location_input']['fixed_value:fixed_value']['settings']['location_settings']['settings']['longitude'])
          ) {
            
$filters['field_adres_na_karte_proximity']['location_input']['fixed_value:fixed_value']['settings']['location_settings']['settings']['latitude'] = $lat;
            
$filters['field_adres_na_karte_proximity']['location_input']['fixed_value:fixed_value']['settings']['location_settings']['settings']['longitude'] = $lon;
            
$view->display_handler->overrideOption('filters'$filters);
          }
        }
      } else {
        if (isset(
$filters['field_adres_na_karte_proximity'])) {
          unset(
$filters['field_adres_na_karte_proximity']);
          
$view->display_handler->overrideOption('filters'$filters);
        }
      }
    } else {
      if (isset(
$filters['field_adres_na_karte_proximity'])) {
        unset(
$filters['field_adres_na_karte_proximity']);
        
$view->display_handler->overrideOption('filters'$filters);
      }
    }
  }
}
?>