Всем привет, делаю сайт, для примера кафешки в области. Когда человек заходин на сайт, мне нужно показывать те которые будут максимально близко к юзеру. Может кто-то делал подобное ?
Привет! Попробую кратко.
Если более точное расположение, то нужно через браузер спросить у пользователя разрешение на определение его местоположения (смотреть в сторону navigator.geolocation). При этом сразу не покажет - только после одобрения.
Второй вариант - не всегда точный. Использовать сторонний сервер (сервис) для определения местоположения по ip (пару-тройку лет назад были даже бесплатные).
Полученные координаты записать в сессию.
В ноде "кафешки" должны быть координаты. Потом можно руками написать вывод или, если используется модуль Geolocation, вывести вьюхой используя Proximity в сортировке, подставляя сохраненные значения (я подставлял в hook_views_query_alter).
Сам не пробовал так делать, но модуль Views Extras (Session/Cookie/Token Support) умеет использовать session variables в фильтрах view, так что можно попробовать обойтись без программирования на сервере.
Комментарии
Привет! Попробую кратко.
Если более точное расположение, то нужно через браузер спросить у пользователя разрешение на определение его местоположения (смотреть в сторону navigator.geolocation). При этом сразу не покажет - только после одобрения.
Второй вариант - не всегда точный. Использовать сторонний сервер (сервис) для определения местоположения по ip (пару-тройку лет назад были даже бесплатные).
Полученные координаты записать в сессию.
В ноде "кафешки" должны быть координаты. Потом можно руками написать вывод или, если используется модуль Geolocation, вывести вьюхой используя Proximity в сортировке, подставляя сохраненные значения (я подставлял в hook_views_query_alter).
Здравствуйте, благодарю. Реально пример как вы делали hook_views_query_alter ?
Давно делал, немного перепутал. В 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);
}
}
}
}?>
Сам не пробовал так делать, но модуль Views Extras (Session/Cookie/Token Support) умеет использовать session variables в фильтрах view, так что можно попробовать обойтись без программирования на сервере.
Хотя нет, тут же сортировка нужна, а не фильтр.